Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita94edb4

Browse files
author
Neil Conway
committed
Some improvements for the tab-completion of psql. This should
address all of the items in the todo list and adds some newthings as well. Specifically:* Add support for ALTER SEQUENCE ...* Add "RENAME TO" for ALTER TRIGGER xx ON yy* Pick proper table for ALTER TRIGGER xx ON ...* Support for ALTER USER xxx ...* Fix ALTER GROUP xxx DROP ...* Fix ALTER DOMAIN xxx DROP ...* Remove "OWNER TO" from ALTER DOMAIN xx DROP ...* Fix ALTER DOMAIN xx SET DEFAULT ..* Prevent ALTER INDEX xxx SET TABLESPACE from using "TO"* Support for ALTER LANGUAGE xxx (RENAME TO)* More support for ALTER TABLE xxx ALTER COLUMN xxx ...* More support for COPYGreg Sabino Mullane
1 parenta3c53c8 commita94edb4

File tree

1 file changed

+125
-15
lines changed

1 file changed

+125
-15
lines changed

‎src/bin/psql/tab-complete.c

Lines changed: 125 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Copyright (c) 2000-2004, PostgreSQL Global Development Group
55
*
6-
* $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.115 2004/09/01 00:10:01 momjian Exp $
6+
* $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.116 2004/09/22 04:25:16 neilc Exp $
77
*/
88

99
/*----------------------------------------------------------------------
@@ -386,6 +386,15 @@ static const SchemaQuery Query_for_list_of_views = {
386386
" and pg_catalog.quote_ident(c1.relname)='%s'"\
387387
" and pg_catalog.pg_table_is_visible(c2.oid)"
388388

389+
/* the silly-looking length condition is just to eat up the current word */
390+
#defineQuery_for_list_of_tables_for_trigger \
391+
"SELECT pg_catalog.quote_ident(relname) "\
392+
" FROM pg_catalog.pg_class"\
393+
" WHERE (%d = length('%s'))"\
394+
" AND oid IN "\
395+
" (SELECT tgrelid FROM pg_catalog.pg_trigger "\
396+
" WHERE pg_catalog.quote_ident(tgname)='%s')"
397+
389398
/*
390399
* This is a list of all "things" in Pgsql, which can show up after CREATE or
391400
* DROP; and there is also a query to get a list of them.
@@ -637,11 +646,13 @@ psql_completion(char *text, int start, int end)
637646
elseif (!prev_wd)
638647
COMPLETE_WITH_LIST(sql_commands);
639648

640-
/* CREATE or DROP but not ALTER TABLE sth DROP */
649+
/* CREATE or DROP but not ALTER(TABLE|DOMAIN|GROUP) sth DROP */
641650
/* complete with something you can create or drop */
642651
elseif (pg_strcasecmp(prev_wd,"CREATE")==0||
643652
(pg_strcasecmp(prev_wd,"DROP")==0&&
644-
pg_strcasecmp(prev3_wd,"TABLE")!=0))
653+
pg_strcasecmp(prev3_wd,"TABLE")!=0&&
654+
pg_strcasecmp(prev3_wd,"DOMAIN")!=0&&
655+
pg_strcasecmp(prev3_wd,"GROUP")!=0))
645656
matches=completion_matches(text,create_command_generator);
646657

647658
/* ALTER */
@@ -694,6 +705,22 @@ psql_completion(char *text, int start, int end)
694705
COMPLETE_WITH_LIST(list_ALTERINDEX);
695706
}
696707

708+
/* ALTER LANGUAGE <name> */
709+
elseif (pg_strcasecmp(prev3_wd,"ALTER")==0&&
710+
pg_strcasecmp(prev2_wd,"LANGUAGE")==0)
711+
COMPLETE_WITH_CONST("RENAME TO");
712+
713+
/* ALTER USER <name> */
714+
elseif (pg_strcasecmp(prev3_wd,"ALTER")==0&&
715+
pg_strcasecmp(prev2_wd,"USER")==0)
716+
{
717+
staticconstchar*constlist_ALTERUSER[]=
718+
{"ENCRYPTED","UNENCRYPTED","CREATEDB","NOCREATEDB","CREATEUSER",
719+
"NOCREATEUSER","VALID UNTIL","RENAME TO","SET","RESET",NULL};
720+
721+
COMPLETE_WITH_LIST(list_ALTERUSER);
722+
}
723+
697724
/* ALTER DOMAIN <name> */
698725
elseif (pg_strcasecmp(prev3_wd,"ALTER")==0&&
699726
pg_strcasecmp(prev2_wd,"DOMAIN")==0)
@@ -709,7 +736,7 @@ psql_completion(char *text, int start, int end)
709736
pg_strcasecmp(prev_wd,"DROP")==0)
710737
{
711738
staticconstchar*constlist_ALTERDOMAIN2[]=
712-
{"CONSTRAINT","DEFAULT","NOT NULL","OWNER TO",NULL};
739+
{"CONSTRAINT","DEFAULT","NOT NULL",NULL};
713740

714741
COMPLETE_WITH_LIST(list_ALTERDOMAIN2);
715742
}
@@ -723,11 +750,36 @@ psql_completion(char *text, int start, int end)
723750

