24
24
PG_MODULE_MAGIC ;
25
25
26
26
PG_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 );
28
29
29
30
void _PG_init (void );
30
31
@@ -97,37 +98,8 @@ pg_store_query_plan(PG_FUNCTION_ARGS)
97
98
}
98
99
99
100
static 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 )
127
102
{
128
- char * filename = TextDatumGetCString (PG_GETARG_DATUM (0 )),
129
- * query_string = NULL ,
130
- * plan_string = NULL ;
131
103
PlannedStmt * pstmt ;
132
104
ParamListInfo paramLI = NULL ;
133
105
CachedPlanSource * psrc ;
@@ -137,8 +109,6 @@ pg_exec_query_plan(PG_FUNCTION_ARGS)
137
109
int16 format = 0 ;
138
110
int eflags = 0 ;
139
111
140
- LoadPlanFromFile (filename , & query_string , & plan_string );
141
-
142
112
PG_TRY ();
143
113
{
144
114
set_portable_input (true);
@@ -187,7 +157,7 @@ pg_exec_query_plan(PG_FUNCTION_ARGS)
187
157
PG_CATCH ();
188
158
{
189
159
elog (INFO , "BAD QUERY: %s" , query_string );
190
- PG_RETURN_BOOL (false );
160
+ PG_RE_THROW ( );
191
161
}
192
162
PG_END_TRY ();
193
163
@@ -197,6 +167,54 @@ pg_exec_query_plan(PG_FUNCTION_ARGS)
197
167
198
168
if (EXPLAN_DEBUG_LEVEL > 0 )
199
169
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 ));
200
177
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 );
201
219
PG_RETURN_BOOL (true);
202
220
}
0 commit comments