@@ -117,31 +117,31 @@ exec_plan(char *query_string, char *plan_string)
117117 }
118118 PG_CATCH ();
119119 {
120- elog (INFO , "BAD PLAN: %s" , plan_string );
120+ elog (INFO , "BAD PLAN: %s. Query: %s " , plan_string , query_string );
121121 PG_RE_THROW ();
122122 }
123123 PG_END_TRY ();
124124
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-
132125 if (EXPLAN_DEBUG_LEVEL > 0 )
133126 elog (INFO , "query: %s\n" , query_string );
134127 if (EXPLAN_DEBUG_LEVEL > 1 )
135128 elog (INFO , "\nplan: %s\n" , plan_string );
136129
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 );
138138 portal = CreateNewPortal ();
139139 portal -> visible = false;
140140 PortalDefineQuery (portal ,
141141 NULL ,
142142 query_string ,
143- query_string ,
144- cplan -> stmt_list ,
143+ NULL ,
144+ NULL ,
145145 cplan );
146146 PG_TRY ();
147147 {
@@ -156,14 +156,14 @@ exec_plan(char *query_string, char *plan_string)
156156 }
157157 PG_CATCH ();
158158 {
159- elog (INFO , "BAD QUERY: %s" , query_string );
159+ elog (INFO , "BAD QUERY: '%s'." , query_string );
160+ PortalDrop (portal , false);
160161 PG_RE_THROW ();
161162 }
162163 PG_END_TRY ();
163164
164165 receiver -> rDestroy (receiver );
165166 PortalDrop (portal , false);
166- DropPreparedStatement (query_string , false);
167167
168168 if (EXPLAN_DEBUG_LEVEL > 0 )
169169 elog (INFO , "query execution finished.\n" );
@@ -175,9 +175,29 @@ pg_exec_plan(PG_FUNCTION_ARGS)
175175 char * query_string = TextDatumGetCString (PG_GETARG_DATUM (0 ));
176176 char * plan_string = TextDatumGetCString (PG_GETARG_DATUM (1 ));
177177
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+
178185 Assert (query_string != NULL );
179186 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 );
181201 PG_RETURN_BOOL (true);
182202}
183203
0 commit comments