Added support for COLLATE to index keys
This commit is contained in:
parent
4bcb7641c9
commit
13cf8679db
@ -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_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops);
|
||||||
CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC);
|
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_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_idx1'::regclass::oid, 'issue3'::regclass::oid);
|
||||||
get_order_by
|
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
|
col1 NULLS FIRST, col2 DESC USING ~<~ NULLS LAST
|
||||||
(1 row)
|
(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)
|
||||||
|
|
||||||
|
@ -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_idx2 ON issue3 (col1 DESC, col2 text_pattern_ops);
|
||||||
CREATE UNIQUE INDEX issue3_idx3 ON issue3 (col1 DESC, col2 DESC);
|
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_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_idx1'::regclass::oid, 'issue3'::regclass::oid);
|
||||||
SELECT repack.get_order_by('issue3_idx2'::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_idx3'::regclass::oid, 'issue3'::regclass::oid);
|
||||||
SELECT repack.get_order_by('issue3_idx4'::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);
|
||||||
|
16
lib/repack.c
16
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.
|
* definition column.
|
||||||
* Returned values point to token. \0's are inserted to separate parsed parts.
|
* Returned values point to token. \0's are inserted to separate parsed parts.
|
||||||
*/
|
*/
|
||||||
static void
|
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;
|
char *pos;
|
||||||
|
|
||||||
/* easier to walk backwards than to parse quotes and escapes... */
|
/* 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;
|
*desc = pos + 1;
|
||||||
*pos = '\0';
|
*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 *opcname;
|
||||||
char *coldesc = NULL;
|
char *coldesc = NULL;
|
||||||
char *colnulls = NULL;
|
char *colnulls = NULL;
|
||||||
|
char *colcollate = NULL;
|
||||||
|
|
||||||
token = next;
|
token = next;
|
||||||
while (isspace((unsigned char) *token))
|
while (isspace((unsigned char) *token))
|
||||||
token++;
|
token++;
|
||||||
next = skip_until(index, next, ',');
|
next = skip_until(index, next, ',');
|
||||||
parse_desc_nulls(token, &coldesc, &colnulls);
|
parse_indexdef_col(token, &coldesc, &colnulls, &colcollate);
|
||||||
opcname = skip_until(index, token, ' ');
|
opcname = skip_until(index, token, ' ');
|
||||||
appendStringInfoString(&str, token);
|
appendStringInfoString(&str, token);
|
||||||
|
if (colcollate)
|
||||||
|
appendStringInfo(&str, " %s", colcollate);
|
||||||
if (coldesc)
|
if (coldesc)
|
||||||
appendStringInfo(&str, " %s", coldesc);
|
appendStringInfo(&str, " %s", coldesc);
|
||||||
if (opcname)
|
if (opcname)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user