commit b056c0cc38a9460c083741bc021a9b5eddee22f1 Author: Shigeru Hanada Date: Mon Dec 12 18:14:26 2011 +0900 Fix psql to show stats target for foreign tables too. Regression tests are also added for this change, and one simple bug is detected and fixed. diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 5db476b..6dc736d 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -2917,7 +2917,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, break; case AT_SetOptions: /* ALTER COLUMN SET ( options ) */ case AT_ResetOptions: /* ALTER COLUMN RESET ( options ) */ - ATSimplePermissions(rel, ATT_TABLE | ATT_INDEX); + ATSimplePermissions(rel, ATT_TABLE | ATT_INDEX | ATT_FOREIGN_TABLE); ATPrepSetOptions(rel, cmd->name, cmd->def, lockmode); /* This command never recurses */ pass = AT_PASS_MISC; diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index dcafdd2..802abf2 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -1099,7 +1099,7 @@ describeOneTableDetails(const char *schemaname, bool printTableInitialized = false; int i; char *view_def = NULL; - char *headers[6]; + char *headers[7]; char **seq_values = NULL; char **modifiers = NULL; char **ptr; @@ -1390,7 +1390,7 @@ describeOneTableDetails(const char *schemaname, if (verbose) { headers[cols++] = gettext_noop("Storage"); - if (tableinfo.relkind == 'r') + if (tableinfo.relkind == 'r' || tableinfo.relkind == 'f') headers[cols++] = gettext_noop("Stats target"); /* Column comments, if the relkind supports this feature. */ if (tableinfo.relkind == 'r' || tableinfo.relkind == 'v' || @@ -1493,7 +1493,7 @@ describeOneTableDetails(const char *schemaname, false, false); /* Statistics target, if the relkind supports this feature */ - if (tableinfo.relkind == 'r') + if (tableinfo.relkind == 'r' || tableinfo.relkind == 'f') { printTableAddCell(&cont, PQgetvalue(res, i, firstvcol + 1), false, false); diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index 122e285..4a16238 100644 --- a/src/test/regress/expected/foreign_data.out +++ b/src/test/regress/expected/foreign_data.out @@ -678,12 +678,12 @@ CREATE FOREIGN TABLE ft1 ( COMMENT ON FOREIGN TABLE ft1 IS 'ft1'; COMMENT ON COLUMN ft1.c1 IS 'ft1.c1'; \d+ ft1 - Foreign table "public.ft1" - Column | Type | Modifiers | FDW Options | Storage | Description ---------+---------+-----------+--------------------------------+----------+------------- - c1 | integer | not null | ("param 1" 'val1') | plain | ft1.c1 - c2 | text | | (param2 'val2', param3 'val3') | extended | - c3 | date | | | plain | + Foreign table "public.ft1" + Column | Type | Modifiers | FDW Options | Storage | Stats target | Description +--------+---------+-----------+--------------------------------+----------+--------------+------------- + c1 | integer | not null | ("param 1" 'val1') | plain | | ft1.c1 + c2 | text | | (param2 'val2', param3 'val3') | extended | | + c3 | date | | | plain | | Server: s0 FDW Options: (delimiter ',', quote '"', "be quoted" 'value') Has OIDs: no @@ -729,19 +729,24 @@ ERROR: cannot alter system column "xmin" ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET STATISTICS 10000; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET (n_distinct = 100); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET (n_distinct_inherited = 100); -- ERROR +ERROR: cannot set "n_distinct_inherited" on foreign tables +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STATISTICS -1; \d+ ft1 - Foreign table "public.ft1" - Column | Type | Modifiers | FDW Options | Storage | Description ---------+---------+-----------+--------------------------------+----------+------------- - c1 | integer | not null | ("param 1" 'val1') | plain | - c2 | text | | (param2 'val2', param3 'val3') | extended | - c3 | date | | | plain | - c4 | integer | | | plain | - c6 | integer | not null | | plain | - c7 | integer | | (p1 'v1', p2 'v2') | plain | - c8 | text | | (p2 'V2') | extended | - c9 | integer | | | plain | - c10 | integer | | (p1 'v1') | plain | + Foreign table "public.ft1" + Column | Type | Modifiers | FDW Options | Storage | Stats target | Description +--------+---------+-----------+--------------------------------+----------+--------------+------------- + c1 | integer | not null | ("param 1" 'val1') | plain | 10000 | + c2 | text | | (param2 'val2', param3 'val3') | extended | | + c3 | date | | | plain | | + c4 | integer | | | plain | | + c6 | integer | not null | | plain | | + c7 | integer | | (p1 'v1', p2 'v2') | plain | | + c8 | text | | (p2 'V2') | extended | | + c9 | integer | | | plain | | + c10 | integer | | (p1 'v1') | plain | | Server: s0 FDW Options: (delimiter ',', quote '"', "be quoted" 'value') Has OIDs: no diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql index e99e707..5908ff3 100644 --- a/src/test/regress/sql/foreign_data.sql +++ b/src/test/regress/sql/foreign_data.sql @@ -306,6 +306,10 @@ ALTER FOREIGN TABLE ft1 ALTER COLUMN xmin OPTIONS (ADD p1 'v1'); -- ERROR ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET STATISTICS 10000; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET (n_distinct = 100); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET (n_distinct_inherited = 100); -- ERROR +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STATISTICS -1; \d+ ft1 -- can't change the column type if it's used elsewhere CREATE TABLE use_ft1_column_type (x ft1);