@@ -233,11 +233,7 @@ export class V15ToV16Transformer {
233233 }
234234
235235 if ( node . rexpr !== undefined ) {
236- const childContext : TransformerContext = {
237- ...context ,
238- parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'A_Expr' , 'rexpr' ]
239- } ;
240- result . rexpr = this . transform ( node . rexpr as any , childContext ) ;
236+ result . rexpr = this . transform ( node . rexpr as any , context ) ;
241237 }
242238
243239 if ( node . location !== undefined ) {
@@ -547,12 +543,9 @@ export class V15ToV16Transformer {
547543 parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'A_Const' ]
548544 } ;
549545
550- if ( typeof result . ival === 'object' && result . ival !== null ) {
551- if ( Object . keys ( result . ival ) . length === 0 ) {
552- const wrappedIval = { Integer : result . ival } ;
553- const transformedWrapped = this . transform ( wrappedIval as any , childContext ) ;
554- result . ival = transformedWrapped . Integer ;
555- }
546+ // Handle empty Integer objects directly since transform() can't detect their type
547+ if ( typeof result . ival === 'object' && Object . keys ( result . ival ) . length === 0 ) {
548+ result . ival = this . Integer ( result . ival as any , childContext ) . Integer ;
556549 } else {
557550 result . ival = this . transform ( result . ival as any , childContext ) ;
558551 }
@@ -611,7 +604,7 @@ export class V15ToV16Transformer {
611604 if ( node . arrayBounds !== undefined ) {
612605 const childContext : TransformerContext = {
613606 ...context ,
614- parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'TypeName' , 'arrayBounds' ]
607+ parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'TypeName' ]
615608 } ;
616609 result . arrayBounds = Array . isArray ( node . arrayBounds )
617610 ? node . arrayBounds . map ( ( item : any ) => this . transform ( item as any , childContext ) )
@@ -644,6 +637,10 @@ export class V15ToV16Transformer {
644637 RangeVar ( node : PG15 . RangeVar , context : TransformerContext ) : { RangeVar : PG16 . RangeVar } {
645638 const result : any = { } ;
646639
640+ if ( node . catalogname !== undefined ) {
641+ result . catalogname = node . catalogname ;
642+ }
643+
647644 if ( node . schemaname !== undefined ) {
648645 result . schemaname = node . schemaname ;
649646 }
@@ -695,19 +692,11 @@ export class V15ToV16Transformer {
695692 }
696693
697694 if ( node . lidx !== undefined ) {
698- const childContext : TransformerContext = {
699- ...context ,
700- parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'A_Indices' ]
701- } ;
702- result . lidx = this . transform ( node . lidx as any , childContext ) ;
695+ result . lidx = this . transform ( node . lidx as any , context ) ;
703696 }
704697
705698 if ( node . uidx !== undefined ) {
706- const childContext : TransformerContext = {
707- ...context ,
708- parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'A_Indices' ]
709- } ;
710- result . uidx = this . transform ( node . uidx as any , childContext ) ;
699+ result . uidx = this . transform ( node . uidx as any , context ) ;
711700 }
712701
713702 return { A_Indices : result } ;
@@ -807,7 +796,11 @@ export class V15ToV16Transformer {
807796 }
808797
809798 if ( node . typeName !== undefined ) {
810- result . typeName = this . transform ( node . typeName as any , context ) ;
799+ const childContext : TransformerContext = {
800+ ...context ,
801+ parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'TypeCast' ]
802+ } ;
803+ result . typeName = this . TypeName ( node . typeName as any , childContext ) . TypeName ;
811804 }
812805
813806 if ( node . location !== undefined ) {
@@ -893,16 +886,49 @@ export class V15ToV16Transformer {
893886 Integer ( node : PG15 . Integer , context : TransformerContext ) : { Integer : PG16 . Integer } {
894887 const result : any = { ...node } ;
895888
889+ // Handle empty Integer objects that need to be transformed back from PG15 to PG16
890+ // Based on specific patterns from v14-to-v15 transformer
896891 if ( Object . keys ( result ) . length === 0 ) {
897892 const parentTypes = context . parentNodeTypes || [ ] ;
893+ const contextData = context as any ;
898894
899- const shouldTransform =
900- ( parentTypes . includes ( 'arrayBounds' ) && ! parentTypes . includes ( 'A_Indices' ) ) ||
901- ( parentTypes . includes ( 'rexpr' ) && parentTypes . includes ( 'A_Expr' ) && ! parentTypes . includes ( 'A_Indices' ) ) ;
902-
903- if ( shouldTransform ) {
895+ // TypeName arrayBounds context: In v14-to-v15, -1 values became empty objects
896+ if ( parentTypes . includes ( 'TypeName' ) ) {
904897 result . ival = - 1 ;
905898 }
899+
900+ // DefineStmt context: Various specific cases from v14-to-v15
901+ else if ( parentTypes . includes ( 'DefineStmt' ) ) {
902+ const defElemName = contextData . defElemName ;
903+
904+ if ( defElemName === 'initcond' ) {
905+ result . ival = - 100 ; // v14-to-v15 line 464: ival === 0 || ival === -100
906+ } else if ( defElemName === 'sspace' ) {
907+ result . ival = 0 ; // v14-to-v15 line 468: ival === 0
908+ } else {
909+ result . ival = - 1 ; // v14-to-v15 line 473: ival === -1 || ival === 0, default to -1
910+ }
911+ }
912+
913+ // AlterTableCmd context: In v14-to-v15, ival 0 or -1 became empty
914+ else if ( parentTypes . includes ( 'AlterTableCmd' ) && ! parentTypes . includes ( 'DefineStmt' ) ) {
915+ result . ival = - 1 ; // v14-to-v15 line 456: ival === 0 || ival === -1, default to -1
916+ }
917+
918+ // CreateSeqStmt context: Various specific cases from v14-to-v15
919+ else if ( parentTypes . includes ( 'CreateSeqStmt' ) ) {
920+ const defElemName = contextData . defElemName ;
921+
922+ if ( defElemName === 'start' || defElemName === 'minvalue' ) {
923+ result . ival = 0 ; // v14-to-v15 lines 482, 486: ival === 0
924+ } else if ( defElemName === 'increment' ) {
925+ result . ival = - 1 ; // v14-to-v15 line 490: ival === -1
926+ } else {
927+ result . ival = - 1 ; // Default for other CreateSeqStmt contexts
928+ }
929+ }
930+
931+
906932 }
907933
908934 return { Integer : result } ;
@@ -931,13 +957,9 @@ export class V15ToV16Transformer {
931957 const result : any = { } ;
932958
933959 if ( node . items !== undefined ) {
934- const childContext : TransformerContext = {
935- ...context ,
936- parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'List' , 'items' ]
937- } ;
938960 result . items = Array . isArray ( node . items )
939- ? node . items . map ( ( item : any ) => this . transform ( item as any , childContext ) )
940- : this . transform ( node . items as any , childContext ) ;
961+ ? node . items . map ( ( item : any ) => this . transform ( item as any , context ) )
962+ : this . transform ( node . items as any , context ) ;
941963 }
942964
943965 return { List : result } ;
@@ -1231,6 +1253,10 @@ export class V15ToV16Transformer {
12311253 result . initially_valid = node . initially_valid ;
12321254 }
12331255
1256+ if ( node . nulls_not_distinct !== undefined ) {
1257+ result . nulls_not_distinct = node . nulls_not_distinct ;
1258+ }
1259+
12341260 return { Constraint : result } ;
12351261 }
12361262
@@ -2155,9 +2181,6 @@ export class V15ToV16Transformer {
21552181 result . unique = node . unique ;
21562182 }
21572183
2158- if ( node . nulls_not_distinct !== undefined ) {
2159- result . nulls_not_distinct = node . nulls_not_distinct ;
2160- }
21612184
21622185 if ( node . primary !== undefined ) {
21632186 result . primary = node . primary ;
@@ -2861,11 +2884,7 @@ export class V15ToV16Transformer {
28612884 }
28622885
28632886 if ( node . arg !== undefined ) {
2864- const childContext : TransformerContext = {
2865- ...context ,
2866- parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'DefElem' ]
2867- } ;
2868- result . arg = this . transform ( node . arg as any , childContext ) ;
2887+ result . arg = this . transform ( node . arg as any , context ) ;
28692888 }
28702889
28712890 if ( node . defaction !== undefined ) {
@@ -3263,7 +3282,50 @@ export class V15ToV16Transformer {
32633282
32643283
32653284 GrantRoleStmt ( node : PG15 . GrantRoleStmt , context : TransformerContext ) : { GrantRoleStmt : PG16 . GrantRoleStmt } {
3266- const result : any = { ...node } ;
3285+ const result : any = { } ;
3286+
3287+ if ( node . granted_roles !== undefined ) {
3288+ result . granted_roles = Array . isArray ( node . granted_roles )
3289+ ? node . granted_roles . map ( ( item : any ) => this . transform ( item as any , context ) )
3290+ : this . transform ( node . granted_roles as any , context ) ;
3291+ }
3292+
3293+ if ( node . grantee_roles !== undefined ) {
3294+ result . grantee_roles = Array . isArray ( node . grantee_roles )
3295+ ? node . grantee_roles . map ( ( item : any ) => this . transform ( item as any , context ) )
3296+ : this . transform ( node . grantee_roles as any , context ) ;
3297+ }
3298+
3299+ if ( node . is_grant !== undefined ) {
3300+ result . is_grant = node . is_grant ;
3301+ }
3302+
3303+ if ( node . behavior !== undefined ) {
3304+ result . behavior = node . behavior ;
3305+ }
3306+
3307+ const nodeAny = node as any ;
3308+ if ( nodeAny . admin_opt === true ) {
3309+ result . opt = [
3310+ {
3311+ DefElem : {
3312+ defname : "admin" ,
3313+ arg : {
3314+ Boolean : {
3315+ boolval : true
3316+ }
3317+ } ,
3318+ defaction : "DEFELEM_UNSPEC"
3319+ }
3320+ }
3321+ ] ;
3322+ } else if ( nodeAny . opt !== undefined ) {
3323+ // Handle any existing opt field by transforming it
3324+ result . opt = Array . isArray ( nodeAny . opt )
3325+ ? nodeAny . opt . map ( ( item : any ) => this . transform ( item as any , context ) )
3326+ : this . transform ( nodeAny . opt as any , context ) ;
3327+ }
3328+
32673329 return { GrantRoleStmt : result } ;
32683330 }
32693331
0 commit comments