@@ -1894,8 +1894,11 @@ psql_completion(const char *text, int start, int end)
18941894else if (Matches5 ("ALTER" ,"GROUP" ,MatchAny ,"ADD|DROP" ,"USER" ))
18951895COMPLETE_WITH_QUERY (Query_for_list_of_roles );
18961896
1897- /* BEGIN, END, ABORT */
1898- else if (Matches1 ("BEGIN|END|ABORT" ))
1897+ /* BEGIN */
1898+ else if (Matches1 ("BEGIN" ))
1899+ COMPLETE_WITH_LIST6 ("WORK" ,"TRANSACTION" ,"ISOLATION LEVEL" ,"READ" ,"DEFERRABLE" ,"NOT DEFERRABLE" );
1900+ /* END, ABORT */
1901+ else if (Matches1 ("END|ABORT" ))
18991902COMPLETE_WITH_LIST2 ("WORK" ,"TRANSACTION" );
19001903/* COMMIT */
19011904else if (Matches1 ("COMMIT" ))
@@ -2762,20 +2765,36 @@ psql_completion(const char *text, int start, int end)
27622765else if (Matches1 ("SHOW" ))
27632766COMPLETE_WITH_QUERY (Query_for_list_of_show_vars );
27642767/* Complete "SET TRANSACTION" */
2765- else if (Matches2 ("SET|BEGIN|START" ,"TRANSACTION" )||
2768+ else if (Matches2 ("SET" ,"TRANSACTION" ))
2769+ COMPLETE_WITH_LIST5 ("SNAPSHOT" ,"ISOLATION LEVEL" ,"READ" ,"DEFERRABLE" ,"NOT DEFERRABLE" );
2770+ else if (Matches2 ("BEGIN|START" ,"TRANSACTION" )||
27662771Matches2 ("BEGIN" ,"WORK" )||
2772+ Matches1 ("BEGIN" )||
27672773Matches5 ("SET" ,"SESSION" ,"CHARACTERISTICS" ,"AS" ,"TRANSACTION" ))
2768- COMPLETE_WITH_LIST2 ("ISOLATION LEVEL" ,"READ" );
2774+ COMPLETE_WITH_LIST4 ("ISOLATION LEVEL" ,"READ" ,"DEFERRABLE" ,"NOT DEFERRABLE" );
2775+ else if (Matches3 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"NOT" )||
2776+ Matches2 ("BEGIN" ,"NOT" )||
2777+ Matches6 ("SET" ,"SESSION" ,"CHARACTERISTICS" ,"AS" ,"TRANSACTION" ,"NOT" ))
2778+ COMPLETE_WITH_CONST ("DEFERRABLE" );
27692779else if (Matches3 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"ISOLATION" )||
2780+ Matches2 ("BEGIN" ,"ISOLATION" )||
27702781Matches6 ("SET" ,"SESSION" ,"CHARACTERISTICS" ,"AS" ,"TRANSACTION" ,"ISOLATION" ))
27712782COMPLETE_WITH_CONST ("LEVEL" );
2772- else if (Matches4 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"ISOLATION" ,"LEVEL" ))
2783+ else if (Matches4 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"ISOLATION" ,"LEVEL" )||
2784+ Matches3 ("BEGIN" ,"ISOLATION" ,"LEVEL" )||
2785+ Matches7 ("SET" ,"SESSION" ,"CHARACTERISTICS" ,"AS" ,"TRANSACTION" ,"ISOLATION" ,"LEVEL" ))
27732786COMPLETE_WITH_LIST3 ("READ" ,"REPEATABLE READ" ,"SERIALIZABLE" );
2774- else if (Matches5 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"ISOLATION" ,"LEVEL" ,"READ" ))
2787+ else if (Matches5 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"ISOLATION" ,"LEVEL" ,"READ" )||
2788+ Matches4 ("BEGIN" ,"ISOLATION" ,"LEVEL" ,"READ" )||
2789+ Matches8 ("SET" ,"SESSION" ,"CHARACTERISTICS" ,"AS" ,"TRANSACTION" ,"ISOLATION" ,"LEVEL" ,"READ" ))
27752790COMPLETE_WITH_LIST2 ("UNCOMMITTED" ,"COMMITTED" );
2776- else if (Matches5 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"ISOLATION" ,"LEVEL" ,"REPEATABLE" ))
2791+ else if (Matches5 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"ISOLATION" ,"LEVEL" ,"REPEATABLE" )||
2792+ Matches4 ("BEGIN" ,"ISOLATION" ,"LEVEL" ,"REPEATABLE" )||
2793+ Matches8 ("SET" ,"SESSION" ,"CHARACTERISTICS" ,"AS" ,"TRANSACTION" ,"ISOLATION" ,"LEVEL" ,"REPEATABLE" ))
27772794COMPLETE_WITH_CONST ("READ" );
2778- else if (Matches3 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"READ" ))
2795+ else if (Matches3 ("SET|BEGIN|START" ,"TRANSACTION|WORK" ,"READ" )||
2796+ Matches2 ("BEGIN" ,"READ" )||
2797+ Matches6 ("SET" ,"SESSION" ,"CHARACTERISTICS" ,"AS" ,"TRANSACTION" ,"READ" ))
27792798COMPLETE_WITH_LIST2 ("ONLY" ,"WRITE" );
27802799/* SET CONSTRAINTS */
27812800else if (Matches2 ("SET" ,"CONSTRAINTS" ))