diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c new file mode 100644 index ae8f837..2841bf3 *** a/src/bin/psql/tab-complete.c --- b/src/bin/psql/tab-complete.c *************** static const SchemaQuery Query_for_list_ *** 369,415 **** NULL }; ! /* The bit masks for the following three functions come from ! * src/include/catalog/pg_trigger.h. ! */ ! static const SchemaQuery Query_for_list_of_insertables = { ! /* catname */ ! "pg_catalog.pg_class c", ! /* selcondition */ ! "(c.relkind = 'r' OR (c.relkind = 'v' AND c.relhastriggers AND EXISTS " ! "(SELECT 1 FROM pg_catalog.pg_trigger t WHERE t.tgrelid = c.oid AND t.tgtype & (1 << 2) <> 0)))", ! /* viscondition */ ! "pg_catalog.pg_table_is_visible(c.oid)", ! /* namespace */ ! "c.relnamespace", ! /* result */ ! "pg_catalog.quote_ident(c.relname)", ! /* qualresult */ ! NULL ! }; ! ! static const SchemaQuery Query_for_list_of_deletables = { ! /* catname */ ! "pg_catalog.pg_class c", ! /* selcondition */ ! "(c.relkind = 'r' OR (c.relkind = 'v' AND c.relhastriggers AND EXISTS " ! "(SELECT 1 FROM pg_catalog.pg_trigger t WHERE t.tgrelid = c.oid AND t.tgtype & (1 << 3) <> 0)))", ! /* viscondition */ ! "pg_catalog.pg_table_is_visible(c.oid)", ! /* namespace */ ! "c.relnamespace", ! /* result */ ! "pg_catalog.quote_ident(c.relname)", ! /* qualresult */ ! NULL ! }; ! static const SchemaQuery Query_for_list_of_updatables = { /* catname */ "pg_catalog.pg_class c", /* selcondition */ ! "(c.relkind = 'r' OR (c.relkind = 'v' AND c.relhastriggers AND EXISTS " ! "(SELECT 1 FROM pg_catalog.pg_trigger t WHERE t.tgrelid = c.oid AND t.tgtype & (1 << 4) <> 0)))", /* viscondition */ "pg_catalog.pg_table_is_visible(c.oid)", /* namespace */ --- 369,380 ---- NULL }; ! /* Relations supporting INSERT, UPDATE or DELETE */ static const SchemaQuery Query_for_list_of_updatables = { /* catname */ "pg_catalog.pg_class c", /* selcondition */ ! "c.relkind IN ('r', 'f', 'v')", /* viscondition */ "pg_catalog.pg_table_is_visible(c.oid)", /* namespace */ *************** psql_completion(char *text, int start, i *** 2362,2368 **** /* Complete DELETE FROM with a list of tables */ else if (pg_strcasecmp(prev2_wd, "DELETE") == 0 && pg_strcasecmp(prev_wd, "FROM") == 0) ! COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_deletables, NULL); /* Complete DELETE FROM */ else if (pg_strcasecmp(prev3_wd, "DELETE") == 0 && pg_strcasecmp(prev2_wd, "FROM") == 0) --- 2327,2333 ---- /* Complete DELETE FROM with a list of tables */ else if (pg_strcasecmp(prev2_wd, "DELETE") == 0 && pg_strcasecmp(prev_wd, "FROM") == 0) ! COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); /* Complete DELETE FROM
*/ else if (pg_strcasecmp(prev3_wd, "DELETE") == 0 && pg_strcasecmp(prev2_wd, "FROM") == 0) *************** psql_completion(char *text, int start, i *** 2732,2738 **** /* Complete INSERT INTO with table names */ else if (pg_strcasecmp(prev2_wd, "INSERT") == 0 && pg_strcasecmp(prev_wd, "INTO") == 0) ! COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_insertables, NULL); /* Complete "INSERT INTO
(" with attribute names */ else if (pg_strcasecmp(prev4_wd, "INSERT") == 0 && pg_strcasecmp(prev3_wd, "INTO") == 0 && --- 2697,2703 ---- /* Complete INSERT INTO with table names */ else if (pg_strcasecmp(prev2_wd, "INSERT") == 0 && pg_strcasecmp(prev_wd, "INTO") == 0) ! COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); /* Complete "INSERT INTO
(" with attribute names */ else if (pg_strcasecmp(prev4_wd, "INSERT") == 0 && pg_strcasecmp(prev3_wd, "INTO") == 0 &&