724751
COMPLETE_WITH_LIST(list_ALTERDOMAIN3);
725752
}
753+
/* ALTER SEQUENCE <name> */
754+
elseif (pg_strcasecmp(prev3_wd,"ALTER")==0&&
755+
pg_strcasecmp(prev2_wd,"SEQUENCE")==0)
756+
{
757+
staticconstchar*constlist_ALTERSCHEMA[]=
758+
{"INCREMENT","MINVALUE","MAXVALUE","RESTART","NO","CACHE","CYCLE",NULL};
759+
760+
COMPLETE_WITH_LIST(list_ALTERSCHEMA);
761+
}
762+
/* ALTER SEQUENCE <name> NO */
763+
elseif (pg_strcasecmp(prev4_wd,"ALTER")==0&&
764+
pg_strcasecmp(prev3_wd,"SEQUENCE")==0&&
765+
pg_strcasecmp(prev_wd,"NO")==0)
766+
{
767+
staticconstchar*constlist_ALTERSCHEMA2[]=
768+
{"MINVALUE","MAXVALUE","CYCLE",NULL};
769+
770+
COMPLETE_WITH_LIST(list_ALTERSCHEMA2);
771+
}
726772
/* ALTER TRIGGER <name>, add ON */
727773
elseif (pg_strcasecmp(prev3_wd,"ALTER")==0&&
728-
pg_strcasecmp(prev2_wd,"TRIGGER")==0&&
729-
pg_strcasecmp(prev_wd,"ON")!=0)
774+
pg_strcasecmp(prev2_wd,"TRIGGER")==0)
730775
COMPLETE_WITH_CONST("ON");
776+
777+
elseif (pg_strcasecmp(prev4_wd,"ALTER")==0&&
778+
pg_strcasecmp(prev3_wd,"TRIGGER")==0)
779+
{
780+
completion_info_charp=prev2_wd;
781+
COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger);
782+
}
731783

