From 282db386d231debde309ae057d9d6c6aa09feef2 Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Fri, 9 Apr 2021 11:26:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dreadline=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bin/psql/tab-complete.cpp | 68 +++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/src/bin/psql/tab-complete.cpp b/src/bin/psql/tab-complete.cpp index 5942fdd98..d1b1b8663 100644 --- a/src/bin/psql/tab-complete.cpp +++ b/src/bin/psql/tab-complete.cpp @@ -528,6 +528,7 @@ static const SchemaQuery Query_for_list_of_matviews = { " UNION ALL SELECT 'constraints' " \ " UNION ALL SELECT 'transaction' " \ " UNION ALL SELECT 'session' " \ + " UNION ALL SELECT 'local' " \ " UNION ALL SELECT 'role' " \ " UNION ALL SELECT 'tablespace' " \ " UNION ALL SELECT 'all') ss " \ @@ -613,6 +614,12 @@ static const SchemaQuery Query_for_list_of_matviews = { " FROM pg_catalog.pg_available_extensions " \ " WHERE substring(pg_catalog.quote_ident(name),1,%d)='%s' AND installed_version IS NULL" +#define Query_for_list_of_available_extension_versions \ +" SELECT pg_catalog.quote_ident(version) "\ +" FROM pg_catalog.pg_available_extension_versions "\ +" WHERE (%d = pg_catalog.length('%s'))"\ +" AND pg_catalog.quote_ident(name)='%s'" + #define Query_for_list_of_prepared_statements " SELECT pg_catalog.quote_ident(name) " \ " FROM pg_catalog.pg_prepared_statements " \ " WHERE substring(pg_catalog.quote_ident(name),1,%d)='%s'" @@ -858,7 +865,7 @@ static char** PsqlCompletion(const char *text, int start, int end) static const char* const sqlCommands[] = { "ABORT", "ALTER", "ANALYZE", "BEGIN", "CALL", "CHECKPOINT", "CLOSE", "CLUSTER", - "COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE", + "COMMENT", "COMMIT", "COPY", "CREATE", "CURSOR", "DEALLOCATE", "DECLARE", "DELETE FROM", "DISCARD", "DO", "DROP", "END", "EXECUTE", "EXPLAIN", "FETCH", "GRANT", "INSERT", "LISTEN", "LOAD", "LOCK", "MOVE", "NOTIFY", "PREPARE", "REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE", "RESET", "REVOKE", "ROLLBACK", @@ -1023,6 +1030,31 @@ static char** PsqlCompletion(const char *text, int start, int end) COMPLETE_WITH_LIST(listAlterExtension); } + /* ALTER EXTENSION UPDATE */ + else if (pg_strcasecmp(PREV4_WD, "ALTER") == 0 && pg_strcasecmp(PREV3_WD, "EXTENSION") == 0 && + pg_strcasecmp(PREV_WD, "UPDATE") == 0) { + COMPLETE_WITH_CONST("TO"); + } + + /* ALTER EXTENSION UPDATE TO */ + else if (pg_strcasecmp(PREV5_WD, "ALTER") == 0 && pg_strcasecmp(PREV4_WD, "EXTENSION") == 0 && + pg_strcasecmp(PREV2_WD, "UPDATE") == 0 && pg_strcasecmp(PREV_WD, "TO") == 0) { + completion_info_charp = PREV3_WD; + COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions); + } + + /* ALTER EXTENSION ADD/DROP */ + else if (pg_strcasecmp(PREV4_WD, "ALTER") == 0 && pg_strcasecmp(PREV3_WD, "EXTENSION") == 0 && + (pg_strcasecmp(PREV_WD, "ADD") == 0 || pg_strcasecmp(PREV_WD, "DROP"))) { + static const char* const listAlterExtensionMemberObject[] = { + "AGGREGATE", "CAST", "COLLATION", "CONVERSION", "DOMAIN", "EVENT TRIGGER", "FOREIGN DATA WRAPPER", + "FOREIGN TABLE", "FUNCTION", "MATERIALIZED VIEW", "OPERATOR", "OPERATOR CLASS", "OPERATOR FAMILY ", + "PROCEDURAL LANGUAGE", "LANGUAGE", "SCHEMA", "SEQUENCE", "SERVER", "TABLE", "TEXT SEARCH CONFIGURATION", + "TEXT SEARCH DICTIONARY", "TEXT SEARCH PARSER", "TEXT SEARCH TEMPLATE", "TYPE", "VIEW", NULL}; + + COMPLETE_WITH_LIST(listAlterExtensionMemberObject); + } + /* ALTER FOREIGN */ else if (pg_strcasecmp(PREV2_WD, "ALTER") == 0 && pg_strcasecmp(PREV_WD, "FOREIGN") == 0) { static const char* const listAlterForeign[] = {"DATA WRAPPER", "TABLE", NULL}; @@ -1665,6 +1697,24 @@ static char** PsqlCompletion(const char *text, int start, int end) COMPLETE_WITH_LIST(listCsv); } + /* CREATE CAST */ + else if (pg_strcasecmp(PREV2_WD, "CREATE") == 0 && pg_strcasecmp(PREV_WD, "CAST") == 0) { + COMPLETE_WITH_CONST("("); + } + else if (pg_strcasecmp(PREV4_WD, "CREATE") == 0 && pg_strcasecmp(PREV3_WD, "CAST") == 0 && + pg_strcasecmp(PREV2_WD, "(") == 0) { + COMPLETE_WITH_CONST("AS"); + } + else if (pg_strcasecmp(PREV6_WD, "CREATE") == 0 && pg_strcasecmp(PREV5_WD, "CAST") == 0 && + pg_strcasecmp(PREV4_WD, "(") == 0 && pg_strcasecmp(PREV2_WD, "AS") == 0) { + COMPLETE_WITH_CONST(")"); + } + else if (pg_strcasecmp(PREV3_WD, "CREATE") == 0 && pg_strcasecmp(PREV2_WD, "CAST") == 0 && + pg_strcasecmp(PREV_WD, "(") != 0) { + static const char* const listCreateCastOptions[] = {"WITH FUNCTION", "WITHOUT FUNCTION", "WITH INOUT", NULL}; + COMPLETE_WITH_LIST(listCreateCastOptions); + } + /* CREATE DATABASE */ else if (pg_strcasecmp(PREV3_WD, "CREATE") == 0 && pg_strcasecmp(PREV2_WD, "DATABASE") == 0) { static const char* const listDatabase[] = { @@ -1681,8 +1731,10 @@ static char** PsqlCompletion(const char *text, int start, int end) else if (pg_strcasecmp(PREV2_WD, "CREATE") == 0 && pg_strcasecmp(PREV_WD, "EXTENSION") == 0) COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions); /* CREATE EXTENSION */ - else if (pg_strcasecmp(PREV3_WD, "CREATE") == 0 && pg_strcasecmp(PREV2_WD, "EXTENSION") == 0) - COMPLETE_WITH_CONST("WITH SCHEMA"); + else if (pg_strcasecmp(PREV3_WD, "CREATE") == 0 && pg_strcasecmp(PREV2_WD, "EXTENSION") == 0) { + static const char* const listCreateExtension[] = {"WITH SCHEMA", "VERSION", "FROM", NULL}; + COMPLETE_WITH_LIST(listCreateExtension); + } /* CREATE FOREIGN */ else if (pg_strcasecmp(PREV2_WD, "CREATE") == 0 && pg_strcasecmp(PREV_WD, "FOREIGN") == 0) { @@ -1944,8 +1996,8 @@ static char** PsqlCompletion(const char *text, int start, int end) } /* CURSOR */ - else if (pg_strcasecmp(PREV_WD, "CURSOR") == 0) { - static const char* const listDeclareCursor[] = {"WITH HOLD", "WITHOUT HOLD", "FOR", NULL}; + else if (pg_strcasecmp(PREV2_WD, "CURSOR") == 0) { + static const char* const listDeclareCursor[] = {"BINARY", "NO SCROLL","WITH HOLD", "WITHOUT HOLD", "FOR", NULL}; COMPLETE_WITH_LIST(listDeclareCursor); } @@ -2463,7 +2515,8 @@ static char** PsqlCompletion(const char *text, int start, int end) else if (pg_strcasecmp(PREV2_WD, "SET") == 0 && pg_strcasecmp(PREV_WD, "ROLE") == 0) COMPLETE_WITH_QUERY(Query_for_list_of_roles); /* Complete SET SESSION with AUTHORIZATION or CHARACTERISTICS... */ - else if (pg_strcasecmp(PREV2_WD, "SET") == 0 && pg_strcasecmp(PREV_WD, "SESSION") == 0) { + else if (pg_strcasecmp(PREV2_WD, "SET") == 0 && + (pg_strcasecmp(PREV_WD, "SESSION") == 0 || pg_strcasecmp(PREV_WD, "LOCAL") == 0)) { static const char* const myList[] = {"AUTHORIZATION", "CHARACTERISTICS AS TRANSACTION", NULL}; COMPLETE_WITH_LIST(myList); @@ -2478,7 +2531,8 @@ static char** PsqlCompletion(const char *text, int start, int end) /* Complete SET with "TO" */ else if (pg_strcasecmp(PREV2_WD, "SET") == 0 && pg_strcasecmp(PREV4_WD, "UPDATE") != 0 && pg_strcasecmp(PREV_WD, "TABLESPACE") != 0 && pg_strcasecmp(PREV_WD, "SCHEMA") != 0 && - PREV_WD[strlen(PREV_WD) - 1] != ')' && pg_strcasecmp(PREV4_WD, "DOMAIN") != 0) + PREV_WD[strlen(PREV_WD) - 1] != ')' && pg_strcasecmp(PREV4_WD, "DOMAIN") != 0 && + pg_strcasecmp(PREV_WD, "CONSTRAINTS") != 0) COMPLETE_WITH_CONST("TO"); /* Suggest possible variable values */ else if (pg_strcasecmp(PREV3_WD, "SET") == 0 && (pg_strcasecmp(PREV_WD, "TO") == 0 || strcmp(PREV_WD, "=") == 0)) {