From a47686a7eed6e8a416b51ae5b883e3085dab14f9 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sun, 9 Dec 2012 01:11:39 +0000 Subject: [PATCH 1/4] Added support for DESC and NULLS FIRST/LAST to index keys Fixes issue #3 --- bin/expected/repack.out | 32 ++++++++++++++++++++++++++++++ bin/sql/repack.sql | 14 ++++++++++++++ lib/repack.c | 43 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/bin/expected/repack.out b/bin/expected/repack.out index 3a44f3a..25e15b0 100644 --- a/bin/expected/repack.out +++ b/bin/expected/repack.out @@ -314,3 +314,35 @@ ERROR: relation "tbl_uk" must have a primary key or not-null unique keys \! pg_repack --dbname=contrib_regression --no-order --table=tbl_nn_puk ERROR: relation "tbl_nn_puk" must have a primary key or not-null unique keys -- => ERROR +-- +-- pg_repack issue #3 +-- +CREATE TABLE issue3 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC); +CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); +CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); +CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); +SELECT repack.get_index_keys('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); + get_index_keys +----------------- + col1, col2 DESC +(1 row) + +SELECT repack.get_index_keys('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); + get_index_keys +--------------------------- + col1 DESC, col2 USING ~<~ +(1 row) + +SELECT repack.get_index_keys('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); + get_index_keys +---------------------- + col1 DESC, col2 DESC +(1 row) + +SELECT repack.get_index_keys('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); + get_index_keys +-------------------------------------------------- + col1 NULLS FIRST, col2 DESC USING ~<~ NULLS LAST +(1 row) + diff --git a/bin/sql/repack.sql b/bin/sql/repack.sql index 9d385dc..1446a9a 100644 --- a/bin/sql/repack.sql +++ b/bin/sql/repack.sql @@ -187,3 +187,17 @@ CREATE UNIQUE INDEX tbl_nn_puk_pcol1_idx ON tbl_nn_puk(col1) WHERE col1 < 10; -- => OK \! pg_repack --dbname=contrib_regression --no-order --table=tbl_nn_puk -- => ERROR + +-- +-- pg_repack issue #3 +-- +CREATE TABLE issue3 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC); +CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); +CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); +CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); + +SELECT repack.get_index_keys('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_index_keys('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_index_keys('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_index_keys('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); diff --git a/lib/repack.c b/lib/repack.c index 21aa538..72bf81d 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -472,6 +472,36 @@ parse_indexdef(IndexDef *stmt, Oid index, Oid table) stmt->options = sql; } +/* + * Parse the trailing ... [ DESC ] [ NULLS { FIRST | LAST } ] from an index + * definition column. + * Returned values point to token. \0's are inserted to separate parsed parts. + */ +static void +parse_desc_nulls(char *token, char **desc, char **nulls) +{ +#if PG_VERSION_NUM >= 80300 + char *pos; + + /* easier to walk backwards than to parse quotes and escapes... */ + if (NULL != (pos = strstr(token, " NULLS FIRST"))) + { + *nulls = pos + 1; + *pos = '\0'; + } + else if (NULL != (pos = strstr(token, " NULLS LAST"))) + { + *nulls = pos + 1; + *pos = '\0'; + } + if (NULL != (pos = strstr(token, " DESC"))) + { + *desc = pos + 1; + *pos = '\0'; + } +#endif +} + /** * @fn Datum repack_get_index_keys(PG_FUNCTION_ARGS) * @brief Get key definition of the index. @@ -514,12 +544,18 @@ repack_get_index_keys(PG_FUNCTION_ARGS) for (nattr = 0, next = stmt.columns; next; nattr++) { char *opcname; + char *coldesc = NULL; + char *colnulls = NULL; token = next; while (isspace((unsigned char) *token)) token++; next = skip_until(index, next, ','); + parse_desc_nulls(token, &coldesc, &colnulls); opcname = skip_until(index, token, ' '); + appendStringInfoString(&str, token); + if (coldesc) + appendStringInfo(&str, " %s", coldesc); if (opcname) { /* lookup default operator name from operator class */ @@ -556,12 +592,11 @@ repack_get_index_keys(PG_FUNCTION_ARGS) elog(ERROR, "missing operator %d(%u,%u) in opfamily %u", strategy, opcintype, opcintype, opfamily); - opcname[-1] = '\0'; - appendStringInfo(&str, "%s USING %s", token, get_opname(oprid)); + appendStringInfo(&str, " USING %s", get_opname(oprid)); } - else - appendStringInfoString(&str, token); + if (colnulls) + appendStringInfo(&str, " %s", colnulls); if (next) appendStringInfoString(&str, ", "); } From 4bcb7641c95dd5e85b90b496406460b79bc2345c Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sun, 9 Dec 2012 11:35:52 +0000 Subject: [PATCH 2/4] Function get_index_keys() renamed to get_order_by() It was a FIXME item in the source. Reasonably so. --- bin/expected/repack.out | 16 ++++++++-------- bin/sql/repack.sql | 8 ++++---- lib/pg_repack.sql.in | 6 +++--- lib/repack.c | 13 +++++-------- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/bin/expected/repack.out b/bin/expected/repack.out index 25e15b0..9dfb4eb 100644 --- a/bin/expected/repack.out +++ b/bin/expected/repack.out @@ -322,26 +322,26 @@ CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC); CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); -SELECT repack.get_index_keys('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); - get_index_keys +SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); + get_order_by ----------------- col1, col2 DESC (1 row) -SELECT repack.get_index_keys('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); - get_index_keys +SELECT repack.get_order_by('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); + get_order_by --------------------------- col1 DESC, col2 USING ~<~ (1 row) -SELECT repack.get_index_keys('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); - get_index_keys +SELECT repack.get_order_by('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); + get_order_by ---------------------- col1 DESC, col2 DESC (1 row) -SELECT repack.get_index_keys('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); - get_index_keys +SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); + get_order_by -------------------------------------------------- col1 NULLS FIRST, col2 DESC USING ~<~ NULLS LAST (1 row) diff --git a/bin/sql/repack.sql b/bin/sql/repack.sql index 1446a9a..2268c8b 100644 --- a/bin/sql/repack.sql +++ b/bin/sql/repack.sql @@ -197,7 +197,7 @@ CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); -SELECT repack.get_index_keys('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); -SELECT repack.get_index_keys('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); -SELECT repack.get_index_keys('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); -SELECT repack.get_index_keys('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_order_by('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_order_by('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); diff --git a/lib/pg_repack.sql.in b/lib/pg_repack.sql.in index 3f78d19..1767938 100644 --- a/lib/pg_repack.sql.in +++ b/lib/pg_repack.sql.in @@ -44,8 +44,8 @@ $$ $$ LANGUAGE sql STABLE STRICT; -CREATE FUNCTION repack.get_index_keys(oid, oid) RETURNS text AS -'MODULE_PATHNAME', 'repack_get_index_keys' +CREATE FUNCTION repack.get_order_by(oid, oid) RETURNS text AS +'MODULE_PATHNAME', 'repack_get_order_by' LANGUAGE C STABLE STRICT; CREATE FUNCTION repack.get_create_index_type(oid, name) RETURNS text AS @@ -183,7 +183,7 @@ CREATE VIEW repack.tables AS repack.get_drop_columns(R.oid, 'repack.table_' || R.oid) AS drop_columns, 'DELETE FROM repack.log_' || R.oid AS delete_log, 'LOCK TABLE ' || repack.oid2text(R.oid) || ' IN ACCESS EXCLUSIVE MODE' AS lock_table, - repack.get_index_keys(CK.indexrelid, R.oid) AS ckey, + repack.get_order_by(CK.indexrelid, R.oid) AS ckey, 'SELECT * FROM repack.log_' || R.oid || ' ORDER BY id LIMIT $1' AS sql_peek, 'INSERT INTO repack.table_' || R.oid || ' VALUES ($1.*)' AS sql_insert, 'DELETE FROM repack.table_' || R.oid || ' WHERE ' || repack.get_compare_pkey(PK.indexrelid, '$1') AS sql_delete, diff --git a/lib/repack.c b/lib/repack.c index 72bf81d..bd4e9e0 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -41,7 +41,7 @@ PG_MODULE_MAGIC; extern Datum PGUT_EXPORT repack_version(PG_FUNCTION_ARGS); extern Datum PGUT_EXPORT repack_trigger(PG_FUNCTION_ARGS); extern Datum PGUT_EXPORT repack_apply(PG_FUNCTION_ARGS); -extern Datum PGUT_EXPORT repack_get_index_keys(PG_FUNCTION_ARGS); +extern Datum PGUT_EXPORT repack_get_order_by(PG_FUNCTION_ARGS); extern Datum PGUT_EXPORT repack_indexdef(PG_FUNCTION_ARGS); extern Datum PGUT_EXPORT repack_swap(PG_FUNCTION_ARGS); extern Datum PGUT_EXPORT repack_drop(PG_FUNCTION_ARGS); @@ -50,7 +50,7 @@ extern Datum PGUT_EXPORT repack_disable_autovacuum(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(repack_version); PG_FUNCTION_INFO_V1(repack_trigger); PG_FUNCTION_INFO_V1(repack_apply); -PG_FUNCTION_INFO_V1(repack_get_index_keys); +PG_FUNCTION_INFO_V1(repack_get_order_by); PG_FUNCTION_INFO_V1(repack_indexdef); PG_FUNCTION_INFO_V1(repack_swap); PG_FUNCTION_INFO_V1(repack_drop); @@ -503,20 +503,17 @@ parse_desc_nulls(char *token, char **desc, char **nulls) } /** - * @fn Datum repack_get_index_keys(PG_FUNCTION_ARGS) + * @fn Datum repack_get_order_by(PG_FUNCTION_ARGS) * @brief Get key definition of the index. * - * repack_get_index_keys(index, table) + * repack_get_order_by(index, table) * * @param index Oid of target index. * @param table Oid of table of the index. * @retval Create index DDL for temp table. - * - * FIXME: this function is named get_index_keys, but actually returns - * an expression for ORDER BY clause. get_order_by() might be a better name. */ Datum -repack_get_index_keys(PG_FUNCTION_ARGS) +repack_get_order_by(PG_FUNCTION_ARGS) { Oid index = PG_GETARG_OID(0); Oid table = PG_GETARG_OID(1); From 13cf8679db6fcdf026412c4aea563a88f2758cdb Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sun, 9 Dec 2012 12:02:49 +0000 Subject: [PATCH 3/4] Added support for COLLATE to index keys --- bin/expected/repack.out | 7 +++++++ bin/sql/repack.sql | 2 ++ lib/repack.c | 16 +++++++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/bin/expected/repack.out b/bin/expected/repack.out index 9dfb4eb..f1bc1ad 100644 --- a/bin/expected/repack.out +++ b/bin/expected/repack.out @@ -322,6 +322,7 @@ CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC); CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); +CREATE UNIQUE INDEX issue3_idx5 ON issue3 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC); SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); get_order_by ----------------- @@ -346,3 +347,9 @@ SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid col1 NULLS FIRST, col2 DESC USING ~<~ NULLS LAST (1 row) +SELECT repack.get_order_by('issue3_idx5'::regclass::oid, 'issue3'::regclass::oid); + get_order_by +-------------------------------------- + col1 DESC, col2 COLLATE "POSIX" DESC +(1 row) + diff --git a/bin/sql/repack.sql b/bin/sql/repack.sql index 2268c8b..fc05411 100644 --- a/bin/sql/repack.sql +++ b/bin/sql/repack.sql @@ -196,8 +196,10 @@ CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC); CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); +CREATE UNIQUE INDEX issue3_idx5 ON issue3 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC); SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); SELECT repack.get_order_by('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); SELECT repack.get_order_by('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); +SELECT repack.get_order_by('issue3_idx5'::regclass::oid, 'issue3'::regclass::oid); diff --git a/lib/repack.c b/lib/repack.c index bd4e9e0..1bfec43 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -473,14 +473,13 @@ parse_indexdef(IndexDef *stmt, Oid index, Oid table) } /* - * Parse the trailing ... [ DESC ] [ NULLS { FIRST | LAST } ] from an index + * Parse the trailing ... [ COLLATE X ] [ DESC ] [ NULLS { FIRST | LAST } ] from an index * definition column. * Returned values point to token. \0's are inserted to separate parsed parts. */ static void -parse_desc_nulls(char *token, char **desc, char **nulls) +parse_indexdef_col(char *token, char **desc, char **nulls, char **collate) { -#if PG_VERSION_NUM >= 80300 char *pos; /* easier to walk backwards than to parse quotes and escapes... */ @@ -499,7 +498,11 @@ parse_desc_nulls(char *token, char **desc, char **nulls) *desc = pos + 1; *pos = '\0'; } -#endif + if (NULL != (pos = strstr(token, " COLLATE "))) + { + *collate = pos + 1; + *pos = '\0'; + } } /** @@ -543,14 +546,17 @@ repack_get_order_by(PG_FUNCTION_ARGS) char *opcname; char *coldesc = NULL; char *colnulls = NULL; + char *colcollate = NULL; token = next; while (isspace((unsigned char) *token)) token++; next = skip_until(index, next, ','); - parse_desc_nulls(token, &coldesc, &colnulls); + parse_indexdef_col(token, &coldesc, &colnulls, &colcollate); opcname = skip_until(index, token, ' '); appendStringInfoString(&str, token); + if (colcollate) + appendStringInfo(&str, " %s", colcollate); if (coldesc) appendStringInfo(&str, " %s", coldesc); if (opcname) From fcd3f7eaaea38efa3267d6452966d98e29b45128 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sun, 9 Dec 2012 12:11:10 +0000 Subject: [PATCH 4/4] Added pg_repack runs to check the get_order_by definitions work --- bin/expected/repack.out | 31 ++++++++++++++++++++----------- bin/sql/repack.sql | 34 +++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/bin/expected/repack.out b/bin/expected/repack.out index f1bc1ad..c0b19d2 100644 --- a/bin/expected/repack.out +++ b/bin/expected/repack.out @@ -317,39 +317,48 @@ ERROR: relation "tbl_nn_puk" must have a primary key or not-null unique keys -- -- pg_repack issue #3 -- -CREATE TABLE issue3 (col1 int NOT NULL, col2 text NOT NULL); -CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC); -CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); -CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); -CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); -CREATE UNIQUE INDEX issue3_idx5 ON issue3 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC); -SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); +CREATE TABLE issue3_1 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_1_idx ON issue3_1 (col1, col2 DESC); +SELECT repack.get_order_by('issue3_1_idx'::regclass::oid, 'issue3_1'::regclass::oid); get_order_by ----------------- col1, col2 DESC (1 row) -SELECT repack.get_order_by('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_1 +CREATE TABLE issue3_2 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_2_idx ON issue3_2 (col1 DESC, col2 text_pattern_ops); +SELECT repack.get_order_by('issue3_2_idx'::regclass::oid, 'issue3_2'::regclass::oid); get_order_by --------------------------- col1 DESC, col2 USING ~<~ (1 row) -SELECT repack.get_order_by('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_2 +CREATE TABLE issue3_3 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_3_idx ON issue3_3 (col1 DESC, col2 DESC); +SELECT repack.get_order_by('issue3_3_idx'::regclass::oid, 'issue3_3'::regclass::oid); get_order_by ---------------------- col1 DESC, col2 DESC (1 row) -SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_3 +CREATE TABLE issue3_4 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_4_idx ON issue3_4 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); +SELECT repack.get_order_by('issue3_4_idx'::regclass::oid, 'issue3_4'::regclass::oid); get_order_by -------------------------------------------------- col1 NULLS FIRST, col2 DESC USING ~<~ NULLS LAST (1 row) -SELECT repack.get_order_by('issue3_idx5'::regclass::oid, 'issue3'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_4 +CREATE TABLE issue3_5 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_5_idx ON issue3_5 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC); +SELECT repack.get_order_by('issue3_5_idx'::regclass::oid, 'issue3_5'::regclass::oid); get_order_by -------------------------------------- col1 DESC, col2 COLLATE "POSIX" DESC (1 row) +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_5 diff --git a/bin/sql/repack.sql b/bin/sql/repack.sql index fc05411..d1a0641 100644 --- a/bin/sql/repack.sql +++ b/bin/sql/repack.sql @@ -191,15 +191,27 @@ CREATE UNIQUE INDEX tbl_nn_puk_pcol1_idx ON tbl_nn_puk(col1) WHERE col1 < 10; -- -- pg_repack issue #3 -- -CREATE TABLE issue3 (col1 int NOT NULL, col2 text NOT NULL); -CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC); -CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops); -CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC); -CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); -CREATE UNIQUE INDEX issue3_idx5 ON issue3 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC); +CREATE TABLE issue3_1 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_1_idx ON issue3_1 (col1, col2 DESC); +SELECT repack.get_order_by('issue3_1_idx'::regclass::oid, 'issue3_1'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_1 -SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid); -SELECT repack.get_order_by('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid); -SELECT repack.get_order_by('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid); -SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid); -SELECT repack.get_order_by('issue3_idx5'::regclass::oid, 'issue3'::regclass::oid); +CREATE TABLE issue3_2 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_2_idx ON issue3_2 (col1 DESC, col2 text_pattern_ops); +SELECT repack.get_order_by('issue3_2_idx'::regclass::oid, 'issue3_2'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_2 + +CREATE TABLE issue3_3 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_3_idx ON issue3_3 (col1 DESC, col2 DESC); +SELECT repack.get_order_by('issue3_3_idx'::regclass::oid, 'issue3_3'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_3 + +CREATE TABLE issue3_4 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_4_idx ON issue3_4 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST); +SELECT repack.get_order_by('issue3_4_idx'::regclass::oid, 'issue3_4'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_4 + +CREATE TABLE issue3_5 (col1 int NOT NULL, col2 text NOT NULL); +CREATE UNIQUE INDEX issue3_5_idx ON issue3_5 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC); +SELECT repack.get_order_by('issue3_5_idx'::regclass::oid, 'issue3_5'::regclass::oid); +\! pg_repack --dbname=contrib_regression --no-order --table=issue3_5