@@ -769,7 +769,7 @@ export class PLpgSQLDeparser {
769769 parts . push ( `<<${ fori . label } >>` ) ;
770770 }
771771
772- const varName = fori . var ? this . deparseDatumName ( fori . var ) : 'i' ;
772+ const varName = fori . var ? this . deparseDatumName ( fori . var , context ) : 'i' ;
773773 const lower = fori . lower ? this . deparseExpr ( fori . lower ) : '1' ;
774774 const upper = fori . upper ? this . deparseExpr ( fori . upper ) : '10' ;
775775
@@ -810,7 +810,7 @@ export class PLpgSQLDeparser {
810810 parts . push ( `<<${ fors . label } >>` ) ;
811811 }
812812
813- const varName = fors . var ? this . deparseDatumName ( fors . var ) : 'rec' ;
813+ const varName = fors . var ? this . deparseDatumName ( fors . var , context ) : 'rec' ;
814814 const query = fors . query ? this . deparseExpr ( fors . query ) : '' ;
815815 parts . push ( `${ kw ( 'FOR' ) } ${ varName } ${ kw ( 'IN' ) } ${ query } ${ kw ( 'LOOP' ) } ` ) ;
816816
@@ -841,7 +841,7 @@ export class PLpgSQLDeparser {
841841 parts . push ( `<<${ forc . label } >>` ) ;
842842 }
843843
844- const varName = forc . var ? this . deparseDatumName ( forc . var ) : 'rec' ;
844+ const varName = forc . var ? this . deparseDatumName ( forc . var , context ) : 'rec' ;
845845 const cursorName = this . getVarName ( forc . curvar , context ) ;
846846
847847 let forClause = `${ kw ( 'FOR' ) } ${ varName } ${ kw ( 'IN' ) } ${ cursorName } ` ;
@@ -1057,7 +1057,7 @@ export class PLpgSQLDeparser {
10571057 let sql = exec . sqlstmt ? this . deparseExpr ( exec . sqlstmt ) : '' ;
10581058
10591059 if ( exec . into && exec . target ) {
1060- const targetName = this . deparseDatumName ( exec . target ) ;
1060+ const targetName = this . deparseDatumName ( exec . target , context ) ;
10611061 // Check if the SQL already contains INTO
10621062 if ( ! sql . toUpperCase ( ) . includes ( ' INTO ' ) ) {
10631063 // Insert INTO clause after SELECT
@@ -1085,7 +1085,7 @@ export class PLpgSQLDeparser {
10851085
10861086 if ( exec . into && exec . target ) {
10871087 const strict = exec . strict ? kw ( 'STRICT' ) + ' ' : '' ;
1088- parts . push ( `${ kw ( 'INTO' ) } ${ strict } ${ this . deparseDatumName ( exec . target ) } ` ) ;
1088+ parts . push ( `${ kw ( 'INTO' ) } ${ strict } ${ this . deparseDatumName ( exec . target , context ) } ` ) ;
10891089 }
10901090
10911091 if ( exec . params && exec . params . length > 0 ) {
@@ -1107,7 +1107,7 @@ export class PLpgSQLDeparser {
11071107 parts . push ( `<<${ fors . label } >>` ) ;
11081108 }
11091109
1110- const varName = fors . var ? this . deparseDatumName ( fors . var ) : 'rec' ;
1110+ const varName = fors . var ? this . deparseDatumName ( fors . var , context ) : 'rec' ;
11111111 let forClause = `${ kw ( 'FOR' ) } ${ varName } ${ kw ( 'IN EXECUTE' ) } ${ fors . query ? this . deparseExpr ( fors . query ) : '' } ` ;
11121112
11131113 if ( fors . params && fors . params . length > 0 ) {
@@ -1224,7 +1224,7 @@ export class PLpgSQLDeparser {
12241224
12251225 // INTO target
12261226 if ( ! fetch . is_move && fetch . target ) {
1227- parts . push ( `${ kw ( 'INTO' ) } ${ this . deparseDatumName ( fetch . target ) } ` ) ;
1227+ parts . push ( `${ kw ( 'INTO' ) } ${ this . deparseDatumName ( fetch . target , context ) } ` ) ;
12281228 }
12291229
12301230 return parts . join ( ' ' ) ;
@@ -1304,21 +1304,38 @@ export class PLpgSQLDeparser {
13041304 return `$${ varno } ` ;
13051305 }
13061306
1307- return this . deparseDatumName ( datum ) ;
1307+ return this . deparseDatumName ( datum , context ) ;
13081308 }
13091309
13101310 /**
13111311 * Get the name from a datum
1312+ * For PLpgSQL_row with refname "(unnamed row)", expand the fields array
1313+ * to get the actual variable names
13121314 */
1313- private deparseDatumName ( datum : PLpgSQLDatum ) : string {
1315+ private deparseDatumName ( datum : PLpgSQLDatum , context ?: PLpgSQLDeparserContext ) : string {
13141316 if ( 'PLpgSQL_var' in datum ) {
13151317 return datum . PLpgSQL_var . refname ;
13161318 }
13171319 if ( 'PLpgSQL_rec' in datum ) {
13181320 return datum . PLpgSQL_rec . refname ;
13191321 }
13201322 if ( 'PLpgSQL_row' in datum ) {
1321- return datum . PLpgSQL_row . refname ;
1323+ const row = datum . PLpgSQL_row ;
1324+ // If this is an "(unnamed row)" with fields, expand the fields to get actual variable names
1325+ if ( row . refname === '(unnamed row)' && row . fields && row . fields . length > 0 && context ?. datums ) {
1326+ const fieldNames = row . fields . map ( field => {
1327+ // Try to resolve the varno to get the actual variable name
1328+ const fieldDatum = context . datums [ field . varno ] ;
1329+ if ( fieldDatum ) {
1330+ // Recursively get the name, but without context to avoid infinite loops
1331+ return this . deparseDatumName ( fieldDatum ) ;
1332+ }
1333+ // Fall back to the field name if we can't resolve the varno
1334+ return field . name ;
1335+ } ) ;
1336+ return fieldNames . join ( ', ' ) ;
1337+ }
1338+ return row . refname ;
13221339 }
13231340 if ( 'PLpgSQL_recfield' in datum ) {
13241341 return datum . PLpgSQL_recfield . fieldname ;
0 commit comments