"   FROM pg_catalog.pg_prepared_statements "\
 "  WHERE substring(pg_catalog.quote_ident(name),1,%d)='%s'"
 
+#define Query_for_list_of_event_triggers \
+" SELECT pg_catalog.quote_ident(evtname) "\
+"   FROM pg_catalog.pg_event_trigger "\
+"  WHERE substring(pg_catalog.quote_ident(evtname),1,%d)='%s'"
+
 /*
  * This is a list of all "things" in Pgsql, which can show up after CREATE or
  * DROP; and there is also a query to get a list of them.
    {"DATABASE", Query_for_list_of_databases},
    {"DICTIONARY", Query_for_list_of_ts_dictionaries, NULL, THING_NO_SHOW},
    {"DOMAIN", NULL, &Query_for_list_of_domains},
+   {"EVENT TRIGGER", NULL, NULL},
    {"EXTENSION", Query_for_list_of_extensions},
    {"FOREIGN DATA WRAPPER", NULL, NULL},
    {"FOREIGN TABLE", NULL, NULL},
    {
        static const char *const list_ALTER[] =
        {"AGGREGATE", "COLLATION", "CONVERSION", "DATABASE", "DEFAULT PRIVILEGES", "DOMAIN",
-           "EXTENSION", "FOREIGN DATA WRAPPER", "FOREIGN TABLE", "FUNCTION",
+           "EVENT TRIGGER", "EXTENSION", "FOREIGN DATA WRAPPER", "FOREIGN TABLE", "FUNCTION",
            "GROUP", "INDEX", "LANGUAGE", "LARGE OBJECT", "MATERIALIZED VIEW", "OPERATOR",
             "ROLE", "RULE", "SCHEMA", "SERVER", "SEQUENCE", "SYSTEM SET", "TABLE",
            "TABLESPACE", "TEXT SEARCH", "TRIGGER", "TYPE",
        COMPLETE_WITH_LIST(list_ALTERDATABASE);
    }
 
+   /* ALTER EVENT TRIGGER */
+   else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 &&
+            pg_strcasecmp(prev2_wd, "EVENT") == 0 &&
+            pg_strcasecmp(prev_wd, "TRIGGER") == 0)
+   {
+       COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+   }
+
+   /* ALTER EVENT TRIGGER <name> */
+   else if (pg_strcasecmp(prev4_wd, "ALTER") == 0 &&
+            pg_strcasecmp(prev3_wd, "EVENT") == 0 &&
+            pg_strcasecmp(prev2_wd, "TRIGGER") == 0)
+   {
+       static const char *const list_ALTER_EVENT_TRIGGER[] =
+           {"DISABLE", "ENABLE", "OWNER TO", "RENAME TO", NULL};
+
+       COMPLETE_WITH_LIST(list_ALTER_EVENT_TRIGGER);
+   }
+
+   /* ALTER EVENT TRIGGER <name> ENABLE */
+   else if (pg_strcasecmp(prev5_wd, "ALTER") == 0 &&
+            pg_strcasecmp(prev4_wd, "EVENT") == 0 &&
+            pg_strcasecmp(prev3_wd, "TRIGGER") == 0 &&
+            pg_strcasecmp(prev_wd, "ENABLE") == 0)
+   {
+       static const char *const list_ALTER_EVENT_TRIGGER_ENABLE[] =
+           {"REPLICA", "ALWAYS", NULL};
+
+       COMPLETE_WITH_LIST(list_ALTER_EVENT_TRIGGER_ENABLE);
+   }
+
    /* ALTER EXTENSION <name> */
    else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 &&
             pg_strcasecmp(prev2_wd, "EXTENSION") == 0)
        COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
 
    /* ALTER TRIGGER <name> ON <name> */