732784
/*
733785
* If we have ALTER TRIGGER <sth> ON, then add the correct tablename
@@ -737,6 +789,11 @@ psql_completion(char *text, int start, int end)
737789
pg_strcasecmp(prev_wd,"ON")==0)
738790
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables,NULL);
739791

792+
/* ALTER TRIGGER <name> ON <name> */
793+
elseif (pg_strcasecmp(prev4_wd,"TRIGGER")==0&&
794+
pg_strcasecmp(prev2_wd,"ON")==0)
795+
COMPLETE_WITH_CONST("RENAME TO");
796+
740797
/*
741798
* If we detect ALTER TABLE <name>, suggest either ADD, DROP, ALTER,
742799
* RENAME, CLUSTER ON or OWNER
@@ -756,6 +813,11 @@ psql_completion(char *text, int start, int end)
756813
pg_strcasecmp(prev_wd,"RENAME")==0))
757814
COMPLETE_WITH_ATTR(prev2_wd);
758815

816+
/* ALTER TABLE xxx RENAME yyy */
817+
elseif (pg_strcasecmp(prev4_wd,"TABLE")==0&&
818+
pg_strcasecmp(prev2_wd,"RENAME")==0)
819+
COMPLETE_WITH_CONST("TO");
820+
759821
/* If we have TABLE <sth> DROP, provide COLUMN or CONSTRAINT */
760822
elseif (pg_strcasecmp(prev3_wd,"TABLE")==0&&
761823
pg_strcasecmp(prev_wd,"DROP")==0)
@@ -770,6 +832,19 @@ psql_completion(char *text, int start, int end)
770832
pg_strcasecmp(prev2_wd,"DROP")==0&&
771833
pg_strcasecmp(prev_wd,"COLUMN")==0)
772834
COMPLETE_WITH_ATTR(prev3_wd);
835+
/* ALTER TABLE ALTER [COLUMN] <foo> */
836+
elseif ((pg_strcasecmp(prev3_wd,"ALTER")==0&&
837+
pg_strcasecmp(prev2_wd,"COLUMN")==0)||
838+
(pg_strcasecmp(prev4_wd,"TABLE")==0&&
839+
pg_strcasecmp(prev2_wd,"ALTER")==0))
840+
{
841+
/* DROP ... does not work well yet */
842+
staticconstchar*constlist_COLUMNALTER[]=
843+
{"TYPE","SET DEFAULT","DROP DEFAULT","SET NOT NULL",
844+
"DROP NOT NULL","SET STATISTICS","SET STORAGE",NULL};
845+
846+
COMPLETE_WITH_LIST(list_COLUMNALTER);
847+
}
773848
elseif (pg_strcasecmp(prev3_wd,"TABLE")==0&&
774849
pg_strcasecmp(prev_wd,"CLUSTER")==0)
775850
COMPLETE_WITH_CONST("ON");
@@ -817,12 +892,12 @@ psql_completion(char *text, int start, int end)
817892
elseif (pg_strcasecmp(prev3_wd,"ALTER")==0&&
818893
pg_strcasecmp(prev2_wd,"TYPE")==0)
819894
COMPLETE_WITH_CONST("OWNER TO");
820-
/* complete ALTER GROUP <foo>with ADD or DROP*/
895+
/* complete ALTER GROUP <foo> */
821896
elseif (pg_strcasecmp(prev3_wd,"ALTER")==0&&
822897
pg_strcasecmp(prev2_wd,"GROUP")==0)
823898
{
824899
staticconstchar*constlist_ALTERGROUP[]=
825-
{"ADD","DROP",NULL};
900+
{"ADD USER","DROP USER","RENAME TO",NULL};
826901

827902
COMPLETE_WITH_LIST(list_ALTERGROUP);
828903
}
@@ -926,12 +1001,43 @@ psql_completion(char *text, int start, int end)
9261001
elseif (pg_strcasecmp(prev2_wd,"COPY")==0||
9271002
pg_strcasecmp(prev2_wd,"\\copy")==0||
9281003
pg_strcasecmp(prev2_wd,"BINARY")==0)
929-
{
930-
staticconstchar*constlist_FROMTO[]=
931-
{"FROM","TO",NULL};
1004+
{
1005+
staticconstchar*constlist_FROMTO[]=
1006+
{"FROM","TO",NULL};
1007+
1008+
COMPLETE_WITH_LIST(list_FROMTO);
1009+
}
1010+
/* If we have COPY|BINARY <sth> FROM|TO, complete with filename */
1011+
elseif ((pg_strcasecmp(prev3_wd,"COPY")==0||
1012+
pg_strcasecmp(prev3_wd,"\\copy")==0||
1013+
pg_strcasecmp(prev3_wd,"BINARY")==0)&&
1014+
(pg_strcasecmp(prev_wd,"FROM")==0||
1015+
pg_strcasecmp(prev_wd,"TO")==0))
1016+
matches=completion_matches(text,filename_completion_function);
9321017

933-
COMPLETE_WITH_LIST(list_FROMTO);
934-
}
1018+
/* Handle COPY|BINARY <sth> FROM|TO filename */
1019+
elseif ((pg_strcasecmp(prev4_wd,"COPY")==0||
1020+
pg_strcasecmp(prev4_wd,"\\copy")==0||
1021+
pg_strcasecmp(prev4_wd,"BINARY")==0)&&
1022+
(pg_strcasecmp(prev2_wd,"FROM")==0||
1023+
pg_strcasecmp(prev2_wd,"TO")==0))
1024+
{
1025+
staticconstchar*constlist_COPY[]=
1026+
{"BINARY","OIDS","DELIMETER","NULL","CSV",NULL};
1027+
1028+
COMPLETE_WITH_LIST(list_COPY);
1029+
}
1030+
1031+
/* Handle COPY|BINARY <sth> FROM|TO filename CSV */
1032+
elseif (pg_strcasecmp(prev_wd,"CSV")==0&&
1033+
(pg_strcasecmp(prev3_wd,"FROM")==0||
1034+
pg_strcasecmp(prev3_wd,"TO")==0))
1035+
{
1036+
staticconstchar*constlist_CSV[]=
1037+
{"QUOTE","ESCAPE","FORCE QUOTE",NULL};
1038+
1039+
COMPLETE_WITH_LIST(list_CSV);
1040+
}
9351041

9361042
/* CREATE INDEX */
9371043
/* First off we complete CREATE UNIQUE with "INDEX" */
@@ -1353,7 +1459,9 @@ psql_completion(char *text, int start, int end)
13531459
COMPLETE_WITH_QUERY(Query_for_list_of_users);
13541460
/* Complete SET <var> with "TO" */
13551461
elseif (pg_strcasecmp(prev2_wd,"SET")==0&&
1356-
pg_strcasecmp(prev4_wd,"UPDATE")!=0)
1462+
pg_strcasecmp(prev4_wd,"UPDATE")!=0&&
1463+
pg_strcasecmp(prev_wd,"TABLESPACE")!=0&&
1464+
pg_strcasecmp(prev4_wd,"DOMAIN")!=0)
13571465
COMPLETE_WITH_CONST("TO");
13581466
/* Suggest possible variable values */
13591467
elseif (pg_strcasecmp(prev3_wd,"SET")==0&&
@@ -1432,7 +1540,9 @@ psql_completion(char *text, int start, int end)
14321540

14331541
/* ... FROM ... */
14341542
/* TODO: also include SRF ? */
1435-
elseif (pg_strcasecmp(prev_wd,"FROM")==0)
1543+
elseif (pg_strcasecmp(prev_wd,"FROM")==0&&
1544+
pg_strcasecmp(prev3_wd,"COPY")!=0&&
1545+
pg_strcasecmp(prev3_wd,"\\copy")!=0)
14361546
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsv,NULL);
14371547

14381548

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp