Index: tab-complete.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/bin/psql/tab-complete.c,v retrieving revision 1.51 diff -r1.51 tab-complete.c 37,38c37 < * - Table or attribute names with spaces in it will equally confuse < * it. --- > * - Table or attribute names with spaces in it may confuse it. 135,144c134,143 < {"AGGREGATE", "SELECT distinct proname FROM pg_proc WHERE proisagg AND substr(proname,1,%d)='%s'"}, < {"DATABASE", "SELECT datname FROM pg_database WHERE substr(datname,1,%d)='%s'"}, < {"FUNCTION", "SELECT distinct proname FROM pg_proc WHERE substr(proname,1,%d)='%s'"}, < {"GROUP", "SELECT groname FROM pg_group WHERE substr(groname,1,%d)='%s'"}, < {"INDEX", "SELECT relname FROM pg_class WHERE relkind='i' and substr(relname,1,%d)='%s'"}, < {"OPERATOR", NULL}, /* Querying for this is probably not such < * a good idea. */ < {"RULE", "SELECT rulename FROM pg_rules WHERE substr(rulename,1,%d)='%s'"}, < {"SEQUENCE", "SELECT relname FROM pg_class WHERE relkind='S' and substr(relname,1,%d)='%s'"}, < {"TABLE", "SELECT relname FROM pg_class WHERE (relkind='r' or relkind='v') and substr(relname,1,%d)='%s'"}, --- > {"AGGREGATE", "SELECT distinct proname FROM pg_catalog.pg_proc WHERE proisagg AND substr(proname,1,%d)='%s'"}, > {"DATABASE", "SELECT datname FROM pg_catalog.pg_database WHERE substr(datname,1,%d)='%s'"}, > {"FUNCTION", "SELECT distinct proname FROM pg_catalog.pg_proc WHERE substr(proname,1,%d)='%s'"}, > {"GROUP", "SELECT groname FROM pg_catalog.pg_group WHERE substr(groname,1,%d)='%s'"}, > {"INDEX", "SELECT relname FROM pg_catalog.pg_class WHERE relkind='i' and substr(relname,1,%d)='%s'"}, > {"OPERATOR", NULL}, /* Querying for this is probably not such a good idea. */ > {"RULE", "SELECT rulename FROM pg_catalog.pg_rules WHERE substr(rulename,1,%d)='%s'"}, > {"SCHEMA", "SELECT nspname FROM pg_catalog.pg_namespace WHERE substr(nspname,1,%d)='%s'"}, > {"SEQUENCE", "SELECT relname FROM pg_catalog.pg_class WHERE relkind='S' and substr(relname,1,%d)='%s'"}, > {"TABLE", "SELECT relname FROM pg_catalog.pg_class WHERE (relkind='r' or relkind='v') and substr(relname,1,%d)='%s'"}, 146,147c145,146 < {"TRIGGER", "SELECT tgname FROM pg_trigger WHERE substr(tgname,1,%d)='%s'"}, < {"TYPE", "SELECT typname FROM pg_type WHERE substr(typname,1,%d)='%s'"}, --- > {"TRIGGER", "SELECT tgname FROM pg_catalog.pg_trigger WHERE substr(tgname,1,%d)='%s'"}, > {"TYPE", "SELECT typname FROM pg_catalog.pg_type WHERE substr(typname,1,%d)='%s'"}, 149,150c148,149 < {"USER", "SELECT usename FROM pg_user WHERE substr(usename,1,%d)='%s'"}, < {"VIEW", "SELECT viewname FROM pg_views WHERE substr(viewname,1,%d)='%s'"}, --- > {"USER", "SELECT usename FROM pg_catalog.pg_user WHERE substr(usename,1,%d)='%s'"}, > {"VIEW", "SELECT viewname FROM pg_catalog.pg_views WHERE substr(viewname,1,%d)='%s'"}, 157c156 < #define Query_for_list_of_tables words_after_create[8].query --- > #define Query_for_list_of_tables words_after_create[9].query 160,161c159,160 < #define Query_for_list_of_attributes "SELECT a.attname FROM pg_attribute a, pg_class c WHERE c.oid = a.attrelid and a.attnum>0 and substr(a.attname,1,%d)='%s' and c.relname='%s'" < #define Query_for_list_of_users words_after_create[13].query --- > #define Query_for_list_of_attributes "SELECT a.attname FROM pg_catalog.pg_attribute a, pg_catalog.pg_class c WHERE c.oid = a.attrelid and a.attnum>0 and substr(a.attname,1,%d)='%s' and c.relname='%s'" > #define Query_for_list_of_users words_after_create[14].query 324c323 < char *list_ALTER[] = {"GROUP", "TABLE", "USER", NULL}; --- > char *list_ALTER[] = {"GROUP", "SCHEMA", "TABLE", "USER", NULL}; 330,331c329 < * If we detect ALTER TABLE , suggest either ADD, ALTER, or < * RENAME --- > * If we detect ALTER TABLE , suggest either ADD, ALTER, or RENAME 379c377 < "SELECT c1.relname FROM pg_class c1, pg_class c2, pg_index i WHERE c1.oid=i.indrelid and i.indexrelid=c2.oid and c2.relname='%s'", --- > "SELECT c1.relname FROM pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i WHERE c1.oid=i.indrelid and i.indexrelid=c2.oid and c2.relname='%s'", 392c390 < {"DATABASE", "INDEX", "RULE", "SEQUENCE", "TABLE", "TYPE", "VIEW", --- > {"DATABASE", "INDEX", "RULE", "SCHEMA", "SEQUENCE", "TABLE", "TYPE", "VIEW", 436c434 < else if ((strcasecmp(prev4_wd, "INDEX") == 0 && strcasecmp(prev2_wd, "ON") == 0)) --- > else if (strcasecmp(prev4_wd, "INDEX") == 0 && strcasecmp(prev2_wd, "ON") == 0) 567c565 < * sequences, and indexes --- > * schema, sequences, and indexes 571c569,570 < COMPLETE_WITH_QUERY("SELECT relname FROM pg_class WHERE relkind in ('r','i','S','v') and substr(relname,1,%d)='%s'"); --- > COMPLETE_WITH_QUERY("SELECT relname FROM pg_catalog.pg_class WHERE relkind in ('r','i','S','v') AND substr(relname,1,%d)='%s' > UNION SELECT nspname FROM pg_catalog.pg_namespace;"); 590a590,592 > /* Complete "INSERT INTO (" with attribute names */ > else if (rl_line_buffer[start-1]=='(' && strcasecmp(prev3_wd, "INSERT") == 0 && strcasecmp(prev2_wd, "INTO") == 0) > COMPLETE_WITH_ATTR(prev_wd); 599d600 < 601a603,610 > /* Complete INSERT INTO
(attribs) with "VALUES" or "SELECT" */ > else if (strcasecmp(prev4_wd, "INSERT") == 0 && strcasecmp(prev3_wd, "INTO") == 0 && > prev_wd[strlen(prev_wd)-1]==')') > { > char *list_INSERT[] = {"SELECT", "VALUES", NULL}; > COMPLETE_WITH_LIST(list_INSERT); > } > 607,608c616,618 < /* Complete with list of tables */ < else if (strcasecmp(prev_wd, "LOCK") == 0) --- > /* Complete LOCK [TABLE] with a list of tables */ > else if ((strcasecmp(prev_wd, "LOCK") == 0) || > (strcasecmp(prev_wd, "TABLE") == 0 && strcasecmp(prev2_wd, "LOCK"))) 610c620,637 < /* (If you want more with LOCK, you better think about it yourself.) */ --- > > /* For the following, handle the case of a single table only for now */ > > /* Complete LOCK [TABLE]
with "IN" */ > else if ((strcasecmp(prev2_wd, "LOCK") == 0 && strcasecmp(prev_wd, "TABLE")) || > (strcasecmp(prev2_wd, "TABLE") == 0 && strcasecmp(prev3_wd, "LOCK") == 0)) > COMPLETE_WITH_CONST("IN"); > > /* Complete LOCK [TABLE]
IN with a lock mode */ > else if (strcasecmp(prev_wd, "IN") == 0 && > (strcasecmp(prev3_wd, "LOCK") == 0 || > (strcasecmp(prev3_wd, "TABLE") == 0 && strcasecmp(prev3_wd, "LOCK")))) > { > char *lock_modes[] = {"ACCESS SHARE MODE", "ROW SHARE MODE", "ROW EXCLUSIVE MODE", > "SHARE UPDATE EXCLUSIVE MODE", "SHARE MODE", "SHARE ROW EXCLUSIVE MODE", > "EXCLUSIVE MODE", "ACCESS EXCLUSIVE MODE", NULL}; > COMPLETE_WITH_LIST(lock_modes); > } 614c641 < COMPLETE_WITH_QUERY("SELECT relname FROM pg_listener WHERE substr(relname,1,%d)='%s'"); --- > COMPLETE_WITH_QUERY("SELECT relname FROM pg_catalog.pg_listener WHERE substr(relname,1,%d)='%s'"); 718c745 < COMPLETE_WITH_QUERY("SELECT relname FROM pg_listener WHERE substr(relname,1,%d)='%s' UNION SELECT '*'::text"); --- > COMPLETE_WITH_QUERY("SELECT relname FROM pg_catalog.pg_listener WHERE substr(relname,1,%d)='%s' UNION SELECT '*'::text"); 738c765 < COMPLETE_WITH_QUERY("SELECT relname FROM pg_class WHERE relkind='r' and substr(relname,1,%d)='%s' UNION SELECT 'FULL'::text UNION SELECT 'ANALYZE'::text"); --- > COMPLETE_WITH_QUERY("SELECT relname FROM pg_catalog.pg_class WHERE relkind='r' and substr(relname,1,%d)='%s' UNION SELECT 'FULL'::text UNION SELECT 'ANALYZE'::text"); 741a769,773 > /* WHERE */ > /* Simple case of the word before the where being the table name */ > else if (strcasecmp(prev_wd, "WHERE") == 0) > COMPLETE_WITH_ATTR(prev2_wd); > 1011,1012d1042 < TODO: Take account of quotes. (Right now, if you table names contain spaces < you're screwed.) 1019c1049,1050 < end = -1; --- > end = -1, > inquotes=0; 1049,1051c1080,1085 < for (start = end; start > 0; start--) < if (rl_line_buffer[start - 1] == ' ') < break; --- > for (start = end; start > 0; start--) { > if (rl_line_buffer[start] == '"') > inquotes = !inquotes; > if ((rl_line_buffer[start - 1] == ' ') && inquotes==0) > break; > }