2424PG_MODULE_MAGIC ;
2525
2626PG_FUNCTION_INFO_V1 (pg_store_query_plan );
27- PG_FUNCTION_INFO_V1 (pg_exec_query_plan );
27+ PG_FUNCTION_INFO_V1 (pg_exec_plan );
28+ PG_FUNCTION_INFO_V1 (pg_exec_stored_plan );
2829
2930void _PG_init (void );
3031
@@ -97,37 +98,8 @@ pg_store_query_plan(PG_FUNCTION_ARGS)
9798}
9899
99100static void
100- LoadPlanFromFile (const char * filename , char * * query_string , char * * plan_string )
101- {
102- FILE * fin ;
103- size_t string_len ;
104- int nelems ;
105-
106- fin = fopen (filename , "rb" );
107- Assert (fin != NULL );
108-
109- nelems = fread (& string_len , sizeof (size_t ), 1 , fin );
110- Assert (nelems == 1 );
111- * query_string = palloc0 (string_len + 1 );
112- nelems = fread (* query_string , sizeof (char ), string_len , fin );
113- Assert (nelems == string_len );
114-
115- nelems = fread (& string_len , sizeof (size_t ), 1 , fin );
116- Assert (nelems == 1 );
117- * plan_string = palloc0 (string_len + 1 );
118- nelems = fread (* plan_string , sizeof (char ), string_len , fin );
119- Assert (nelems == string_len );
120-
121- fclose (fin );
122-
123- }
124-
125- Datum
126- pg_exec_query_plan (PG_FUNCTION_ARGS )
101+ exec_plan (char * query_string , char * plan_string )
127102{
128- char * filename = TextDatumGetCString (PG_GETARG_DATUM (0 )),
129- * query_string = NULL ,
130- * plan_string = NULL ;
131103 PlannedStmt * pstmt ;
132104 ParamListInfo paramLI = NULL ;
133105 CachedPlanSource * psrc ;
@@ -137,8 +109,6 @@ pg_exec_query_plan(PG_FUNCTION_ARGS)
137109 int16 format = 0 ;
138110 int eflags = 0 ;
139111
140- LoadPlanFromFile (filename , & query_string , & plan_string );
141-
142112 PG_TRY ();
143113 {
144114 set_portable_input (true);
@@ -187,7 +157,7 @@ pg_exec_query_plan(PG_FUNCTION_ARGS)
187157 PG_CATCH ();
188158 {
189159 elog (INFO , "BAD QUERY: %s" , query_string );
190- PG_RETURN_BOOL (false );
160+ PG_RE_THROW ( );
191161 }
192162 PG_END_TRY ();
193163
@@ -197,6 +167,54 @@ pg_exec_query_plan(PG_FUNCTION_ARGS)
197167
198168 if (EXPLAN_DEBUG_LEVEL > 0 )
199169 elog (INFO , "query execution finished.\n" );
170+ }
171+
172+ Datum
173+ pg_exec_plan (PG_FUNCTION_ARGS )
174+ {
175+ char * query_string = TextDatumGetCString (PG_GETARG_DATUM (0 ));
176+ char * plan_string = TextDatumGetCString (PG_GETARG_DATUM (1 ));
200177
178+ Assert (query_string != NULL );
179+ Assert (plan_string != NULL );
180+ exec_plan (query_string , plan_string );
181+ PG_RETURN_BOOL (true);
182+ }
183+
184+ static void
185+ LoadPlanFromFile (const char * filename , char * * query_string , char * * plan_string )
186+ {
187+ FILE * fin ;
188+ size_t string_len ;
189+ int nelems ;
190+
191+ fin = fopen (filename , "rb" );
192+ Assert (fin != NULL );
193+
194+ nelems = fread (& string_len , sizeof (size_t ), 1 , fin );
195+ Assert (nelems == 1 );
196+ * query_string = palloc0 (string_len + 1 );
197+ nelems = fread (* query_string , sizeof (char ), string_len , fin );
198+ Assert (nelems == string_len );
199+
200+ nelems = fread (& string_len , sizeof (size_t ), 1 , fin );
201+ Assert (nelems == 1 );
202+ * plan_string = palloc0 (string_len + 1 );
203+ nelems = fread (* plan_string , sizeof (char ), string_len , fin );
204+ Assert (nelems == string_len );
205+
206+ fclose (fin );
207+
208+ }
209+
210+ Datum
211+ pg_exec_stored_plan (PG_FUNCTION_ARGS )
212+ {
213+ char * filename = TextDatumGetCString (PG_GETARG_DATUM (0 )),
214+ * query_string = NULL ,
215+ * plan_string = NULL ;
216+
217+ LoadPlanFromFile (filename , & query_string , & plan_string );
218+ exec_plan (query_string , plan_string );
201219 PG_RETURN_BOOL (true);
202220}
0 commit comments