@@ -242,8 +242,20 @@ plpgsql_check_assign_to_target_type(PLpgSQL_checkstate *cstate,
242242 Oid target_typoid ,
243243 int32 target_typmod ,
244244 Oid value_typoid ,
245- bool isnull )
245+ bool isnull ,
246+ int target_dno )
246247{
248+ char * local_err_text = NULL ;
249+ char * local_query = NULL ;
250+
251+ if (!cstate -> estate -> err_text && cstate -> estate -> err_stmt )
252+ local_err_text = plpgsql_check_prepare_err_text_with_target_vardecl (cstate ,
253+ cstate -> estate -> err_stmt ,
254+ target_dno );
255+
256+ if (cstate -> estate -> err_stmt && cstate -> estate -> err_stmt -> cmd_type == PLPGSQL_STMT_EXECSQL )
257+ local_query = ((PLpgSQL_stmt_execsql * ) cstate -> estate -> err_stmt )-> sqlstmt -> query ;
258+
247259 /* not used yet */
248260 (void ) target_typmod ;
249261
@@ -267,7 +279,7 @@ plpgsql_check_assign_to_target_type(PLpgSQL_checkstate *cstate,
267279 NULL ,
268280 NULL ,
269281 PLPGSQL_CHECK_ERROR ,
270- 0 , NULL , NULL );
282+ 0 , local_query , local_err_text );
271283 }
272284 else if (!isnull )
273285 {
@@ -286,15 +298,15 @@ plpgsql_check_assign_to_target_type(PLpgSQL_checkstate *cstate,
286298 str .data ,
287299 "There are no possible explicit coercion between those types, possibly bug!" ,
288300 PLPGSQL_CHECK_WARNING_OTHERS ,
289- 0 , NULL , NULL );
301+ 0 , local_query , local_err_text );
290302 else if (!can_coerce_type (1 , & value_typoid , & target_typoid , COERCION_ASSIGNMENT ))
291303 plpgsql_check_put_error (cstate ,
292304 ERRCODE_DATATYPE_MISMATCH , 0 ,
293305 "target type is different type than source type" ,
294306 str .data ,
295307 "The input expression type does not have an assignment cast to the target type." ,
296308 PLPGSQL_CHECK_WARNING_OTHERS ,
297- 0 , NULL , NULL );
309+ 0 , local_query , local_err_text );
298310 else
299311 {
300312 /* highly probably only performance issue */
@@ -304,11 +316,15 @@ plpgsql_check_assign_to_target_type(PLpgSQL_checkstate *cstate,
304316 str .data ,
305317 "Hidden casting can be a performance issue." ,
306318 PLPGSQL_CHECK_WARNING_PERFORMANCE ,
307- 0 , NULL , NULL );
319+ 0 , local_query , local_err_text );
308320 }
309321
310322 pfree (str .data );
311323 }
324+
325+ /* release local err_text */
326+ if (local_err_text )
327+ pfree (local_err_text );
312328}
313329
314330/*
@@ -328,7 +344,8 @@ plpgsql_check_assign_tupdesc_dno(PLpgSQL_checkstate *cstate, int varno, TupleDes
328344 plpgsql_check_assign_to_target_type (cstate ,
329345 var -> datatype -> typoid , var -> datatype -> atttypmod ,
330346 TupleDescAttr (tupdesc , 0 )-> atttypid ,
331- isnull );
347+ isnull ,
348+ target -> dno );
332349 }
333350 break ;
334351
@@ -350,7 +367,8 @@ plpgsql_check_assign_tupdesc_dno(PLpgSQL_checkstate *cstate, int varno, TupleDes
350367 plpgsql_check_assign_to_target_type (cstate ,
351368 typoid , typmod ,
352369 TupleDescAttr (tupdesc , 0 )-> atttypid ,
353- isnull );
370+ isnull ,
371+ target -> dno );
354372 }
355373 break ;
356374
@@ -373,11 +391,34 @@ plpgsql_check_assign_tupdesc_row_or_rec(PLpgSQL_checkstate *cstate,
373391{
374392 if (tupdesc == NULL )
375393 {
394+ char * local_err_text = NULL ;
395+
396+ if (!cstate -> estate -> err_text && cstate -> estate -> err_stmt )
397+ {
398+ int target_dno ;
399+
400+ if (rec )
401+ target_dno = rec -> dno ;
402+ else if (row )
403+ target_dno = row -> dno ;
404+ else
405+ target_dno = -1 ;
406+
407+ local_err_text = plpgsql_check_prepare_err_text_with_target_vardecl (cstate ,
408+ cstate -> estate -> err_stmt ,
409+ target_dno );
410+ }
411+
376412 plpgsql_check_put_error (cstate ,
377413 0 , 0 ,
378414 "tuple descriptor is empty" , NULL , NULL ,
379415 PLPGSQL_CHECK_WARNING_OTHERS ,
380- 0 , NULL , NULL );
416+ 0 , NULL , local_err_text );
417+
418+ /* release local err_text */
419+ if (local_err_text )
420+ pfree (local_err_text );
421+
381422 return ;
382423 }
383424
@@ -421,7 +462,8 @@ plpgsql_check_assign_tupdesc_row_or_rec(PLpgSQL_checkstate *cstate,
421462 var -> datatype -> typoid ,
422463 var -> datatype -> atttypmod ,
423464 valtype ,
424- isnull );
465+ isnull ,
466+ target -> dno );
425467 }
426468 break ;
427469
@@ -435,7 +477,8 @@ plpgsql_check_assign_tupdesc_row_or_rec(PLpgSQL_checkstate *cstate,
435477 expected_typoid ,
436478 expected_typmod ,
437479 valtype ,
438- isnull );
480+ isnull ,
481+ target -> dno );
439482 }
440483 break ;
441484 default :
@@ -487,6 +530,16 @@ plpgsql_check_recval_assign_tupdesc(PLpgSQL_checkstate *cstate, PLpgSQL_rec *rec
487530 char * chunk ;
488531 int vtd_natts ;
489532 int i ;
533+ char * local_err_text = NULL ;
534+ char * local_query = NULL ;
535+
536+ if (!cstate -> estate -> err_text && cstate -> estate -> err_stmt )
537+ local_err_text = plpgsql_check_prepare_err_text_with_target_vardecl (cstate ,
538+ cstate -> estate -> err_stmt ,
539+ rec -> dno );
540+
541+ if (cstate -> estate -> err_stmt && cstate -> estate -> err_stmt -> cmd_type == PLPGSQL_STMT_EXECSQL )
542+ local_query = ((PLpgSQL_stmt_execsql * ) cstate -> estate -> err_stmt )-> sqlstmt -> query ;
490543
491544 mcontext = get_eval_mcontext (estate );
492545 plpgsql_check_recval_release (rec );
@@ -556,7 +609,8 @@ plpgsql_check_recval_assign_tupdesc(PLpgSQL_checkstate *cstate, PLpgSQL_rec *rec
556609 plpgsql_check_assign_to_target_type (cstate ,
557610 tattr -> atttypid , tattr -> atttypmod ,
558611 sattr -> atttypid ,
559- false);
612+ false,
613+ rec -> dno );
560614
561615 /* try to search next tuple of fields */
562616 src_field_is_valid = false;
@@ -575,15 +629,15 @@ plpgsql_check_recval_assign_tupdesc(PLpgSQL_checkstate *cstate, PLpgSQL_rec *rec
575629 NULL ,
576630 NULL ,
577631 PLPGSQL_CHECK_WARNING_OTHERS ,
578- 0 , NULL , NULL );
632+ 0 , local_query , local_err_text );
579633 else if (src_nfields > target_nfields )
580634 plpgsql_check_put_error (cstate ,
581635 0 , 0 ,
582636 "too many attributes for composite variable" ,
583637 NULL ,
584638 NULL ,
585639 PLPGSQL_CHECK_WARNING_OTHERS ,
586- 0 , NULL , NULL );
640+ 0 , local_query , local_err_text );
587641 }
588642
589643 chunk = eval_mcontext_alloc (estate ,
@@ -601,6 +655,10 @@ plpgsql_check_recval_assign_tupdesc(PLpgSQL_checkstate *cstate, PLpgSQL_rec *rec
601655
602656 TransferExpandedRecord (newerh , estate -> datum_context );
603657 rec -> erh = newerh ;
658+
659+ /* release local err_text */
660+ if (local_err_text )
661+ pfree (local_err_text );
604662}
605663
606664/*
0 commit comments