3
3
*
4
4
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
5
5
*
6
- * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.146 2006/02/12 03:22:19 momjian Exp $
6
+ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.147 2006/02/12 07:21:40 momjian Exp $
7
7
*/
8
8
9
9
/*----------------------------------------------------------------------
@@ -140,14 +140,16 @@ static const SchemaQuery *completion_squery; /* to pass a SchemaQuery */
140
140
*/
141
141
#define COMPLETE_WITH_QUERY (query ) \
142
142
do { completion_charp = query; matches = completion_matches(text, complete_from_query); } while(0)
143
- #define COMPLETE_WITH_SCHEMA_QUERY (query ,addon ) \
143
+ #define COMPLETE_WITH_QUERY_ADDON (query , addon ) \
144
+ do { completion_charp = query addon; matches = completion_matches(text, complete_from_query); } while(0)
145
+ #define COMPLETE_WITH_SCHEMA_QUERY (query , addon ) \
144
146
do { completion_squery = &(query); completion_charp = addon; matches = completion_matches(text, complete_from_schema_query); } while(0)
145
147
#define COMPLETE_WITH_LIST (list ) \
146
148
do { completion_charpp = list; matches = completion_matches(text, complete_from_list); } while(0)
147
149
#define COMPLETE_WITH_CONST (string ) \
148
150
do { completion_charp = string; matches = completion_matches(text, complete_from_const); } while(0)
149
- #define COMPLETE_WITH_ATTR (table ) \
150
- do {completion_charp = Query_for_list_of_attributes; completion_info_charp = table; matches = completion_matches(text, complete_from_query); } while(0)
151
+ #define COMPLETE_WITH_ATTR (table , addon ) \
152
+ do {completion_charp = Query_for_list_of_attributes addon ; completion_info_charp = table; matches = completion_matches(text, complete_from_query); } while(0)
151
153
152
154
/*
153
155
* Assembly instructions for schema queries
@@ -754,14 +756,28 @@ psql_completion(char *text, int start, int end)
754
756
else if (pg_strcasecmp (prev3_wd , "TABLE" ) == 0 &&
755
757
(pg_strcasecmp (prev_wd , "ALTER" ) == 0 ||
756
758
pg_strcasecmp (prev_wd , "RENAME" ) == 0 ))
757
- COMPLETE_WITH_ATTR (prev2_wd );
759
+ COMPLETE_WITH_ATTR (prev2_wd , " UNION SELECT 'COLUMN'" );
758
760
761
+ /* If we have TABLE <sth> ALTER COLUMN|RENAME COLUMN, provide list of columns */
762
+ else if (pg_strcasecmp (prev4_wd , "TABLE" ) == 0 &&
763
+ (pg_strcasecmp (prev2_wd , "ALTER" ) == 0 ||
764
+ pg_strcasecmp (prev2_wd , "RENAME" ) == 0 ) &&
765
+ pg_strcasecmp (prev_wd , "COLUMN" ) == 0 )
766
+ COMPLETE_WITH_ATTR (prev3_wd , "" );
767
+
759
768
/* ALTER TABLE xxx RENAME yyy */
760
769
else if (pg_strcasecmp (prev4_wd , "TABLE" ) == 0 &&
761
770
pg_strcasecmp (prev2_wd , "RENAME" ) == 0 &&
762
771
pg_strcasecmp (prev_wd , "TO" ) != 0 )
763
772
COMPLETE_WITH_CONST ("TO" );
764
773
774
+ /* ALTER TABLE xxx RENAME COLUMN yyy */
775
+ else if (pg_strcasecmp (prev5_wd , "TABLE" ) == 0 &&
776
+ pg_strcasecmp (prev3_wd , "RENAME" ) == 0 &&
777
+ pg_strcasecmp (prev2_wd , "COLUMN" ) == 0 &&
778
+ pg_strcasecmp (prev_wd , "TO" ) != 0 )
779
+ COMPLETE_WITH_CONST ("TO" );
780
+
765
781
/* If we have TABLE <sth> DROP, provide COLUMN or CONSTRAINT */
766
782
else if (pg_strcasecmp (prev3_wd , "TABLE" ) == 0 &&
767
783
pg_strcasecmp (prev_wd , "DROP" ) == 0 )
@@ -775,7 +791,7 @@ psql_completion(char *text, int start, int end)
775
791
else if (pg_strcasecmp (prev4_wd , "TABLE" ) == 0 &&
776
792
pg_strcasecmp (prev2_wd , "DROP" ) == 0 &&
777
793
pg_strcasecmp (prev_wd , "COLUMN" ) == 0 )
778
- COMPLETE_WITH_ATTR (prev3_wd );
794
+ COMPLETE_WITH_ATTR (prev3_wd , "" );
779
795
/* ALTER TABLE ALTER [COLUMN] <foo> */
780
796
else if ((pg_strcasecmp (prev3_wd , "ALTER" ) == 0 &&
781
797
pg_strcasecmp (prev2_wd , "COLUMN" ) == 0 ) ||
@@ -1021,18 +1037,18 @@ psql_completion(char *text, int start, int end)
1021
1037
pg_strcasecmp (prev2_wd , "ON" ) == 0 )
1022
1038
{
1023
1039
if (find_open_parenthesis (end ))
1024
- COMPLETE_WITH_ATTR (prev_wd );
1040
+ COMPLETE_WITH_ATTR (prev_wd , "" );
1025
1041
else
1026
1042
COMPLETE_WITH_CONST ("(" );
1027
1043
}
1028
1044
else if (pg_strcasecmp (prev5_wd , "INDEX" ) == 0 &&
1029
1045
pg_strcasecmp (prev3_wd , "ON" ) == 0 &&
1030
1046
pg_strcasecmp (prev_wd , "(" ) == 0 )
1031
- COMPLETE_WITH_ATTR (prev2_wd );
1047
+ COMPLETE_WITH_ATTR (prev2_wd , "" );
1032
1048
/* same if you put in USING */
1033
1049
else if (pg_strcasecmp (prev4_wd , "ON" ) == 0 &&
1034
1050
pg_strcasecmp (prev2_wd , "USING" ) == 0 )
1035
- COMPLETE_WITH_ATTR (prev3_wd );
1051
+ COMPLETE_WITH_ATTR (prev3_wd , "" );
1036
1052
/* Complete USING with an index method */
1037
1053
else if (pg_strcasecmp (prev_wd , "USING" ) == 0 )
1038
1054
{
@@ -1420,7 +1436,7 @@ psql_completion(char *text, int start, int end)
1420
1436
else if (rl_line_buffer [start - 1 ] == '(' &&
1421
1437
pg_strcasecmp (prev3_wd , "INSERT" ) == 0 &&
1422
1438
pg_strcasecmp (prev2_wd , "INTO" ) == 0 )
1423
- COMPLETE_WITH_ATTR (prev_wd );
1439
+ COMPLETE_WITH_ATTR (prev_wd , "" );
1424
1440
1425
1441
/*
1426
1442
* Complete INSERT INTO <table> with "VALUES" or "SELECT" or "DEFAULT
@@ -1452,10 +1468,12 @@ psql_completion(char *text, int start, int end)
1452
1468
1453
1469
/* LOCK */
1454
1470
/* Complete LOCK [TABLE] with a list of tables */
1455
- else if (pg_strcasecmp (prev_wd , "LOCK" ) == 0 ||
1456
- (pg_strcasecmp (prev_wd , "TABLE" ) == 0 &&
1457
- pg_strcasecmp (prev2_wd , "LOCK" ) == 0 ))
1458
- COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables , NULL );
1471
+ else if (pg_strcasecmp (prev_wd , "LOCK" ) == 0 )
1472
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables ,
1473
+ " UNION SELECT 'TABLE'" );
1474
+ else if (pg_strcasecmp (prev_wd , "TABLE" ) == 0 &&
1475
+ pg_strcasecmp (prev2_wd , "LOCK" ) == 0 )
1476
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables , "" );
1459
1477
1460
1478
/* For the following, handle the case of a single table only for now */
1461
1479
@@ -1498,7 +1516,7 @@ psql_completion(char *text, int start, int end)
1498
1516
else if (pg_strcasecmp (prev4_wd , "FROM" ) == 0 &&
1499
1517
pg_strcasecmp (prev2_wd , "ORDER" ) == 0 &&
1500
1518
pg_strcasecmp (prev_wd , "BY" ) == 0 )
1501
- COMPLETE_WITH_ATTR (prev3_wd );
1519
+ COMPLETE_WITH_ATTR (prev3_wd , "" );
1502
1520
1503
1521
/* PREPARE xx AS */
1504
1522
else if (pg_strcasecmp (prev_wd , "AS" ) == 0 &&
@@ -1639,7 +1657,7 @@ psql_completion(char *text, int start, int end)
1639
1657
else if (pg_strcasecmp (prev3_wd , "SET" ) == 0
1640
1658
&& pg_strcasecmp (prev2_wd , "SESSION" ) == 0
1641
1659
&& pg_strcasecmp (prev_wd , "AUTHORIZATION" ) == 0 )
1642
- COMPLETE_WITH_QUERY (Query_for_list_of_roles );
1660
+ COMPLETE_WITH_QUERY_ADDON (Query_for_list_of_roles , " UNION SELECT 'DEFAULT'" );
1643
1661
/* Complete RESET SESSION with AUTHORIZATION */
1644
1662
else if (pg_strcasecmp (prev2_wd , "RESET" ) == 0 &&
1645
1663
pg_strcasecmp (prev_wd , "SESSION" ) == 0 )
@@ -1706,7 +1724,7 @@ psql_completion(char *text, int start, int end)
1706
1724
* make a list of attributes.
1707
1725
*/
1708
1726
else if (pg_strcasecmp (prev_wd , "SET" ) == 0 )
1709
- COMPLETE_WITH_ATTR (prev2_wd );
1727
+ COMPLETE_WITH_ATTR (prev2_wd , "" );
1710
1728
1711
1729
/* UPDATE xx SET yy = */
1712
1730
else if (pg_strcasecmp (prev2_wd , "SET" ) == 0 &&
@@ -1763,7 +1781,7 @@ psql_completion(char *text, int start, int end)
1763
1781
/* WHERE */
1764
1782
/* Simple case of the word before the where being the table name */
1765
1783
else if (pg_strcasecmp (prev_wd , "WHERE" ) == 0 )
1766
- COMPLETE_WITH_ATTR (prev2_wd );
1784
+ COMPLETE_WITH_ATTR (prev2_wd , "" );
1767
1785
1768
1786
/* ... FROM ... */
1769
1787
/* TODO: also include SRF ? */
0 commit comments