Commit 577f0bdd authored by Robert Haas's avatar Robert Haas

psql: Tab completion for renaming enum values.

For ALTER TYPE .. RENAME, add "VALUE" to the list of possible
completions.  Complete ALTER TYPE .. RENAME VALUE with possible
enum values.  After that, complete with "TO".

Dagfinn Ilmari Mannsåker, reviewed by Artur Zakirov.
parent 9257f078
...@@ -202,6 +202,31 @@ do { \ ...@@ -202,6 +202,31 @@ do { \
matches = completion_matches(text, complete_from_query); \ matches = completion_matches(text, complete_from_query); \
} while (0) } while (0)
#define COMPLETE_WITH_ENUM_VALUE(type) \
do { \
char *_completion_schema; \
char *_completion_type; \
\
_completion_schema = strtokx(type, " \t\n\r", ".", "\"", 0, \
false, false, pset.encoding); \
(void) strtokx(NULL, " \t\n\r", ".", "\"", 0, \
false, false, pset.encoding); \
_completion_type = strtokx(NULL, " \t\n\r", ".", "\"", 0, \
false, false, pset.encoding); \
if (_completion_type == NULL)\
{ \
completion_charp = Query_for_list_of_enum_values; \
completion_info_charp = type; \
} \
else \
{ \
completion_charp = Query_for_list_of_enum_values_with_schema; \
completion_info_charp = _completion_type; \
completion_info_charp2 = _completion_schema; \
} \
matches = completion_matches(text, complete_from_query); \
} while (0)
#define COMPLETE_WITH_FUNCTION_ARG(function) \ #define COMPLETE_WITH_FUNCTION_ARG(function) \
do { \ do { \
char *_completion_schema; \ char *_completion_schema; \
...@@ -598,6 +623,26 @@ static const SchemaQuery Query_for_list_of_matviews = { ...@@ -598,6 +623,26 @@ static const SchemaQuery Query_for_list_of_matviews = {
" AND (pg_catalog.quote_ident(nspname)='%s' "\ " AND (pg_catalog.quote_ident(nspname)='%s' "\
" OR '\"' || nspname || '\"' ='%s') " " OR '\"' || nspname || '\"' ='%s') "
#define Query_for_list_of_enum_values \
"SELECT pg_catalog.quote_literal(enumlabel) "\
" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\
" WHERE t.oid = e.enumtypid "\
" AND substring(pg_catalog.quote_literal(enumlabel),1,%d)='%s' "\
" AND (pg_catalog.quote_ident(typname)='%s' "\
" OR '\"' || typname || '\"'='%s') "\
" AND pg_catalog.pg_type_is_visible(t.oid)"
#define Query_for_list_of_enum_values_with_schema \
"SELECT pg_catalog.quote_literal(enumlabel) "\
" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\
" WHERE t.oid = e.enumtypid "\
" AND n.oid = t.typnamespace "\
" AND substring(pg_catalog.quote_literal(enumlabel),1,%d)='%s' "\
" AND (pg_catalog.quote_ident(typname)='%s' "\
" OR '\"' || typname || '\"'='%s') "\
" AND (pg_catalog.quote_ident(nspname)='%s' "\
" OR '\"' || nspname || '\"' ='%s') "
#define Query_for_list_of_template_databases \ #define Query_for_list_of_template_databases \
"SELECT pg_catalog.quote_ident(d.datname) "\ "SELECT pg_catalog.quote_ident(d.datname) "\
" FROM pg_catalog.pg_database d "\ " FROM pg_catalog.pg_database d "\
...@@ -1872,11 +1917,10 @@ psql_completion(const char *text, int start, int end) ...@@ -1872,11 +1917,10 @@ psql_completion(const char *text, int start, int end)
COMPLETE_WITH_LIST2("ATTRIBUTE", "VALUE"); COMPLETE_WITH_LIST2("ATTRIBUTE", "VALUE");
/* ALTER TYPE <foo> RENAME */ /* ALTER TYPE <foo> RENAME */
else if (Matches4("ALTER", "TYPE", MatchAny, "RENAME")) else if (Matches4("ALTER", "TYPE", MatchAny, "RENAME"))
COMPLETE_WITH_LIST2("ATTRIBUTE", "TO"); COMPLETE_WITH_LIST3("ATTRIBUTE", "TO", "VALUE");
/* ALTER TYPE xxx RENAME ATTRIBUTE yyy */ /* ALTER TYPE xxx RENAME (ATTRIBUTE|VALUE) yyy */
else if (Matches6("ALTER", "TYPE", MatchAny, "RENAME", "ATTRIBUTE", MatchAny)) else if (Matches6("ALTER", "TYPE", MatchAny, "RENAME", "ATTRIBUTE|VALUE", MatchAny))
COMPLETE_WITH_CONST("TO"); COMPLETE_WITH_CONST("TO");
/* /*
* If we have ALTER TYPE <sth> ALTER/DROP/RENAME ATTRIBUTE, provide list * If we have ALTER TYPE <sth> ALTER/DROP/RENAME ATTRIBUTE, provide list
* of attributes * of attributes
...@@ -1896,6 +1940,12 @@ psql_completion(const char *text, int start, int end) ...@@ -1896,6 +1940,12 @@ psql_completion(const char *text, int start, int end)
else if (Matches5("ALTER", "GROUP", MatchAny, "ADD|DROP", "USER")) else if (Matches5("ALTER", "GROUP", MatchAny, "ADD|DROP", "USER"))
COMPLETE_WITH_QUERY(Query_for_list_of_roles); COMPLETE_WITH_QUERY(Query_for_list_of_roles);
/*
* If we have ALTER TYPE <sth> RENAME VALUE, provide list of enum values
*/
else if (Matches5("ALTER", "TYPE", MatchAny, "RENAME", "VALUE"))
COMPLETE_WITH_ENUM_VALUE(prev3_wd);
/* BEGIN */ /* BEGIN */
else if (Matches1("BEGIN")) else if (Matches1("BEGIN"))
COMPLETE_WITH_LIST6("WORK", "TRANSACTION", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE"); COMPLETE_WITH_LIST6("WORK", "TRANSACTION", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment