Correct help message and add syntax in tab-completion.cpp

This commit is contained in:
chenxiaobin19
2021-07-29 15:23:57 +08:00
parent 468d6bcbc2
commit f80fb3050b
5 changed files with 410 additions and 42 deletions

View File

@ -480,6 +480,21 @@ static const SchemaQuery Query_for_list_of_matviews = {
NULL
};
static const SchemaQuery Query_for_list_of_constraints_with_schema = {
/* catname */
"pg_catalog.pg_constraint c",
/* selcondition */
"c.conrelid <> 0",
/* viscondition */
"true",
/* namespace */
"c.connamespace",
/* result */
"pg_catalog.quote_ident(c.conname)",
/* qualresult */
NULL
};
/*
* Queries to get lists of names of various kinds of things, possibly
* restricted to names matching a partially entered name. In these queries,
@ -675,6 +690,8 @@ typedef struct {
static const pgsql_thing_t words_after_create[] = {
{"AGGREGATE", NULL, &Query_for_list_of_aggregates, 0},
{"APP WORKLOAD GROUP", NULL, NULL, 0},
{"APP WORKLOAD GROUP MAPPING", NULL, NULL, 0},
#ifdef PGXC
{"BARRIER", NULL, NULL, 0}, /* Comes barrier name next, so skip it */
#endif
@ -898,7 +915,7 @@ static char** PsqlCompletion(const char *text, int start, int end)
"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",
"REASSIGN", "REFRESH", "REINDEX", "RELEASE", "RESET", "REVOKE", "ROLLBACK",
"SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START",
"TABLE", "TRUNCATE", "UNLISTEN", "UPDATE", "VACUUM", "VALUES", "WITH",
NULL
@ -1063,12 +1080,12 @@ static char** PsqlCompletion(const char *text, int start, int end)
*/
else if (pg_strcasecmp(PREV_WD, "ALTER") == 0 && pg_strcasecmp(PREV3_WD, "TABLE") != 0) {
static const char* const listAlter[] = {
"AGGREGATE", "COLLATION", "CONVERSION", "DATABASE", "DEFAULT PRIVILEGES", "DOMAIN",
"EXTENSION", "FOREIGN DATA WRAPPER", "FOREIGN TABLE", "FUNCTION",
"GROUP", "INDEX", "LANGUAGE", "LARGE OBJECT", "MATERIALIZED VIEW", "OPERATOR",
"POLICY", "PROCEDURE", "ROLE", "ROW LEVEL SECURITY POLICY", "RULE", "SCHEMA",
"SERVER", "SESSION", "SEQUENCE", "SYSTEM", "TABLE", "TABLESPACE", "TEXT SEARCH", "TRIGGER",
"TYPE", "USER", "USER MAPPING FOR", "VIEW", NULL
"AGGREGATE", "APP WORKLOAD GROUP", "APP WORKLOAD GROUP MAPPING", "COLLATION", "CONVERSION",
"DATABASE", "DEFAULT PRIVILEGES", "DOMAIN", "EXTENSION", "FOREIGN DATA WRAPPER",
"FOREIGN TABLE", "FUNCTION", "GROUP", "INDEX", "LANGUAGE", "LARGE OBJECT",
"MATERIALIZED VIEW", "OPERATOR", "POLICY", "PROCEDURE", "ROLE", "ROW LEVEL SECURITY POLICY",
"RULE", "SCHEMA", "SERVER", "SESSION", "SEQUENCE", "SYSTEM", "TABLE", "TABLESPACE",
"TEXT SEARCH", "TRIGGER", "TYPE", "USER", "USER MAPPING FOR", "VIEW", NULL
};
COMPLETE_WITH_LIST(listAlter);
@ -1260,11 +1277,11 @@ static char** PsqlCompletion(const char *text, int start, int end)
"INDEPENDENT", "INHERIT", "LOGIN", "MONADMIN", "NOAUDITADMIN",
"NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NODE GROUP",
"NOINDEPENDENT", "NOINHERIT", "NOLOGIN", "NOMONADMIN", "NOOPRADMIN",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION", "NOSUPERUSER",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION",
"NOSYSADMIN", "NOUSEFT", "NOVCADMIN", "OPRADMIN", "PASSWORD",
"PERM SPACE", "PERSISTENCE", "PGUSER", "POLADMIN", "RENAME TO",
"REPLICATION", "RESET", "RESOURCE POOL", "SET", "SPILL SPACE",
"SUPERUSER", "SYSADMIN", "TEMP SPACE", "UNENCRYPTED", "USEFT",
"SYSADMIN", "TEMP SPACE", "UNENCRYPTED", "USEFT",
"USER GROUP", "VALID", "VCADMIN", "WITH", NULL
};
@ -1292,11 +1309,11 @@ static char** PsqlCompletion(const char *text, int start, int end)
"INDEPENDENT", "INHERIT", "LOGIN", "MONADMIN", "NOAUDITADMIN",
"NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NODE GROUP",
"NOINDEPENDENT", "NOINHERIT", "NOLOGIN", "NOMONADMIN", "NOOPRADMIN",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION", "NOSUPERUSER",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION",
"NOSYSADMIN", "NOUSEFT", "NOVCADMIN", "OPRADMIN", "PASSWORD",
"PERM SPACE", "PERSISTENCE", "PGUSER", "POLADMIN", "RENAME TO",
"REPLICATION", "RESET", "RESOURCE POOL", "SET", "SPILL SPACE",
"SUPERUSER", "SYSADMIN", "TEMP SPACE", "UNENCRYPTED", "USEFT",
"SYSADMIN", "TEMP SPACE", "UNENCRYPTED", "USEFT",
"USER GROUP", "VALID", "VCADMIN", NULL
};
@ -1920,10 +1937,16 @@ static char** PsqlCompletion(const char *text, int start, int end)
COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions);
/* CREATE EXTENSION <name> */
else if (pg_strcasecmp(PREV3_WD, "CREATE") == 0 && pg_strcasecmp(PREV2_WD, "EXTENSION") == 0) {
static const char* const listCreateExtension[] = {"WITH SCHEMA", "VERSION", "FROM", NULL};
static const char* const listCreateExtension[] = {"WITH", "SCHEMA", "VERSION", "FROM", NULL};
COMPLETE_WITH_LIST(listCreateExtension);
}
else if (pg_strcasecmp(PREV4_WD, "CREATE") == 0 && pg_strcasecmp(PREV3_WD, "EXTENSION") == 0 &&
pg_strcasecmp(PREV_WD, "WITH") == 0) {
static const char* const listCreateExtensionWith[] = {"SCHEMA", "VERSION", "FROM", NULL};
COMPLETE_WITH_LIST(listCreateExtensionWith);
}
/* CREATE FOREIGN */
else if (pg_strcasecmp(PREV2_WD, "CREATE") == 0 && pg_strcasecmp(PREV_WD, "FOREIGN") == 0) {
static const char* const listCreateForeign[] = {"DATA WRAPPER", "TABLE", NULL};
@ -2286,10 +2309,10 @@ static char** PsqlCompletion(const char *text, int start, int end)
"IN GROUP", "IN ROLE", "INDEPENDENT", "INHERIT", "LOGIN", "MONADMIN",
"NOAUDITADMIN", "NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NODE GROUP",
"NOINDEPENDENT", "NOINHERIT", "NOLOGIN", "NOMONADMIN", "NOOPRADMIN",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION", "NOSUPERUSER", "NOSYSADMIN",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION", "NOSYSADMIN",
"NOUSEFT", "NOVCADMIN", "OPRADMIN", "PASSWORD", "PERM SPACE", "PERSISTENCE",
"PGUSER", "POLADMIN", "PROFILE", "PROFILE DEFAULT", "REPLICATION",
"RESOURCE POOL", "ROLE", "SPILL SPACE", "SUPERUSER", "SYSADMIN", "SYSID",
"RESOURCE POOL", "ROLE", "SPILL SPACE", "SYSADMIN", "SYSID",
"TEMP SPACE", "UNENCRYPTED", "USEFT", "USER", "USER GROUP", "VALID",
"VCADMIN", "WITH", NULL
};
@ -2319,10 +2342,10 @@ static char** PsqlCompletion(const char *text, int start, int end)
"IN GROUP", "IN ROLE", "INDEPENDENT", "INHERIT", "LOGIN", "MONADMIN",
"NOAUDITADMIN", "NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NODE GROUP",
"NOINDEPENDENT", "NOINHERIT", "NOLOGIN", "NOMONADMIN", "NOOPRADMIN",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION", "NOSUPERUSER", "NOSYSADMIN",
"NOPERSISTENCE", "NOPOLADMIN", "NOREPLICATION", "NOSYSADMIN",
"NOUSEFT", "NOVCADMIN", "OPRADMIN", "PASSWORD", "PERM SPACE", "PERSISTENCE",
"PGUSER", "POLADMIN", "PROFILE", "PROFILE DEFAULT", "REPLICATION",
"RESOURCE POOL", "ROLE", "SPILL SPACE", "SUPERUSER", "SYSADMIN", "SYSID",
"RESOURCE POOL", "ROLE", "SPILL SPACE", "SYSADMIN", "SYSID",
"TEMP SPACE", "UNENCRYPTED", "USEFT", "USER", "USER GROUP", "VALID",
"VCADMIN", NULL
};
@ -2394,7 +2417,9 @@ static char** PsqlCompletion(const char *text, int start, int end)
/* CURSOR */
else if (pg_strcasecmp(PREV2_WD, "CURSOR") == 0) {
static const char* const listDeclareCursor[] = {"BINARY", "NO SCROLL","WITH HOLD", "WITHOUT HOLD", "FOR", NULL};
static const char* const listDeclareCursor[] = {
"BINARY", "SCROLL", "NO SCROLL","INSENSITIVE","FOR", NULL
};
COMPLETE_WITH_LIST(listDeclareCursor);
}
@ -2658,7 +2683,11 @@ static char** PsqlCompletion(const char *text, int start, int end)
" UNION SELECT 'LARGE OBJECT'"
" UNION SELECT 'SCHEMA'"
" UNION SELECT 'TABLESPACE'"
" UNION SELECT 'TYPE'");
" UNION SELECT 'TYPE'"
" UNION SELECT 'TABLE'"
" UNION SELECT 'DIRECTORY'"
" UNION SELECT 'NODE GROUP'"
" UNION SELECT 'DATA SOURCE'");
else if ((pg_strcasecmp(PREV4_WD, "GRANT") == 0 || pg_strcasecmp(PREV4_WD, "REVOKE") == 0) &&
pg_strcasecmp(PREV2_WD, "ON") == 0 && pg_strcasecmp(PREV_WD, "FOREIGN") == 0) {
static const char* const listPrivilegeForeign[] = {"DATA WRAPPER", "SERVER", NULL};
@ -2683,6 +2712,8 @@ static char** PsqlCompletion(const char *text, int start, int end)
COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
else if (pg_strcasecmp(PREV_WD, "TYPE") == 0)
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
else if (pg_strcasecmp(PREV_WD, "DATA") == 0)
COMPLETE_WITH_CONST("SOURCE");
else if (pg_strcasecmp(PREV4_WD, "GRANT") == 0)
COMPLETE_WITH_CONST("TO");
else
@ -2773,8 +2804,11 @@ static char** PsqlCompletion(const char *text, int start, int end)
/* Complete LOCK [TABLE] <table> with "IN" */
else if ((pg_strcasecmp(PREV2_WD, "LOCK") == 0 && pg_strcasecmp(PREV_WD, "TABLE") != 0) ||
(pg_strcasecmp(PREV2_WD, "TABLE") == 0 && pg_strcasecmp(PREV3_WD, "LOCK") == 0))
COMPLETE_WITH_CONST("IN");
(pg_strcasecmp(PREV2_WD, "TABLE") == 0 && pg_strcasecmp(PREV3_WD, "LOCK") == 0)) {
static const char* const lockTableList[] = {"IN", "NOWAIT", NULL};
COMPLETE_WITH_LIST(lockTableList);
}
/* Complete LOCK [TABLE] <table> IN with a lock mode */
else if (pg_strcasecmp(PREV_WD, "IN") == 0 && (pg_strcasecmp(PREV3_WD, "LOCK") == 0 ||
@ -2790,6 +2824,20 @@ static char** PsqlCompletion(const char *text, int start, int end)
COMPLETE_WITH_LIST(lockModes);
}
else if ((pg_strcasecmp(PREV_WD, "ACCESS") == 0 || pg_strcasecmp(PREV_WD, "ROW") == 0) &&
pg_strcasecmp(PREV2_WD, "IN") == 0 && (pg_strcasecmp(PREV4_WD, "LOCK") == 0 ||
(pg_strcasecmp(PREV4_WD, "TABLE") == 0 && pg_strcasecmp(PREV5_WD, "LOCK") == 0))) {
static const char* const lockModesAccess[] = {"SHARE MODE", "EXCLUSIVE MODE", NULL};
COMPLETE_WITH_LIST(lockModesAccess);
}
else if (pg_strcasecmp(PREV_WD, "SHARE") == 0&& pg_strcasecmp(PREV2_WD, "IN") == 0 &&
(pg_strcasecmp(PREV4_WD, "LOCK") == 0 || (pg_strcasecmp(PREV4_WD, "TABLE") == 0 &&
pg_strcasecmp(PREV5_WD, "LOCK") == 0))) {
static const char* const lockModesAccess[] = {"UPDATE EXCLUSIVE MODE", "ROW EXCLUSIVE MODE", "MODE", NULL};
COMPLETE_WITH_LIST(lockModesAccess);
}
/* NOTIFY */
else if (pg_strcasecmp(PREV_WD, "NOTIFY") == 0)
COMPLETE_WITH_QUERY("SELECT pg_catalog.quote_ident(channel) FROM pg_catalog.pg_listening_channels() AS channel "
@ -2838,8 +2886,10 @@ static char** PsqlCompletion(const char *text, int start, int end)
COMPLETE_WITH_QUERY(Query_for_list_of_roles);
/* REFRESH MATERIALIZED VIEW */
else if (pg_strcasecmp(PREV_WD, "REFRESH") == 0)
COMPLETE_WITH_CONST("MATERIALIZED VIEW");
else if (pg_strcasecmp(PREV_WD, "REFRESH") == 0) {
static const char* const refreshObject[] = {"MATERIALIZED VIEW", "INCREMENTAL MATERIALIZED VIEW", NULL};
COMPLETE_WITH_LIST(refreshObject);
}
else if (pg_strcasecmp(PREV2_WD, "REFRESH") == 0 && pg_strcasecmp(PREV_WD, "MATERIALIZED") == 0)
COMPLETE_WITH_CONST("VIEW");
else if (pg_strcasecmp(PREV3_WD, "REFRESH") == 0 && pg_strcasecmp(PREV2_WD, "MATERIALIZED") == 0 &&
@ -2948,6 +2998,9 @@ static char** PsqlCompletion(const char *text, int start, int end)
COMPLETE_WITH_LIST(myList);
}
else if (pg_strcasecmp(PREV2_WD, "SET") == 0 && pg_strcasecmp(PREV_WD, "CONSTRAINTS") == 0) {
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_constraints_with_schema, " UNION SELECT 'ALL'");
}
/* Complete SET CONSTRAINTS <foo> with DEFERRED|IMMEDIATE */
else if (pg_strcasecmp(PREV3_WD, "SET") == 0 && pg_strcasecmp(PREV2_WD, "CONSTRAINTS") == 0) {
static const char* const constraintList[] = {"DEFERRED", "IMMEDIATE", NULL};