Skip to content

Commit 9d1fb11

Browse files
committed
Basic tab completion for partitioning.
Amit Langote Discussion: http://postgr.es/m/CA+TgmobYOj=A8GesiEs_V2Wq46-_w0+7MOwPiNWC+iuzJ-uWjA@mail.gmail.com
1 parent a315b96 commit 9d1fb11

File tree

1 file changed

+56
-1
lines changed

1 file changed

+56
-1
lines changed

src/bin/psql/tab-complete.c

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,21 @@ static const SchemaQuery Query_for_list_of_tables = {
463463
NULL
464464
};
465465

466+
static const SchemaQuery Query_for_list_of_partitioned_tables = {
467+
/* catname */
468+
"pg_catalog.pg_class c",
469+
/* selcondition */
470+
"c.relkind IN ('P')",
471+
/* viscondition */
472+
"pg_catalog.pg_table_is_visible(c.oid)",
473+
/* namespace */
474+
"c.relnamespace",
475+
/* result */
476+
"pg_catalog.quote_ident(c.relname)",
477+
/* qualresult */
478+
NULL
479+
};
480+
466481
static const SchemaQuery Query_for_list_of_constraints_with_schema = {
467482
/* catname */
468483
"pg_catalog.pg_constraint c",
@@ -913,6 +928,16 @@ static const SchemaQuery Query_for_list_of_matviews = {
913928
" SELECT 'DEFAULT' ) ss "\
914929
" WHERE pg_catalog.substring(name,1,%%d)='%%s'"
915930

931+
/* the silly-looking length condition is just to eat up the current word */
932+
#define Query_for_partition_of_table \
933+
"SELECT pg_catalog.quote_ident(c2.relname) "\
934+
" FROM pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i"\
935+
" WHERE c1.oid=i.inhparent and i.inhrelid=c2.oid"\
936+
" and (%d = pg_catalog.length('%s'))"\
937+
" and pg_catalog.quote_ident(c1.relname)='%s'"\
938+
" and pg_catalog.pg_table_is_visible(c2.oid)"\
939+
" and c2.relispartition = 'true'"
940+
916941
/*
917942
* This is a list of all "things" in Pgsql, which can show up after CREATE or
918943
* DROP; and there is also a query to get a list of them.
@@ -1742,7 +1767,8 @@ psql_completion(const char *text, int start, int end)
17421767
static const char *const list_ALTER2[] =
17431768
{"ADD", "ALTER", "CLUSTER ON", "DISABLE", "DROP", "ENABLE", "INHERIT",
17441769
"NO INHERIT", "RENAME", "RESET", "OWNER TO", "SET",
1745-
"VALIDATE CONSTRAINT", "REPLICA IDENTITY", NULL};
1770+
"VALIDATE CONSTRAINT", "REPLICA IDENTITY", "ATTACH PARTITION",
1771+
"DETACH PARTITION", NULL};
17461772

17471773
COMPLETE_WITH_LIST(list_ALTER2);
17481774
}
@@ -1923,6 +1949,26 @@ psql_completion(const char *text, int start, int end)
19231949
COMPLETE_WITH_LIST4("FULL", "NOTHING", "DEFAULT", "USING");
19241950
else if (Matches4("ALTER", "TABLE", MatchAny, "REPLICA"))
19251951
COMPLETE_WITH_CONST("IDENTITY");
1952+
/*
1953+
* If we have ALTER TABLE <foo> ATTACH PARTITION, provide a list of
1954+
* tables.
1955+
*/
1956+
else if (Matches5("ALTER", "TABLE", MatchAny, "ATTACH", "PARTITION"))
1957+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, "");
1958+
/* Limited completion support for partition bound specification */
1959+
else if (TailMatches3("ATTACH", "PARTITION", MatchAny))
1960+
COMPLETE_WITH_CONST("FOR VALUES");
1961+
else if (TailMatches2("FOR", "VALUES"))
1962+
COMPLETE_WITH_LIST2("FROM (", "IN (");
1963+
/*
1964+
* If we have ALTER TABLE <foo> DETACH PARTITION, provide a list of
1965+
* partitions of <foo>.
1966+
*/
1967+
else if (Matches5("ALTER", "TABLE", MatchAny, "DETACH", "PARTITION"))
1968+
{
1969+
completion_info_charp = prev3_wd;
1970+
COMPLETE_WITH_QUERY(Query_for_partition_of_table);
1971+
}
19261972

19271973
/* ALTER TABLESPACE <foo> with RENAME TO, OWNER TO, SET, RESET */
19281974
else if (Matches3("ALTER", "TABLESPACE", MatchAny))
@@ -2300,6 +2346,15 @@ psql_completion(const char *text, int start, int end)
23002346
/* Complete "CREATE UNLOGGED" with TABLE or MATVIEW */
23012347
else if (TailMatches2("CREATE", "UNLOGGED"))
23022348
COMPLETE_WITH_LIST2("TABLE", "MATERIALIZED VIEW");
2349+
/* Complete PARTITION BY with RANGE ( or LIST ( or ... */
2350+
else if (TailMatches2("PARTITION", "BY"))
2351+
COMPLETE_WITH_LIST2("RANGE (", "LIST (");
2352+
/* If we have xxx PARTITION OF, provide a list of partitioned tables */
2353+
else if (TailMatches2("PARTITION", "OF"))
2354+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables, "");
2355+
/* Limited completion support for partition bound specification */
2356+
else if (TailMatches3("PARTITION", "OF", MatchAny))
2357+
COMPLETE_WITH_CONST("FOR VALUES");
23032358

23042359
/* CREATE TABLESPACE */
23052360
else if (Matches3("CREATE", "TABLESPACE", MatchAny))

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy