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 <table> */
  	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 <table> */
  	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 <table> (" 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 <table> (" with attribute names */
  	else if (pg_strcasecmp(prev4_wd, "INSERT") == 0 &&
  			 pg_strcasecmp(prev3_wd, "INTO") == 0 &&
