Hi!

While playing around with 8.0devel I found it somewhat irritating that psql had no tab-complete support for all tablespace related commands.
Attached is my own poor attempt that adds at least basic support for CREATE/ALTER/DROP and \db.


When looking through the code I found that there seem to be much more places where the tabcomplete-code is not 100% in sync with what the doc's show as possible syntax.
Is there interest in fixing those up (ie qualifing as BUGS that can get fixed during BETA) ? If so I could take a look at those ...



Stefan
Index: src/bin/psql/tab-complete.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/tab-complete.c,v
retrieving revision 1.109
diff -u -r1.109 tab-complete.c
--- src/bin/psql/tab-complete.c 28 Jul 2004 14:23:30 -0000      1.109
+++ src/bin/psql/tab-complete.c 6 Aug 2004 19:52:52 -0000
@@ -328,6 +328,10 @@
 "SELECT pg_catalog.quote_ident(datname) FROM pg_catalog.pg_database "\
 " WHERE substring(pg_catalog.quote_ident(datname),1,%d)='%s'"
 
+#define Query_for_list_of_tablespaces \
+"SELECT pg_catalog.quote_ident(spcname) FROM pg_catalog.pg_tablespace "\
+" WHERE substring(pg_catalog.quote_ident(spcname),1,%d)='%s'"
+
 #define Query_for_list_of_encodings \
 " SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\
 "   FROM pg_catalog.pg_conversion "\
@@ -394,6 +398,7 @@
        {"SCHEMA", Query_for_list_of_schemas},
        {"SEQUENCE", NULL, &Query_for_list_of_sequences},
        {"TABLE", NULL, &Query_for_list_of_tables},
+       {"TABLESPACE", Query_for_list_of_tablespaces},
        {"TEMP", NULL, NULL},   /* for CREATE TEMP TABLE ... */
        {"TRIGGER", "SELECT pg_catalog.quote_ident(tgname) FROM pg_catalog.pg_trigger 
WHERE substring(pg_catalog.quote_ident(tgname),1,%d)='%s'"},
        {"TYPE", NULL, &Query_for_list_of_datatypes},
@@ -575,9 +580,9 @@
 
        static const char * const backslash_commands[] = {
                "\\a", "\\connect", "\\C", "\\cd", "\\copy", "\\copyright",
-               "\\d", "\\da", "\\dc", "\\dC", "\\dd", "\\dD", "\\df", "\\dg", "\\di",
-               "\\dl", "\\dn", "\\do", "\\dp", "\\ds", "\\dS", "\\dt", "\\dT",
-               "\\dv", "\\du",
+               "\\d", "\\da", "\\db", "\\dc", "\\dC", "\\dd", "\\dD", "\\df",
+               "\\dg", "\\di", "\\dl", "\\dn", "\\do", "\\dp", "\\ds", "\\dS",
+               "\\dt", "\\dT", "\\dv", "\\du",
                "\\e", "\\echo", "\\encoding",
                "\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l",
                "\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink",
@@ -632,7 +637,7 @@
                         pg_strcasecmp(prev3_wd, "TABLE") != 0)
        {
                static const char *const list_ALTER[] =
-               {"DATABASE", "GROUP", "SCHEMA", "TABLE", "TRIGGER", "USER", NULL};
+               {"DATABASE", "GROUP", "SCHEMA", "TABLE", "TABLESPACE", "TRIGGER", 
"USER", NULL};
 
                COMPLETE_WITH_LIST(list_ALTER);
        }
@@ -691,6 +696,16 @@
                         pg_strcasecmp(prev2_wd, "DROP") == 0 &&
                         pg_strcasecmp(prev_wd, "COLUMN") == 0)
                COMPLETE_WITH_ATTR(prev3_wd);
+       
+       /* 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 GROUP <foo> with ADD or DROP */
        else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 &&
@@ -985,7 +1000,8 @@
                                                                   " UNION SELECT 
'DATABASE'"
                                                                   " UNION SELECT 
'FUNCTION'"
                                                                   " UNION SELECT 
'LANGUAGE'"
-                                                                  " UNION SELECT 
'SCHEMA'");
+                                                                  " UNION SELECT 
'SCHEMA'"
+                                                                  " UNION SELECT 
'TABLESPACE'");
 
        /* Complete "GRANT/REVOKE * ON * " with "TO" */
        else if ((pg_strcasecmp(prev4_wd, "GRANT") == 0 ||
@@ -1000,6 +1016,8 @@
                        COMPLETE_WITH_QUERY(Query_for_list_of_languages);
                else if (pg_strcasecmp(prev_wd, "SCHEMA") == 0)
                        COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+               else if (pg_strcasecmp(prev_wd, "TABLESPACE") == 0)
+                       COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
                else
                        COMPLETE_WITH_CONST("TO");
        }
@@ -1007,7 +1025,7 @@
        /*
         * TODO: to complete with user name we need prev5_wd -- wait for a
         * more general solution there same for GRANT <sth> ON { DATABASE |
-        * FUNCTION | LANGUAGE | SCHEMA } xxx TO
+        * FUNCTION | LANGUAGE | SCHEMA | TABLESPACE } xxx TO
         */
 
 /* INSERT */
@@ -1295,6 +1313,8 @@
                COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tisv, NULL);
        else if (strcmp(prev_wd, "\\da") == 0)
                COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_aggregates, NULL);
+       else if (strcmp(prev_wd, "\\db") == 0)
+               COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
        else if (strcmp(prev_wd, "\\dD") == 0)
                COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, NULL);
        else if (strcmp(prev_wd, "\\df") == 0 || strcmp(prev_wd, "\\df+") == 0)
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to [EMAIL PROTECTED] so that your
      message can get through to the mailing list cleanly

Reply via email to