From 13cf8679db6fcdf026412c4aea563a88f2758cdb Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sun, 9 Dec 2012 12:02:49 +0000 Subject: [PATCH] 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)