@@ -17,26 +17,36 @@ export class V14ToV15Transformer extends BaseTransformer {
1717 transformedData . bsval = { bsval : node . val . BitString . str } ;
1818 delete transformedData . val ;
1919 } else if ( node . val . Integer ) {
20- transformedData . ival = node . val . Integer ;
20+ const intVal = node . val . Integer . ival ;
21+ if ( intVal === 0 || intVal === undefined ) {
22+ transformedData . ival = { } ;
23+ } else {
24+ transformedData . ival = { ival : intVal } ;
25+ }
2126 delete transformedData . val ;
2227 } else if ( node . val . Boolean ) {
23- transformedData . boolval = node . val . Boolean ;
28+ transformedData . boolval = node . val . Boolean . boolval ;
2429 delete transformedData . val ;
2530 }
2631 }
2732
28- return this . transformNodeData ( transformedData , context ) ;
33+ if ( node . ival && typeof node . ival === 'object' ) {
34+ if ( 'ival' in node . ival ) {
35+ transformedData . ival = node . ival ;
36+ } else {
37+ transformedData . ival = { } ;
38+ }
39+ }
40+
41+ return transformedData ;
2942 }
3043
3144 String ( node : any , context ?: TransformerContext ) : any {
32- const transformedData = { ...node } ;
33-
34- if ( 'str' in transformedData ) {
35- transformedData . sval = transformedData . str ;
36- delete transformedData . str ;
45+ if ( 'str' in node ) {
46+ return { sval : node . str } ;
3747 }
3848
39- return transformedData ;
49+ return node ;
4050 }
4151
4252 BitString ( node : any , context ?: TransformerContext ) : any {
@@ -73,24 +83,158 @@ export class V14ToV15Transformer extends BaseTransformer {
7383 delete transformedData . tableAction ;
7484 }
7585
76- return this . transformNodeData ( transformedData , context ) ;
86+ return transformedData ;
87+ }
88+
89+ CreatePublicationStmt ( node : any , context ?: TransformerContext ) : any {
90+ const transformedData = { ...node } ;
91+
92+ if ( 'tables' in transformedData && Array . isArray ( transformedData . tables ) ) {
93+ transformedData . pubobjects = transformedData . tables . map ( ( table : any ) => {
94+ if ( table . RangeVar ) {
95+ return {
96+ PublicationObjSpec : {
97+ pubobjtype : "PUBLICATIONOBJ_TABLE" ,
98+ pubtable : {
99+ relation : table . RangeVar
100+ }
101+ }
102+ } ;
103+ }
104+ return table ;
105+ } ) ;
106+ delete transformedData . tables ;
107+ }
108+
109+ return transformedData ;
110+ }
111+
112+ FuncCall ( node : any , context ?: TransformerContext ) : any {
113+ const transformedData = { ...node } ;
114+
115+ if ( ! ( 'funcformat' in transformedData ) ) {
116+ transformedData . funcformat = "COERCE_EXPLICIT_CALL" ;
117+ }
118+
119+ if ( transformedData . funcname && Array . isArray ( transformedData . funcname ) ) {
120+ transformedData . funcname = transformedData . funcname . map ( ( item : any ) => this . transform ( item , context ) ) ;
121+ }
122+
123+ if ( transformedData . args && Array . isArray ( transformedData . args ) ) {
124+ transformedData . args = transformedData . args . map ( ( item : any ) => this . transform ( item , context ) ) ;
125+ }
126+
127+ if ( transformedData . over && typeof transformedData . over === 'object' ) {
128+ const originalOver = { ...transformedData . over } ;
129+ const transformedOver : any = { } ;
130+
131+ transformedOver . frameOptions = 1058 ;
132+ transformedOver . location = undefined ;
133+
134+ for ( const [ key , value ] of Object . entries ( originalOver ) ) {
135+ if ( key === 'orderClause' && Array . isArray ( value ) ) {
136+ transformedOver [ key ] = value . map ( ( item : any ) => this . transform ( item , context ) ) ;
137+ } else if ( key === 'partitionClause' && Array . isArray ( value ) ) {
138+ transformedOver [ key ] = value . map ( ( item : any ) => this . transform ( item , context ) ) ;
139+ } else {
140+ transformedOver [ key ] = value ;
141+ }
142+ }
143+
144+ transformedData . over = transformedOver ;
145+ }
146+
147+ return transformedData ;
77148 }
78149
79- private transformNodeData ( nodeData : any , context ?: TransformerContext ) : any {
80- if ( ! nodeData || typeof nodeData !== 'object' || Array . isArray ( nodeData ) ) {
81- return nodeData ;
150+ ColumnRef ( node : any , context ?: TransformerContext ) : any {
151+ const transformedData = { ...node } ;
152+
153+ if ( transformedData . fields && Array . isArray ( transformedData . fields ) ) {
154+ transformedData . fields = transformedData . fields . map ( ( field : any ) => this . transform ( field , context ) ) ;
82155 }
156+
157+ return transformedData ;
158+ }
83159
84- const result : any = { } ;
85- for ( const [ key , value ] of Object . entries ( nodeData ) ) {
160+ WindowDef ( node : any , context ?: TransformerContext ) : any {
161+ const transformedData = { ...node } ;
162+
163+ if ( ! ( 'frameOptions' in transformedData ) ) {
164+ transformedData . frameOptions = 1058 ; // Default frame options for PG17
165+ }
166+ if ( ! ( 'location' in transformedData ) ) {
167+ transformedData . location = undefined ;
168+ }
169+
170+ if ( transformedData . orderClause && Array . isArray ( transformedData . orderClause ) ) {
171+ transformedData . orderClause = transformedData . orderClause . map ( ( item : any ) => this . transform ( item , context ) ) ;
172+ }
173+
174+ if ( transformedData . partitionClause && Array . isArray ( transformedData . partitionClause ) ) {
175+ transformedData . partitionClause = transformedData . partitionClause . map ( ( item : any ) => this . transform ( item , context ) ) ;
176+ }
177+
178+ return transformedData ;
179+ }
180+
181+ SelectStmt ( node : any , context ?: TransformerContext ) : any {
182+ const transformedData : any = { } ;
183+
184+ transformedData . limitOption = "LIMIT_OPTION_DEFAULT" ;
185+ transformedData . op = "SETOP_NONE" ;
186+
187+ for ( const [ key , value ] of Object . entries ( node ) ) {
86188 if ( Array . isArray ( value ) ) {
87- result [ key ] = this . transformArray ( value , context ) ;
189+ transformedData [ key ] = value . map ( item => this . transform ( item , context ) ) ;
88190 } else if ( value && typeof value === 'object' ) {
89- result [ key ] = this . transform ( value , context ) ;
191+ const transformed = this . transform ( value , context ) ;
192+ transformedData [ key ] = transformed ;
90193 } else {
91- result [ key ] = value ;
194+ transformedData [ key ] = value ;
195+ }
196+ }
197+
198+ if ( transformedData . larg ) {
199+ if ( transformedData . larg . SelectStmt ) {
200+ if ( ! ( 'limitOption' in transformedData . larg . SelectStmt ) ) {
201+ transformedData . larg . SelectStmt . limitOption = "LIMIT_OPTION_DEFAULT" ;
202+ }
203+ if ( ! ( 'op' in transformedData . larg . SelectStmt ) ) {
204+ transformedData . larg . SelectStmt . op = "SETOP_NONE" ;
205+ }
206+ } else if ( transformedData . larg . targetList ) {
207+ if ( ! ( 'limitOption' in transformedData . larg ) ) {
208+ transformedData . larg . limitOption = "LIMIT_OPTION_DEFAULT" ;
209+ }
210+ if ( ! ( 'op' in transformedData . larg ) ) {
211+ transformedData . larg . op = "SETOP_NONE" ;
212+ }
92213 }
93214 }
94- return result ;
215+
216+ if ( transformedData . rarg ) {
217+ if ( transformedData . rarg . SelectStmt ) {
218+ if ( ! ( 'limitOption' in transformedData . rarg . SelectStmt ) ) {
219+ transformedData . rarg . SelectStmt . limitOption = "LIMIT_OPTION_DEFAULT" ;
220+ }
221+ if ( ! ( 'op' in transformedData . rarg . SelectStmt ) ) {
222+ transformedData . rarg . SelectStmt . op = "SETOP_NONE" ;
223+ }
224+ } else if ( transformedData . rarg . targetList ) {
225+ if ( ! ( 'limitOption' in transformedData . rarg ) ) {
226+ transformedData . rarg . limitOption = "LIMIT_OPTION_DEFAULT" ;
227+ }
228+ if ( ! ( 'op' in transformedData . rarg ) ) {
229+ transformedData . rarg . op = "SETOP_NONE" ;
230+ }
231+ }
232+ }
233+
234+ return transformedData ;
235+ }
236+
237+ RangeVar ( node : any , context ?: TransformerContext ) : any {
238+ return node ;
95239 }
96240}
0 commit comments