Fixed tablespace assignment in index with WITH clause

Reported by Beena Emerson.
This commit is contained in:
Daniele Varrazzo 2013-05-02 23:32:30 +01:00
parent f886e0dba6
commit cc2abf4b25
3 changed files with 23 additions and 2 deletions

View File

@ -13,6 +13,7 @@ SELECT spcname FROM pg_tablespace WHERE spcname = 'testts';
-- If the query above failed you must create the 'testts' tablespace;
CREATE TABLE testts1 (id serial primary key, data text);
CREATE INDEX testts1_partial_idx on testts1 (id) where (id > 0);
CREATE INDEX testts1_with_idx on testts1 (id) with (fillfactor=80);
INSERT INTO testts1 (data) values ('a');
INSERT INTO testts1 (data) values ('b');
INSERT INTO testts1 (data) values ('c');
@ -71,7 +72,8 @@ ORDER BY relname;
testts1 | testts
testts1_partial_idx | testts
testts1_pkey | testts
(3 rows)
testts1_with_idx | testts
(4 rows)
-- can't specify --moveidx without --tablespace
\! pg_repack --dbname=contrib_regression --no-order --table=testts1 --moveidx

View File

@ -11,6 +11,7 @@ SELECT spcname FROM pg_tablespace WHERE spcname = 'testts';
CREATE TABLE testts1 (id serial primary key, data text);
CREATE INDEX testts1_partial_idx on testts1 (id) where (id > 0);
CREATE INDEX testts1_with_idx on testts1 (id) with (fillfactor=80);
INSERT INTO testts1 (data) values ('a');
INSERT INTO testts1 (data) values ('b');
INSERT INTO testts1 (data) values ('c');

View File

@ -346,6 +346,24 @@ skip_const(Oid index, char *sql, const char *arg1, const char *arg2)
return parse_error(index);
}
static char *
skip_until_const(Oid index, char *sql, const char *what)
{
char *pos;
if ((pos = strstr(sql, what)))
{
size_t len;
len = strlen(what);
pos[len] = '\0';
return pos + len + 1;
}
/* error */
return parse_error(index);
}
static char *
skip_ident(Oid index, char *sql)
{
@ -664,7 +682,7 @@ repack_indexdef(PG_FUNCTION_ARGS)
/* tablespace is to replace */
char *tmp, *limit;
limit = strchr(stmt.options, '\0');
tmp = skip_const(index, stmt.options, " TABLESPACE", NULL);
tmp = skip_until_const(index, stmt.options, " TABLESPACE");
appendStringInfoString(&str, stmt.options);
appendStringInfo(&str, " %s", NameStr(*tablespace));
tmp = skip_ident(index, tmp);