Skip to content

Commit 13cf867

Browse files
committed
Added support for COLLATE to index keys
1 parent 4bcb764 commit 13cf867

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

bin/expected/repack.out

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC);
322322
CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops);
323323
CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC);
324324
CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST);
325+
CREATE UNIQUE INDEX issue3_idx5 ON issue3 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC);
325326
SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid);
326327
get_order_by
327328
-----------------
@@ -346,3 +347,9 @@ SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid
346347
col1 NULLS FIRST, col2 DESC USING ~<~ NULLS LAST
347348
(1 row)
348349

350+
SELECT repack.get_order_by('issue3_idx5'::regclass::oid, 'issue3'::regclass::oid);
351+
get_order_by
352+
--------------------------------------
353+
col1 DESC, col2 COLLATE "POSIX" DESC
354+
(1 row)
355+

bin/sql/repack.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,10 @@ CREATE UNIQUE INDEX issue3_idx1 ON issue3 (col1, col2 DESC);
196196
CREATE UNIQUE INDEX issue3_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops);
197197
CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC);
198198
CREATE UNIQUE INDEX issue3_idx4 ON issue3 (col1 NULLS FIRST, col2 text_pattern_ops DESC NULLS LAST);
199+
CREATE UNIQUE INDEX issue3_idx5 ON issue3 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC);
199200

200201
SELECT repack.get_order_by('issue3_idx1'::regclass::oid, 'issue3'::regclass::oid);
201202
SELECT repack.get_order_by('issue3_idx2'::regclass::oid, 'issue3'::regclass::oid);
202203
SELECT repack.get_order_by('issue3_idx3'::regclass::oid, 'issue3'::regclass::oid);
203204
SELECT repack.get_order_by('issue3_idx4'::regclass::oid, 'issue3'::regclass::oid);
205+
SELECT repack.get_order_by('issue3_idx5'::regclass::oid, 'issue3'::regclass::oid);

lib/repack.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -473,14 +473,13 @@ parse_indexdef(IndexDef *stmt, Oid index, Oid table)
473473
}
474474

475475
/*
476-
* Parse the trailing ... [ DESC ] [ NULLS { FIRST | LAST } ] from an index
476+
* Parse the trailing ... [ COLLATE X ] [ DESC ] [ NULLS { FIRST | LAST } ] from an index
477477
* definition column.
478478
* Returned values point to token. \0's are inserted to separate parsed parts.
479479
*/
480480
static void
481-
parse_desc_nulls(char *token, char **desc, char **nulls)
481+
parse_indexdef_col(char *token, char **desc, char **nulls, char **collate)
482482
{
483-
#if PG_VERSION_NUM >= 80300
484483
char *pos;
485484

486485
/* easier to walk backwards than to parse quotes and escapes... */
@@ -499,7 +498,11 @@ parse_desc_nulls(char *token, char **desc, char **nulls)
499498
*desc = pos + 1;
500499
*pos = '\0';
501500
}
502-
#endif
501+
if (NULL != (pos = strstr(token, " COLLATE ")))
502+
{
503+
*collate = pos + 1;
504+
*pos = '\0';
505+
}
503506
}
504507

505508
/**
@@ -543,14 +546,17 @@ repack_get_order_by(PG_FUNCTION_ARGS)
543546
char *opcname;
544547
char *coldesc = NULL;
545548
char *colnulls = NULL;
549+
char *colcollate = NULL;
546550

547551
token = next;
548552
while (isspace((unsigned char) *token))
549553
token++;
550554
next = skip_until(index, next, ',');
551-
parse_desc_nulls(token, &coldesc, &colnulls);
555+
parse_indexdef_col(token, &coldesc, &colnulls, &colcollate);
552556
opcname = skip_until(index, token, ' ');
553557
appendStringInfoString(&str, token);
558+
if (colcollate)
559+
appendStringInfo(&str, " %s", colcollate);
554560
if (coldesc)
555561
appendStringInfo(&str, " %s", coldesc);
556562
if (opcname)

0 commit comments

Comments
 (0)