📄 tab-complete.c
字号:
pg_strcasecmp(prev2_wd, "COLUMN") == 0) || (pg_strcasecmp(prev4_wd, "TABLE") == 0 && pg_strcasecmp(prev2_wd, "ALTER") == 0)) { /* DROP ... does not work well yet */ static const char *const list_COLUMNALTER[] = {"TYPE", "SET DEFAULT", "DROP DEFAULT", "SET NOT NULL", "DROP NOT NULL", "SET STATISTICS", "SET STORAGE", NULL}; COMPLETE_WITH_LIST(list_COLUMNALTER); } else if (pg_strcasecmp(prev3_wd, "TABLE") == 0 && pg_strcasecmp(prev_wd, "CLUSTER") == 0) COMPLETE_WITH_CONST("ON"); else if (pg_strcasecmp(prev4_wd, "TABLE") == 0 && pg_strcasecmp(prev2_wd, "CLUSTER") == 0 && pg_strcasecmp(prev_wd, "ON") == 0) { completion_info_charp = prev3_wd; COMPLETE_WITH_QUERY(Query_for_index_of_table); } /* If we have TABLE <sth> SET, provide WITHOUT,TABLESPACE and SCHEMA */ else if (pg_strcasecmp(prev3_wd, "TABLE") == 0 && pg_strcasecmp(prev_wd, "SET") == 0) { static const char *const list_TABLESET[] = {"WITHOUT", "TABLESPACE", "SCHEMA", NULL}; COMPLETE_WITH_LIST(list_TABLESET); } /* If we have TABLE <sth> SET TABLESPACE provide a list of tablespaces */ else if (pg_strcasecmp(prev4_wd, "TABLE") == 0 && pg_strcasecmp(prev2_wd, "SET") == 0 && pg_strcasecmp(prev_wd, "TABLESPACE") == 0) COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces); /* If we have TABLE <sth> SET WITHOUT provide CLUSTER or OIDS */ else if (pg_strcasecmp(prev4_wd, "TABLE") == 0 && pg_strcasecmp(prev2_wd, "SET") == 0 && pg_strcasecmp(prev_wd, "WITHOUT") == 0) { static const char *const list_TABLESET2[] = {"CLUSTER", "OIDS", NULL}; COMPLETE_WITH_LIST(list_TABLESET2); } /* we have ALTER TABLESPACE, so suggest RENAME TO, OWNER TO */ else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 && pg_strcasecmp(prev2_wd, "TABLESPACE") == 0) { static const char *const list_ALTERTSPC[] = {"RENAME TO", "OWNER TO", NULL}; COMPLETE_WITH_LIST(list_ALTERTSPC); } /* complete ALTER TYPE <foo> with OWNER TO, SET SCHEMA */ else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 && pg_strcasecmp(prev2_wd, "TYPE") == 0) { static const char *const list_ALTERTYPE[] = {"OWNER TO", "SET SCHEMA", NULL}; COMPLETE_WITH_LIST(list_ALTERTYPE); } /* complete ALTER GROUP <foo> */ else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 && pg_strcasecmp(prev2_wd, "GROUP") == 0) { static const char *const list_ALTERGROUP[] = {"ADD USER", "DROP USER", "RENAME TO", NULL}; COMPLETE_WITH_LIST(list_ALTERGROUP); } /* complete ALTER GROUP <foo> ADD|DROP with USER */ else if (pg_strcasecmp(prev4_wd, "ALTER") == 0 && pg_strcasecmp(prev3_wd, "GROUP") == 0 && (pg_strcasecmp(prev_wd, "ADD") == 0 || pg_strcasecmp(prev_wd, "DROP") == 0)) COMPLETE_WITH_CONST("USER"); /* complete {ALTER} GROUP <foo> ADD|DROP USER with a user name */ else if (pg_strcasecmp(prev4_wd, "GROUP") == 0 && (pg_strcasecmp(prev2_wd, "ADD") == 0 || pg_strcasecmp(prev2_wd, "DROP") == 0) && pg_strcasecmp(prev_wd, "USER") == 0) COMPLETE_WITH_QUERY(Query_for_list_of_roles);/* BEGIN, END, ABORT */ else if (pg_strcasecmp(prev_wd, "BEGIN") == 0 || pg_strcasecmp(prev_wd, "END") == 0 || pg_strcasecmp(prev_wd, "ABORT") == 0) { static const char *const list_TRANS[] = {"WORK", "TRANSACTION", NULL}; COMPLETE_WITH_LIST(list_TRANS); }/* COMMIT */ else if (pg_strcasecmp(prev_wd, "COMMIT") == 0) { static const char *const list_COMMIT[] = {"WORK", "TRANSACTION", "PREPARED", NULL}; COMPLETE_WITH_LIST(list_COMMIT); }/* RELEASE SAVEPOINT */ else if (pg_strcasecmp(prev_wd, "RELEASE") == 0) COMPLETE_WITH_CONST("SAVEPOINT");/* ROLLBACK*/ else if (pg_strcasecmp(prev_wd, "ROLLBACK") == 0) { static const char *const list_TRANS[] = {"WORK", "TRANSACTION", "TO SAVEPOINT", "PREPARED", NULL}; COMPLETE_WITH_LIST(list_TRANS); }/* CLUSTER */ /* * If the previous word is CLUSTER and not without produce list of * indexes. */ else if (pg_strcasecmp(prev_wd, "CLUSTER") == 0 && pg_strcasecmp(prev2_wd, "WITHOUT") != 0) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); /* If we have CLUSTER <sth>, then add "ON" */ else if (pg_strcasecmp(prev2_wd, "CLUSTER") == 0 && pg_strcasecmp(prev_wd, "ON") != 0) COMPLETE_WITH_CONST("ON"); /* * If we have CLUSTER <sth> ON, then add the correct tablename as well. */ else if (pg_strcasecmp(prev3_wd, "CLUSTER") == 0 && pg_strcasecmp(prev_wd, "ON") == 0) { completion_info_charp = prev2_wd; COMPLETE_WITH_QUERY(Query_for_table_owning_index); }/* COMMENT */ else if (pg_strcasecmp(prev_wd, "COMMENT") == 0) COMPLETE_WITH_CONST("ON"); else if (pg_strcasecmp(prev2_wd, "COMMENT") == 0 && pg_strcasecmp(prev_wd, "ON") == 0) { static const char *const list_COMMENT[] = {"CAST", "CONVERSION", "DATABASE", "INDEX", "LANGUAGE", "RULE", "SCHEMA", "SEQUENCE", "TABLE", "TYPE", "VIEW", "COLUMN", "AGGREGATE", "FUNCTION", "OPERATOR", "TRIGGER", "CONSTRAINT", "DOMAIN", "LARGE OBJECT", NULL}; COMPLETE_WITH_LIST(list_COMMENT); } else if (pg_strcasecmp(prev4_wd, "COMMENT") == 0 && pg_strcasecmp(prev3_wd, "ON") == 0) COMPLETE_WITH_CONST("IS");/* COPY */ /* * If we have COPY [BINARY] (which you'd have to type yourself), offer * list of tables (Also cover the analogous backslash command) */ else if (pg_strcasecmp(prev_wd, "COPY") == 0 || pg_strcasecmp(prev_wd, "\\copy") == 0 || (pg_strcasecmp(prev2_wd, "COPY") == 0 && pg_strcasecmp(prev_wd, "BINARY") == 0)) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); /* If we have COPY|BINARY <sth>, complete it with "TO" or "FROM" */ else if (pg_strcasecmp(prev2_wd, "COPY") == 0 || pg_strcasecmp(prev2_wd, "\\copy") == 0 || pg_strcasecmp(prev2_wd, "BINARY") == 0) { static const char *const list_FROMTO[] = {"FROM", "TO", NULL}; COMPLETE_WITH_LIST(list_FROMTO); } /* If we have COPY|BINARY <sth> FROM|TO, complete with filename */ else if ((pg_strcasecmp(prev3_wd, "COPY") == 0 || pg_strcasecmp(prev3_wd, "\\copy") == 0 || pg_strcasecmp(prev3_wd, "BINARY") == 0) && (pg_strcasecmp(prev_wd, "FROM") == 0 || pg_strcasecmp(prev_wd, "TO") == 0)) matches = completion_matches(text, filename_completion_function); /* Handle COPY|BINARY <sth> FROM|TO filename */ else if ((pg_strcasecmp(prev4_wd, "COPY") == 0 || pg_strcasecmp(prev4_wd, "\\copy") == 0 || pg_strcasecmp(prev4_wd, "BINARY") == 0) && (pg_strcasecmp(prev2_wd, "FROM") == 0 || pg_strcasecmp(prev2_wd, "TO") == 0)) { static const char *const list_COPY[] = {"BINARY", "OIDS", "DELIMITER", "NULL", "CSV", NULL}; COMPLETE_WITH_LIST(list_COPY); } /* Handle COPY|BINARY <sth> FROM|TO filename CSV */ else if (pg_strcasecmp(prev_wd, "CSV") == 0 && (pg_strcasecmp(prev3_wd, "FROM") == 0 || pg_strcasecmp(prev3_wd, "TO") == 0)) { static const char *const list_CSV[] = {"HEADER", "QUOTE", "ESCAPE", "FORCE QUOTE", NULL}; COMPLETE_WITH_LIST(list_CSV); } /* CREATE DATABASE */ else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && pg_strcasecmp(prev2_wd, "DATABASE") == 0) { static const char *const list_DATABASE[] = {"OWNER", "TEMPLATE", "ENCODING", "TABLESPACE", "CONNECTION LIMIT", NULL}; COMPLETE_WITH_LIST(list_DATABASE); } /* CREATE INDEX */ /* First off we complete CREATE UNIQUE with "INDEX" */ else if (pg_strcasecmp(prev2_wd, "CREATE") == 0 && pg_strcasecmp(prev_wd, "UNIQUE") == 0) COMPLETE_WITH_CONST("INDEX"); /* If we have CREATE|UNIQUE INDEX <sth>, then add "ON" */ else if (pg_strcasecmp(prev2_wd, "INDEX") == 0 && (pg_strcasecmp(prev3_wd, "CREATE") == 0 || pg_strcasecmp(prev3_wd, "UNIQUE") == 0)) COMPLETE_WITH_CONST("ON"); /* Complete ... INDEX <name> ON with a list of tables */ else if (pg_strcasecmp(prev3_wd, "INDEX") == 0 && pg_strcasecmp(prev_wd, "ON") == 0) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); /* * Complete INDEX <name> ON <table> with a list of table columns (which * should really be in parens) */ else if (pg_strcasecmp(prev4_wd, "INDEX") == 0 && pg_strcasecmp(prev2_wd, "ON") == 0) COMPLETE_WITH_ATTR(prev_wd); /* same if you put in USING */ else if (pg_strcasecmp(prev4_wd, "ON") == 0 && pg_strcasecmp(prev2_wd, "USING") == 0) COMPLETE_WITH_ATTR(prev3_wd); /* Complete USING with an index method */ else if (pg_strcasecmp(prev_wd, "USING") == 0) { static const char *const index_mth[] = {"BTREE", "RTREE", "HASH", "GIST", NULL}; COMPLETE_WITH_LIST(index_mth); }/* CREATE RULE */ /* Complete "CREATE RULE <sth>" with "AS" */ else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && pg_strcasecmp(prev2_wd, "RULE") == 0) COMPLETE_WITH_CONST("AS"); /* Complete "CREATE RULE <sth> AS with "ON" */ else if (pg_strcasecmp(prev4_wd, "CREATE") == 0 && pg_strcasecmp(prev3_wd, "RULE") == 0 && pg_strcasecmp(prev_wd, "AS") == 0) COMPLETE_WITH_CONST("ON"); /* Complete "RULE * AS ON" with SELECT|UPDATE|DELETE|INSERT */ else if (pg_strcasecmp(prev4_wd, "RULE") == 0 && pg_strcasecmp(prev2_wd, "AS") == 0 && pg_strcasecmp(prev_wd, "ON") == 0) { static const char *const rule_events[] = {"SELECT", "UPDATE", "INSERT", "DELETE", NULL}; COMPLETE_WITH_LIST(rule_events); } /* Complete "AS ON <sth with a 'T' :)>" with a "TO" */ else if (pg_strcasecmp(prev3_wd, "AS") == 0 && pg_strcasecmp(prev2_wd, "ON") == 0 && (toupper((unsigned char) prev_wd[4]) == 'T' || toupper((unsigned char) prev_wd[5]) == 'T')) COMPLETE_WITH_CONST("TO"); /* Complete "AS ON <sth> TO" with a table name */ else if (pg_strcasecmp(prev4_wd, "AS") == 0 && pg_strcasecmp(prev3_wd, "ON") == 0 && pg_strcasecmp(prev_wd, "TO") == 0) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);/* CREATE TABLE */ /* Complete CREATE TEMP with "TABLE" */ else if (pg_strcasecmp(prev2_wd, "CREATE") == 0 && pg_strcasecmp(prev_wd, "TEMP") == 0) COMPLETE_WITH_CONST("TABLE");/* CREATE TABLESPACE */ else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && pg_strcasecmp(prev2_wd, "TABLESPACE") == 0) { static const char *const list_CREATETABLESPACE[] = {"OWNER", "LOCATION", NULL}; COMPLETE_WITH_LIST(list_CREATETABLESPACE); } /* Complete CREATE TABLESPACE name OWNER name with "LOCATION" */ else if (pg_strcasecmp(prev5_wd, "CREATE") == 0 && pg_strcasecmp(prev4_wd, "TABLESPACE") == 0 && pg_strcasecmp(prev2_wd, "OWNER") == 0) { COMPLETE_WITH_CONST("LOCATION"); }/* CREATE TRIGGER */ /* complete CREATE TRIGGER <name> with BEFORE,AFTER */ else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && pg_strcasecmp(prev2_wd, "TRIGGER") == 0) { static const char *const list_CREATETRIGGER[] = {"BEFORE", "AFTER", NULL}; COMPLETE_WITH_LIST(list_CREATETRIGGER); } /* complete CREATE TRIGGER <name> BEFORE,AFTER sth with OR,ON */ else if (pg_strcasecmp(prev5_wd, "CREATE") == 0 && pg_strcasecmp(prev4_wd, "TRIGGER") == 0 && (pg_strcasecmp(prev2_wd, "BEFORE") == 0 || pg_strcasecmp(prev2_wd, "AFTER") == 0)) { static const char *const list_CREATETRIGGER2[] = {"ON", "OR", NULL}; COMPLETE_WITH_LIST(list_CREATETRIGGER2); }/* CREATE ROLE,USER,GROUP */ else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && (pg_strcasecmp(prev2_wd, "ROLE") == 0 || pg_strcasecmp(prev2_wd, "GROUP") == 0 || pg_strcasecmp(prev2_wd, "USER") == 0)) { static const char *const list_CREATEROLE[] = {"ADMIN", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE", "CREATEUSER", "ENCRYPTED", "IN", "INHERIT", "LOGIN", "NOINHERIT", "NOLOGIN", "NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NOSUPERUSER", "ROLE", "SUPERUSER", "SYSID", "UNENCRYPTED", NULL}; COMPLETE_WITH_LIST(list_CREATEROLE); } /* * complete CREATE ROLE,USER,GROUP <name> ENCRYPTED,UNENCRYPTED with * PASSWORD */ else if (pg_strcasecmp(prev4_wd, "CREATE") == 0 && (pg_strcasecmp(prev3_wd, "ROLE") == 0 || pg_strcasecmp(prev3_wd, "GROUP") == 0 || pg_strcasecmp(prev3_wd, "USER") == 0) && (pg_strcasecmp(prev_wd, "ENCRYPTED") == 0 || pg_strcasecmp(prev_wd, "UNENCRYPTED") == 0)) { COMPLETE_WITH_CONST("PASSWORD"); } /* complete CREATE ROLE,USER,GROUP <name> IN with ROLE,GROUP */ else if (pg_strcasecmp(prev4_wd, "CREATE") == 0 && (pg_strcasecmp(prev3_wd, "ROLE") == 0 || pg_strcasecmp(prev3_wd, "GROUP") == 0 || pg_strcasecmp(prev3_wd, "USER") == 0) && pg_strcasecmp(prev_wd, "IN") == 0) { static const char *const list_CREATEROLE3[] = {"GROUP", "ROLE", NULL}; COMPLETE_WITH_LIST(list_CREATEROLE3); }/* CREATE VIEW */ /* Complete CREATE VIEW <name> with AS */ else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && pg_strcasecmp(prev2_wd, "VIEW") == 0) COMPLETE_WITH_CONST("AS"); /* Complete "CREATE VIEW <sth> AS with "SELECT" */ else if (pg_strcasecmp(prev4_wd, "CREATE") == 0 && pg_strcasecmp(prev3_wd, "VIEW") == 0 && pg_strcasecmp(prev_wd, "AS") == 0) COMPLETE_WITH_CONST("SELECT");/* DECLARE */ else if (pg_strcasecmp(prev2_wd, "DECLARE") == 0) { static const char *const list_DECLARE[] = {"BINARY", "INSENSITIVE", "SCROLL", "NO SCROLL", "CURSOR", NULL}; COMPLETE_WITH_LIST(list_DECLARE); } else if (pg_strcasecmp(prev_wd, "CURSOR") == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -