@@ -268,6 +268,7 @@ sr_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
268268										& key , & qp_context );
269269	if  (pl_stmt  !=  NULL )
270270	{
271+ 		level -- ;
271272		if  (sr_plan_log_usage  >  0 )
272273			elog (sr_plan_log_usage , "cached plan was used for query: %s" , query_text );
273274
@@ -296,7 +297,10 @@ sr_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
296297	pl_stmt  =  lookup_plan_by_query_hash (snapshot , sr_index_rel , sr_plans_heap ,
297298										& key , & qp_context );
298299	if  (pl_stmt  !=  NULL )
300+ 	{
301+ 		level -- ;
299302		goto cleanup ;
303+ 	}
300304
301305	/* from now on we use this new plan */ 
302306	pl_stmt  =  call_standard_planner ();
@@ -338,33 +342,89 @@ sr_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
338342
339343	if  (!found )
340344	{
345+ 		Relation 	reloids_index_rel ;
346+ 		Oid 			reloids_index_oid ;
347+ 
348+ 		ArrayType   * reloids  =  NULL ;
341349		Datum 		values [Anum_sr_attcount ];
342350		bool 		nulls [Anum_sr_attcount ];
343351
352+ 		int 			reloids_len  =  list_length (pl_stmt -> relationOids );
353+ 
354+ 		/* prepare relation for reloids index too */ 
355+ 		reloids_index_oid  =  sr_get_relname_oid (schema_oid , SR_PLANS_RELOIDS_INDEX );
356+ 		reloids_index_rel  =  index_open (reloids_index_oid , heap_lock );
357+ 
344358		MemSet (nulls , 0 , sizeof (nulls ));
359+ 
345360		values [Anum_sr_query_hash  -  1 ] =  query_hash ;
346361		values [Anum_sr_plan_hash  -  1 ] =  plan_hash ;
347362		values [Anum_sr_query  -  1 ] =  CStringGetTextDatum (query_text );
348363		values [Anum_sr_plan  -  1 ] =  CStringGetTextDatum (plan_text );
349364		values [Anum_sr_enable  -  1 ] =  BoolGetDatum (true);
350365		values [Anum_sr_valid  -  1 ] =  BoolGetDatum (true);
366+ 		values [Anum_sr_reloids  -  1 ] =  (Datum ) 0 ;
367+ 
368+ 		/* save related oids */ 
369+ 		if  (reloids_len )
370+ 		{
371+ 			int 			pos ;
372+ 			ListCell    * lc ;
373+ 			Datum 	   * reloids_arr  =  palloc (sizeof (Datum ) *  reloids_len );
374+ 
375+ 			pos  =  0 ;
376+ 			foreach (lc , pl_stmt -> relationOids )
377+ 			{
378+ 				reloids_arr [pos ] =  ObjectIdGetDatum (lfirst_oid (lc ));
379+ 				pos ++ ;
380+ 			}
381+ 			reloids  =  construct_array (reloids_arr , reloids_len , OIDOID ,
382+ 											 sizeof (Oid ), true, 'i' );
383+ 			values [Anum_sr_reloids  -  1 ] =  PointerGetDatum (reloids );
384+ 
385+ 			pfree (reloids_arr );
386+ 		}
387+ 		else  nulls [Anum_sr_reloids  -  1 ] =  true;
351388
352389		tuple  =  heap_form_tuple (sr_plans_heap -> rd_att , values , nulls );
353390		simple_heap_insert (sr_plans_heap , tuple );
391+ 
354392#if  PG_VERSION_NUM  >= 100000 
355393		index_insert (sr_index_rel ,
356394					 values , nulls ,
357395					 & (tuple -> t_self ),
358396					 sr_plans_heap ,
359397					 UNIQUE_CHECK_NO ,
360398					 NULL );
399+ 
400+ 		if  (reloids )
401+ 		{
402+ 			index_insert (reloids_index_rel ,
403+ 						 & values [Anum_sr_reloids  -  1 ],
404+ 						 & nulls [Anum_sr_reloids - 1 ],
405+ 						 & (tuple -> t_self ),
406+ 						 sr_plans_heap ,
407+ 						 UNIQUE_CHECK_NO ,
408+ 						 BuildIndexInfo (reloids_index_rel ));
409+ 		}
361410#else 
362411		index_insert (sr_index_rel ,
363412					 values , nulls ,
364413					 & (tuple -> t_self ),
365414					 sr_plans_heap ,
366415					 UNIQUE_CHECK_NO );
416+ 
417+ 		if  (reloids )
418+ 		{
419+ 			index_insert (reloids_index_rel ,
420+ 						 & values [Anum_sr_reloids  -  1 ],
421+ 						 & nulls [Anum_sr_reloids - 1 ],
422+ 						 & (tuple -> t_self ),
423+ 						 sr_plans_heap ,
424+ 						 UNIQUE_CHECK_NO );
425+ 		}
367426#endif 
427+ 		index_close (reloids_index_rel , heap_lock );
368428
369429		/* Make changes visible */ 
370430		CommandCounterIncrement ();
@@ -419,8 +479,6 @@ sr_query_expr_walker(Node *node, void *context)
419479				elog (sr_plan_log_usage , "collected parameter on %d" , param -> location );
420480
421481			qp_context -> params  =  lappend (qp_context -> params , param );
422- 
423- 			return  false;
424482		}
425483		else 
426484		{
@@ -441,6 +499,8 @@ sr_query_expr_walker(Node *node, void *context)
441499				}
442500			}
443501		}
502+ 
503+ 		return  false;
444504	}
445505
446506	return  expression_tree_walker (node , sr_query_expr_walker , context );
0 commit comments