-   else if (pg_strcasecmp(prev4_wd, "TRIGGER") == 0 &&
+   else if (pg_strcasecmp(prev5_wd, "ALTER") == 0 &&
+            pg_strcasecmp(prev4_wd, "TRIGGER") == 0 &&
             pg_strcasecmp(prev2_wd, "ON") == 0)
        COMPLETE_WITH_CONST("RENAME TO");
 
             pg_strcasecmp(prev_wd, "ON") == 0)
    {
        static const char *const list_COMMENT[] =
-       {"CAST", "COLLATION", "CONVERSION", "DATABASE", "EXTENSION",
+       {"CAST", "COLLATION", "CONVERSION", "DATABASE", "EVENT TRIGGER", "EXTENSION",
            "FOREIGN DATA WRAPPER", "FOREIGN TABLE",
            "SERVER", "INDEX", "LANGUAGE", "RULE", "SCHEMA", "SEQUENCE",
            "TABLE", "TYPE", "VIEW", "MATERIALIZED VIEW", "COLUMN", "AGGREGATE", "FUNCTION",
    {
        COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL);
    }
+   else if (pg_strcasecmp(prev4_wd, "COMMENT") == 0 &&
+            pg_strcasecmp(prev3_wd, "ON") == 0 &&
+            pg_strcasecmp(prev2_wd, "EVENT") == 0 &&
+            pg_strcasecmp(prev_wd, "TRIGGER") == 0)
+   {
+       COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+   }
    else if ((pg_strcasecmp(prev4_wd, "COMMENT") == 0 &&
              pg_strcasecmp(prev3_wd, "ON") == 0) ||
             (pg_strcasecmp(prev5_wd, "COMMENT") == 0 &&
             pg_strcasecmp(prev_wd, "AS") == 0)
        COMPLETE_WITH_CONST("SELECT");
 
+/* CREATE EVENT TRIGGER */
+   else if (pg_strcasecmp(prev2_wd, "CREATE") == 0 &&
+            pg_strcasecmp(prev_wd, "EVENT") == 0)
+       COMPLETE_WITH_CONST("TRIGGER");
+   /* Complete CREATE EVENT TRIGGER <name> with ON */
+   else if (pg_strcasecmp(prev4_wd, "CREATE") == 0 &&
+            pg_strcasecmp(prev3_wd, "EVENT") == 0 &&
+            pg_strcasecmp(prev2_wd, "TRIGGER") == 0)
+       COMPLETE_WITH_CONST("ON");
+   /* Complete CREATE EVENT TRIGGER <name> ON with event_type */
+   else if (pg_strcasecmp(prev5_wd, "CREATE") == 0 &&
+            pg_strcasecmp(prev4_wd, "EVENT") == 0 &&
+            pg_strcasecmp(prev3_wd, "TRIGGER") == 0 &&
+            pg_strcasecmp(prev_wd, "ON") == 0)
+   {
+       static const char *const list_CREATE_EVENT_TRIGGER_ON[] =
+       {"ddl_command_start", "ddl_command_end", "sql_drop", NULL};
+
+       COMPLETE_WITH_LIST(list_CREATE_EVENT_TRIGGER_ON);
+   }
+
 /* DECLARE */
    else if (pg_strcasecmp(prev2_wd, "DECLARE") == 0)
    {
             (pg_strcasecmp(prev4_wd, "DROP") == 0 &&
              pg_strcasecmp(prev3_wd, "AGGREGATE") == 0 &&
              prev_wd[strlen(prev_wd) - 1] == ')') ||
+            (pg_strcasecmp(prev4_wd, "DROP") == 0 &&
+             pg_strcasecmp(prev3_wd, "EVENT") == 0 &&
+             pg_strcasecmp(prev2_wd, "TRIGGER") == 0) ||
             (pg_strcasecmp(prev5_wd, "DROP") == 0 &&
              pg_strcasecmp(prev4_wd, "FOREIGN") == 0 &&
              pg_strcasecmp(prev3_wd, "DATA") == 0 &&
        COMPLETE_WITH_LIST(list_ALTERTEXTSEARCH);
    }
 
+   /* DROP EVENT TRIGGER */
+   else if (pg_strcasecmp(prev2_wd, "DROP") == 0 &&
+            pg_strcasecmp(prev_wd, "EVENT") == 0)
+   {
+       COMPLETE_WITH_CONST("TRIGGER");
+   }
+   else if (pg_strcasecmp(prev3_wd, "DROP") == 0 &&
+            pg_strcasecmp(prev2_wd, "EVENT") == 0 &&
+            pg_strcasecmp(prev_wd, "TRIGGER") == 0)
+   {
+       COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+   }
+
 /* EXECUTE, but not EXECUTE embedded in other commands */
    else if (pg_strcasecmp(prev_wd, "EXECUTE") == 0 &&
             prev2_wd[0] == '\0')