@@ -117,31 +117,31 @@ exec_plan(char *query_string, char *plan_string)
117
117
}
118
118
PG_CATCH ();
119
119
{
120
- elog (INFO ,"BAD PLAN: %s" ,plan_string );
120
+ elog (INFO ,"BAD PLAN: %s. Query: %s " ,plan_string , query_string );
121
121
PG_RE_THROW ();
122
122
}
123
123
PG_END_TRY ();
124
124
125
- psrc = CreateCachedPlan (NULL ,query_string ,query_string );
126
- CompleteCachedPlan (psrc ,NIL ,NULL ,NULL ,0 ,NULL ,NULL ,
127
- CURSOR_OPT_GENERIC_PLAN , false);
128
- StorePreparedStatement (query_string ,psrc , false);
129
- SetRemoteSubplan (psrc ,pstmt );
130
- cplan = GetCachedPlan (psrc ,paramLI , false);
131
-
132
125
if (EXPLAN_DEBUG_LEVEL > 0 )
133
126
elog (INFO ,"query: %s\n" ,query_string );
134
127
if (EXPLAN_DEBUG_LEVEL > 1 )
135
128
elog (INFO ,"\nplan: %s\n" ,plan_string );
136
129
137
- receiver = CreateDestReceiver (DestDebug );
130
+ psrc = CreateCachedPlan (NULL ,query_string ,NULL );
131
+ CompleteCachedPlan (psrc ,NIL ,NULL ,NULL ,0 ,NULL ,NULL ,
132
+ CURSOR_OPT_GENERIC_PLAN , false);
133
+
134
+ SetRemoteSubplan (psrc ,pstmt );
135
+ cplan = GetCachedPlan (psrc ,paramLI , false);
136
+
137
+ receiver = CreateDestReceiver (DestNone );
138
138
portal = CreateNewPortal ();
139
139
portal -> visible = false;
140
140
PortalDefineQuery (portal ,
141
141
NULL ,
142
142
query_string ,
143
- query_string ,
144
- cplan -> stmt_list ,
143
+ NULL ,
144
+ NULL ,
145
145
cplan );
146
146
PG_TRY ();
147
147
{
@@ -156,14 +156,14 @@ exec_plan(char *query_string, char *plan_string)
156
156
}
157
157
PG_CATCH ();
158
158
{
159
- elog (INFO ,"BAD QUERY: %s" ,query_string );
159
+ elog (INFO ,"BAD QUERY: '%s'." ,query_string );
160
+ PortalDrop (portal , false);
160
161
PG_RE_THROW ();
161
162
}
162
163
PG_END_TRY ();
163
164
164
165
receiver -> rDestroy (receiver );
165
166
PortalDrop (portal , false);
166
- DropPreparedStatement (query_string , false);
167
167
168
168
if (EXPLAN_DEBUG_LEVEL > 0 )
169
169
elog (INFO ,"query execution finished.\n" );
@@ -175,9 +175,29 @@ pg_exec_plan(PG_FUNCTION_ARGS)
175
175
char * query_string = TextDatumGetCString (PG_GETARG_DATUM (0 ));
176
176
char * plan_string = TextDatumGetCString (PG_GETARG_DATUM (1 ));
177
177
178
+ char * dec_query ,
179
+ * dec_plan ;
180
+ int dec_query_len ,
181
+ dec_query_len1 ,
182
+ dec_plan_len ,
183
+ dec_plan_len1 ;
184
+
178
185
Assert (query_string != NULL );
179
186
Assert (plan_string != NULL );
180
- exec_plan (query_string ,plan_string );
187
+
188
+ dec_query_len = b64_dec_len (query_string ,strlen (query_string )+ 1 )+ 1 ;
189
+ dec_query = palloc0 (dec_query_len + 1 );
190
+ dec_query_len1 = b64_decode (query_string ,strlen (query_string ),dec_query );
191
+ Assert (dec_query_len > dec_query_len1 );
192
+
193
+ dec_plan_len = b64_dec_len (plan_string ,strlen (plan_string )+ 1 );
194
+ dec_plan = palloc0 (dec_plan_len + 1 );
195
+ dec_plan_len1 = b64_decode (plan_string ,strlen (plan_string ),dec_plan );
196
+ Assert (dec_plan_len > dec_plan_len1 );
197
+
198
+ exec_plan (dec_query ,dec_plan );
199
+ pfree (dec_query );
200
+ pfree (dec_plan );
181
201
PG_RETURN_BOOL (true);
182
202
}
183
203