diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 5238a96..557826e 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1580,7 +1580,7 @@ psql_completion(const char *text, int start, int end) /* complete with something you can create or replace */ else if (TailMatches("CREATE", "OR", "REPLACE")) COMPLETE_WITH("FUNCTION", "PROCEDURE", "LANGUAGE", "RULE", "VIEW", - "AGGREGATE", "TRANSFORM"); + "AGGREGATE", "TRANSFORM", "TRIGGER"); /* DROP, but not DROP embedded in other commands */ /* complete with something you can drop */ @@ -2712,31 +2712,39 @@ psql_completion(const char *text, int start, int end) "slot_name", "synchronous_commit"); /* CREATE TRIGGER --- is allowed inside CREATE SCHEMA, so use TailMatches */ - /* complete CREATE TRIGGER with BEFORE,AFTER,INSTEAD OF */ - else if (TailMatches("CREATE", "TRIGGER", MatchAny)) + /* complete CREATE [ OR REPLACE ] TRIGGER with BEFORE,AFTER,INSTEAD OF */ + else if (TailMatches("CREATE", "TRIGGER", MatchAny) || + TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny)) COMPLETE_WITH("BEFORE", "AFTER", "INSTEAD OF"); - /* complete CREATE TRIGGER BEFORE,AFTER with an event */ - else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER")) + /* complete CREATE [ OR REPLACE ] TRIGGER BEFORE,AFTER with an event */ + else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER") || + TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER")) COMPLETE_WITH("INSERT", "DELETE", "UPDATE", "TRUNCATE"); - /* complete CREATE TRIGGER INSTEAD OF with an event */ - else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF")) + /* complete CREATE [ OR REPLACE ] TRIGGER INSTEAD OF with an event */ + else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF") || + TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF")) COMPLETE_WITH("INSERT", "DELETE", "UPDATE"); - /* complete CREATE TRIGGER BEFORE,AFTER sth with OR,ON */ + /* complete CREATE [ OR REPLACE ] TRIGGER BEFORE,AFTER sth with OR,ON */ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny) || - TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny)) + TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny) || + TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny) || + TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny)) COMPLETE_WITH("ON", "OR"); /* - * complete CREATE TRIGGER BEFORE,AFTER event ON with a list of + * complete CREATE [ OR REPLACE ] TRIGGER BEFORE,AFTER event ON with a list of * tables. EXECUTE FUNCTION is the recommended grammar instead of EXECUTE * PROCEDURE in version 11 and upwards. */ - else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON")) + else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON") || + TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); - /* complete CREATE TRIGGER ... INSTEAD OF event ON with a list of views */ - else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON")) + /* complete CREATE [ OR REPLACE ] TRIGGER ... INSTEAD OF event ON with a list of views */ + else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON") || + TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); - else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("ON", MatchAny)) + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && + TailMatches("ON", MatchAny)) { if (pset.sversion >= 110000) COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY", @@ -2745,7 +2753,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY", "REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE"); } - else if (HeadMatches("CREATE", "TRIGGER") && + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && (TailMatches("DEFERRABLE") || TailMatches("INITIALLY", "IMMEDIATE|DEFERRED"))) { if (pset.sversion >= 110000) @@ -2753,11 +2761,13 @@ psql_completion(const char *text, int start, int end) else COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE"); } - else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("REFERENCING")) + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE","TRIGGER")) && + TailMatches("REFERENCING")) COMPLETE_WITH("OLD TABLE", "NEW TABLE"); - else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("OLD|NEW", "TABLE")) + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && + TailMatches("OLD|NEW", "TABLE")) COMPLETE_WITH("AS"); - else if (HeadMatches("CREATE", "TRIGGER") && + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && (TailMatches("REFERENCING", "OLD", "TABLE", "AS", MatchAny) || TailMatches("REFERENCING", "OLD", "TABLE", MatchAny))) { @@ -2766,7 +2776,7 @@ psql_completion(const char *text, int start, int end) else COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE"); } - else if (HeadMatches("CREATE", "TRIGGER") && + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && (TailMatches("REFERENCING", "NEW", "TABLE", "AS", MatchAny) || TailMatches("REFERENCING", "NEW", "TABLE", MatchAny))) { @@ -2775,7 +2785,7 @@ psql_completion(const char *text, int start, int end) else COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE"); } - else if (HeadMatches("CREATE", "TRIGGER") && + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && (TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) || TailMatches("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) || TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", MatchAny) || @@ -2786,11 +2796,11 @@ psql_completion(const char *text, int start, int end) else COMPLETE_WITH("FOR", "WHEN (", "EXECUTE PROCEDURE"); } - else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("FOR")) + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && TailMatches("FOR")) COMPLETE_WITH("EACH", "ROW", "STATEMENT"); - else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("FOR", "EACH")) + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && TailMatches("FOR", "EACH")) COMPLETE_WITH("ROW", "STATEMENT"); - else if (HeadMatches("CREATE", "TRIGGER") && + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && (TailMatches("FOR", "EACH", "ROW|STATEMENT") || TailMatches("FOR", "ROW|STATEMENT"))) { @@ -2799,22 +2809,22 @@ psql_completion(const char *text, int start, int end) else COMPLETE_WITH("WHEN (", "EXECUTE PROCEDURE"); } - else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("WHEN", "(*)")) + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && TailMatches("WHEN", "(*)")) { if (pset.sversion >= 110000) COMPLETE_WITH("EXECUTE FUNCTION"); else COMPLETE_WITH("EXECUTE PROCEDURE"); } - /* complete CREATE TRIGGER ... EXECUTE with PROCEDURE|FUNCTION */ - else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("EXECUTE")) + /* complete CREATE [ OR REPLACE ] TRIGGER ... EXECUTE with PROCEDURE|FUNCTION */ + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && TailMatches("EXECUTE")) { if (pset.sversion >= 110000) COMPLETE_WITH("FUNCTION"); else COMPLETE_WITH("PROCEDURE"); } - else if (HeadMatches("CREATE", "TRIGGER") && + else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && TailMatches("EXECUTE", "FUNCTION|PROCEDURE")) COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL);