@@ -38,6 +38,7 @@ find_query(int query_hash,
3838Oid query_index_rel_oid ;
3939IndexScanDesc query_index_scan ;
4040ScanKeyData key ;
41+ LOCKMODE index_lock = AccessShareLock ;
4142
4243bool find_ok = false;
4344
@@ -51,7 +52,7 @@ find_query(int query_hash,
5152aqo_queries_table_rv = makeRangeVar ("public" ,"aqo_queries" ,-1 );
5253aqo_queries_heap = heap_openrv (aqo_queries_table_rv ,heap_lock );
5354
54- query_index_rel = index_open (query_index_rel_oid ,heap_lock );
55+ query_index_rel = index_open (query_index_rel_oid ,index_lock );
5556query_index_scan = index_beginscan (
5657aqo_queries_heap ,
5758query_index_rel ,
@@ -76,7 +77,7 @@ find_query(int query_hash,
7677search_values ,search_nulls );
7778
7879index_endscan (query_index_scan );
79- index_close (query_index_rel ,heap_lock );
80+ index_close (query_index_rel ,index_lock );
8081heap_close (aqo_queries_heap ,heap_lock );
8182
8283return find_ok ;
@@ -94,6 +95,7 @@ add_query(int query_hash, bool learn_aqo, bool use_aqo,
9495Relation aqo_queries_heap ;
9596HeapTuple tuple ;
9697LOCKMODE heap_lock = RowExclusiveLock ;
98+ LOCKMODE index_lock = RowExclusiveLock ;
9799
98100Datum values [5 ];
99101bool nulls [5 ]= {false, false, false, false, false};
@@ -113,7 +115,7 @@ add_query(int query_hash, bool learn_aqo, bool use_aqo,
113115disable_aqo_for_query ();
114116return false;
115117}
116- query_index_rel = index_open (query_index_rel_oid ,heap_lock );
118+ query_index_rel = index_open (query_index_rel_oid ,index_lock );
117119
118120aqo_queries_table_rv = makeRangeVar ("public" ,"aqo_queries" ,-1 );
119121aqo_queries_heap = heap_openrv (aqo_queries_table_rv ,heap_lock );
@@ -136,7 +138,7 @@ add_query(int query_hash, bool learn_aqo, bool use_aqo,
136138}
137139PG_END_TRY ();
138140
139- index_close (query_index_rel ,heap_lock );
141+ index_close (query_index_rel ,index_lock );
140142heap_close (aqo_queries_heap ,heap_lock );
141143
142144CommandCounterIncrement ();
@@ -158,6 +160,7 @@ update_query(int query_hash, bool learn_aqo, bool use_aqo,
158160Oid query_index_rel_oid ;
159161IndexScanDesc query_index_scan ;
160162ScanKeyData key ;
163+ LOCKMODE index_lock = RowExclusiveLock ;
161164
162165Datum values [5 ];
163166bool nulls [5 ]= {false, false, false, false, false};
@@ -173,7 +176,7 @@ update_query(int query_hash, bool learn_aqo, bool use_aqo,
173176aqo_queries_table_rv = makeRangeVar ("public" ,"aqo_queries" ,-1 );
174177aqo_queries_heap = heap_openrv (aqo_queries_table_rv ,heap_lock );
175178
176- query_index_rel = index_open (query_index_rel_oid ,heap_lock );
179+ query_index_rel = index_open (query_index_rel_oid ,index_lock );
177180query_index_scan = index_beginscan (
178181aqo_queries_heap ,
179182query_index_rel ,
@@ -217,7 +220,7 @@ update_query(int query_hash, bool learn_aqo, bool use_aqo,
217220}
218221
219222index_endscan (query_index_scan );
220- index_close (query_index_rel ,heap_lock );
223+ index_close (query_index_rel ,index_lock );
221224heap_close (aqo_queries_heap ,heap_lock );
222225
223226CommandCounterIncrement ();
@@ -236,6 +239,7 @@ add_query_text(int query_hash, const char *query_text)
236239Relation aqo_query_texts_heap ;
237240HeapTuple tuple ;
238241LOCKMODE heap_lock = RowExclusiveLock ;
242+ LOCKMODE index_lock = RowExclusiveLock ;
239243
240244Datum values [2 ];
241245bool nulls [2 ]= {false, false};
@@ -252,7 +256,7 @@ add_query_text(int query_hash, const char *query_text)
252256disable_aqo_for_query ();
253257return false;
254258}
255- query_index_rel = index_open (query_index_rel_oid ,heap_lock );
259+ query_index_rel = index_open (query_index_rel_oid ,index_lock );
256260
257261aqo_query_texts_table_rv = makeRangeVar ("public" ,
258262"aqo_query_texts" ,
@@ -280,7 +284,7 @@ add_query_text(int query_hash, const char *query_text)
280284PG_END_TRY ();
281285
282286
283- index_close (query_index_rel ,heap_lock );
287+ index_close (query_index_rel ,index_lock );
284288heap_close (aqo_query_texts_heap ,heap_lock );
285289
286290CommandCounterIncrement ();
@@ -315,6 +319,7 @@ load_fss(int fss_hash, int ncols,
315319Oid data_index_rel_oid ;
316320IndexScanDesc data_index_scan ;
317321ScanKeyData * key ;
322+ LOCKMODE index_lock = AccessShareLock ;
318323
319324Datum values [5 ];
320325bool nulls [5 ];
@@ -331,7 +336,7 @@ load_fss(int fss_hash, int ncols,
331336aqo_data_table_rv = makeRangeVar ("public" ,"aqo_data" ,-1 );
332337aqo_data_heap = heap_openrv (aqo_data_table_rv ,heap_lock );
333338
334- data_index_rel = index_open (data_index_rel_oid ,heap_lock );
339+ data_index_rel = index_open (data_index_rel_oid ,index_lock );
335340data_index_scan = index_beginscan (
336341aqo_data_heap ,
337342data_index_rel ,
@@ -380,7 +385,7 @@ load_fss(int fss_hash, int ncols,
380385
381386index_endscan (data_index_scan );
382387
383- index_close (data_index_rel ,heap_lock );
388+ index_close (data_index_rel ,index_lock );
384389heap_close (aqo_data_heap ,heap_lock );
385390
386391pfree (key );
@@ -534,6 +539,7 @@ get_aqo_stat(int query_hash)
534539Oid stat_index_rel_oid ;
535540IndexScanDesc stat_index_scan ;
536541ScanKeyData key ;
542+ LOCKMODE index_lock = AccessShareLock ;
537543
538544Datum values [9 ];
539545bool nulls [9 ];
@@ -550,7 +556,7 @@ get_aqo_stat(int query_hash)
550556aqo_stat_table_rv = makeRangeVar ("public" ,"aqo_query_stat" ,-1 );
551557aqo_stat_heap = heap_openrv (aqo_stat_table_rv ,heap_lock );
552558
553- stat_index_rel = index_open (stat_index_rel_oid ,heap_lock );
559+ stat_index_rel = index_open (stat_index_rel_oid ,index_lock );
554560stat_index_scan = index_beginscan (
555561aqo_stat_heap ,
556562stat_index_rel ,
@@ -586,7 +592,7 @@ get_aqo_stat(int query_hash)
586592
587593index_endscan (stat_index_scan );
588594
589- index_close (stat_index_rel ,heap_lock );
595+ index_close (stat_index_rel ,index_lock );
590596heap_close (aqo_stat_heap ,heap_lock );
591597
592598return stat ;
@@ -707,7 +713,7 @@ update_aqo_stat(int query_hash, QueryStat * stat)
707713
708714index_endscan (stat_index_scan );
709715
710- index_close (stat_index_rel ,heap_lock );
716+ index_close (stat_index_rel ,index_lock );
711717heap_close (aqo_stat_heap ,heap_lock );
712718
713719CommandCounterIncrement ();
@@ -839,6 +845,10 @@ my_simple_heap_update(Relation relation, ItemPointer otid, HeapTuple tup)
839845return false;
840846break ;
841847
848+ case HeapTupleBeingUpdated :
849+ return false;
850+ break ;
851+
842852default :
843853elog (ERROR ,"unrecognized heap_update status: %u" ,result );
844854break ;