001package gudusoft.gsqlparser.nodes;
002/*
003 * Date: 2010-1-27
004 * Time: 11:30:12
005 */
006
007import gudusoft.gsqlparser.*;
008import gudusoft.gsqlparser.nodes.hive.THiveVariable;
009import gudusoft.gsqlparser.nodes.mssql.TForXMLClause;
010import gudusoft.gsqlparser.nodes.mssql.TMssqlStmtStubSqlNode;
011import gudusoft.gsqlparser.nodes.oracle.TStorageItem;
012import gudusoft.gsqlparser.nodes.snowflake.*;
013import gudusoft.gsqlparser.stmt.TCursorDeclStmt;
014import gudusoft.gsqlparser.stmt.TVarDeclStmt;
015import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateType;
016import gudusoft.gsqlparser.util.functionChecker;
017
018import java.util.concurrent.ConcurrentHashMap;
019import java.util.Map;
020import java.util.function.Supplier;
021
022public class TNodeFactory {
023
024    // Cache of Class objects to avoid repeated lookups - made thread-safe
025    private static final Map<Integer, Class<? extends TParseTreeNode>> NODE_TYPE_CLASSES = new ConcurrentHashMap<>();
026    
027    // Factory methods for frequently used node types to avoid reflection entirely - made thread-safe
028    private static final Map<Integer, Supplier<TParseTreeNode>> NODE_FACTORIES = new ConcurrentHashMap<>();
029    
030    static {
031        // Pre-populate cache for all known node types
032        // for (ENodeType nodeType : ENodeType.values()) {
033        //     try {
034        //         NODE_TYPE_CLASSES.put(nodeType.getId(), 
035        //             (Class<? extends TParseTreeNode>) Class.forName(nodeType.toString()));
036        //     } catch (ClassNotFoundException e) {
037        //         // Log error but continue - handle during runtime if needed
038        //         System.out.println("Failed to preload class for node type: " + nodeType + ": " + e.getMessage());
039        //     }
040        // }
041        
042        // Add specialized factory methods for common node types
043        NODE_FACTORIES.put(ENodeType.T_AliasClause.getId(), () -> new TAliasClause());
044        NODE_FACTORIES.put(ENodeType.T_AlterIndexSqlNode.getId(), () -> new TAlterIndexSqlNode());
045        NODE_FACTORIES.put(ENodeType.T_AlterTableOption.getId(), () -> new TAlterTableOption());
046        NODE_FACTORIES.put(ENodeType.T_AlterTriggerSqlNode.getId(), () -> new TAlterTriggerSqlNode());
047        NODE_FACTORIES.put(ENodeType.T_AlterTypeOption.getId(), () -> new TAlterTypeOption());
048        NODE_FACTORIES.put(ENodeType.T_BlockSqlNode.getId(), () -> new TBlockSqlNode());
049        NODE_FACTORIES.put(ENodeType.T_ColumnDefinition.getId(), () -> new TColumnDefinition());
050        NODE_FACTORIES.put(ENodeType.T_ColumnDefinitionList.getId(), () -> new TColumnDefinitionList());
051        NODE_FACTORIES.put(ENodeType.T_ColumnReference.getId(), () -> new TColumnReference());
052        NODE_FACTORIES.put(ENodeType.T_CommentSqlNode.getId(), () -> new TCommentSqlNode());
053        NODE_FACTORIES.put(ENodeType.T_Constant.getId(), () -> new TConstant());
054        NODE_FACTORIES.put(ENodeType.T_Constraint.getId(), () -> new TConstraint());
055        NODE_FACTORIES.put(ENodeType.T_CreateFunctionSqlNode.getId(), () -> new TCreateFunctionSqlNode());
056        NODE_FACTORIES.put(ENodeType.T_CreateProcedureSqlNode.getId(), () -> new TCreateProcedureSqlNode());
057        NODE_FACTORIES.put(ENodeType.T_CreateTableSqlNode.getId(), () -> new TCreateTableSqlNode());
058        NODE_FACTORIES.put(ENodeType.T_CTE.getId(), () -> new TCTE());
059        NODE_FACTORIES.put(ENodeType.T_CTEList.getId(), () -> new TCTEList());
060        NODE_FACTORIES.put(ENodeType.T_CursorDeclStmt.getId(), () -> new TCursorDeclStmt());
061        NODE_FACTORIES.put(ENodeType.T_DeclareVariable.getId(), () -> new TDeclareVariable());
062        NODE_FACTORIES.put(ENodeType.T_DdlEventItem.getId(), () -> new TDdlEventItem());
063        NODE_FACTORIES.put(ENodeType.T_Dummy.getId(), () -> new TDummy());
064        NODE_FACTORIES.put(ENodeType.T_DummyList.getId(), () -> new TDummyList());
065        NODE_FACTORIES.put(ENodeType.T_ExecuteSqlNode.getId(), () -> new TExecuteSqlNode());
066        NODE_FACTORIES.put(ENodeType.T_Expression.getId(), () -> new TExpression());
067        NODE_FACTORIES.put(ENodeType.T_ExpressionList.getId(), () -> new TExpressionList());
068        NODE_FACTORIES.put(ENodeType.T_FromTable.getId(), () -> new TFromTable());
069        NODE_FACTORIES.put(ENodeType.T_FunctionCall.getId(), () -> new TFunctionCall());
070        NODE_FACTORIES.put(ENodeType.T_ForUpdate.getId(), () -> new TForUpdate());
071        NODE_FACTORIES.put(ENodeType.T_ForXMLClause.getId(), () -> new TForXMLClause());
072        NODE_FACTORIES.put(ENodeType.T_GruopBy.getId(), () -> new TGroupBy());
073        NODE_FACTORIES.put(ENodeType.T_InsertSqlNode.getId(), () -> new TInsertSqlNode());
074        NODE_FACTORIES.put(ENodeType.T_JoinExpr.getId(), () -> new TJoinExpr());
075        NODE_FACTORIES.put(ENodeType.T_Join.getId(), () -> new TJoin());
076        NODE_FACTORIES.put(ENodeType.T_MssqlStmtStubSqlNode.getId(), () -> new TMssqlStmtStubSqlNode());
077        NODE_FACTORIES.put(ENodeType.T_ObjectName.getId(), () -> new TObjectName());
078        NODE_FACTORIES.put(ENodeType.T_ObjectNameList.getId(), () -> new TObjectNameList());
079        NODE_FACTORIES.put(ENodeType.T_OrderBy.getId(), () -> new TOrderBy());
080        NODE_FACTORIES.put(ENodeType.T_OrderByItem.getId(), () -> new TOrderByItem());
081        NODE_FACTORIES.put(ENodeType.T_OrderByItemList.getId(), () -> new TOrderByItemList());
082        NODE_FACTORIES.put(ENodeType.T_PlsqlCreateType.getId(), () -> new TPlsqlCreateType());
083        NODE_FACTORIES.put(ENodeType.T_QueryHint.getId(), () -> new TQueryHint());
084        NODE_FACTORIES.put(ENodeType.T_ResultColumn.getId(), () -> new TResultColumn());
085        NODE_FACTORIES.put(ENodeType.T_ResultColumnList.getId(), () -> new TResultColumnList());
086        NODE_FACTORIES.put(ENodeType.T_SelectSqlNode.getId(), () -> new TSelectSqlNode());
087        NODE_FACTORIES.put(ENodeType.T_SequenceOption.getId(), () -> new TSequenceOption());
088        NODE_FACTORIES.put(ENodeType.T_SetSqlNode.getId(), () -> new TSetSqlNode());
089        NODE_FACTORIES.put(ENodeType.T_StatementSqlNode.getId(), () -> new TStatementSqlNode());
090        NODE_FACTORIES.put(ENodeType.T_StorageItem.getId(), () -> new TStorageItem());
091        NODE_FACTORIES.put(ENodeType.T_Table.getId(), () -> new TTable());
092        NODE_FACTORIES.put(ENodeType.T_TableElementList.getId(), () -> new TTableElementList());
093        NODE_FACTORIES.put(ENodeType.T_TableReference.getId(), () -> new TTableReference());
094        NODE_FACTORIES.put(ENodeType.T_Typename.getId(), () -> new TTypeName());
095        NODE_FACTORIES.put(ENodeType.T_VarDeclStmt.getId(), () -> new TVarDeclStmt());
096        NODE_FACTORIES.put(ENodeType.T_ViewAliasItem.getId(), () -> new TViewAliasItem());
097        NODE_FACTORIES.put(ENodeType.T_WhereClause.getId(), () -> new TWhereClause());
098        NODE_FACTORIES.put(ENodeType.T_WindowFrameBoundary.getId(), () -> new TWindowFrameBoundary());
099
100        // Snowflake Semantic View nodes
101        NODE_FACTORIES.put(ENodeType.T_CreateSemanticViewSqlNode.getId(), () -> new TCreateSemanticViewSqlNode());
102        NODE_FACTORIES.put(ENodeType.T_SemanticViewClause.getId(), () -> new TSemanticViewClause());
103        NODE_FACTORIES.put(ENodeType.T_SemanticTableDef.getId(), () -> new TSemanticTableDef());
104        NODE_FACTORIES.put(ENodeType.T_SemanticTableDefList.getId(), () -> new TSemanticTableDefList());
105        NODE_FACTORIES.put(ENodeType.T_SemanticRelationshipDef.getId(), () -> new TSemanticRelationshipDef());
106        NODE_FACTORIES.put(ENodeType.T_SemanticRelationshipDefList.getId(), () -> new TSemanticRelationshipDefList());
107        NODE_FACTORIES.put(ENodeType.T_SemanticAttributeDef.getId(), () -> new TSemanticAttributeDef());
108        NODE_FACTORIES.put(ENodeType.T_SemanticAttributeDefList.getId(), () -> new TSemanticAttributeDefList());
109        NODE_FACTORIES.put(ENodeType.T_SemanticViewClauseList.getId(), () -> new TSemanticViewClauseList());
110
111    }
112
113    public TNodeFactory(){
114    }
115
116    public TNodeFactory(EDbVendor dbVendor){
117        this.dbVendor = dbVendor;
118    }
119
120    public EDbVendor getDbVendor() {
121        return dbVendor;
122    }
123
124    public synchronized void setDbVendor(EDbVendor dbVendor) {
125        this.dbVendor = dbVendor;
126    }
127
128
129    private volatile EDbVendor dbVendor = EDbVendor.dbvgeneric;
130
131    public synchronized void setGsqlParser(TGSqlParser parser) {
132        this.gsqlparser = parser;
133    }
134
135    private volatile TGSqlParser gsqlparser = null;
136
137    public TColumnReference createColumnReference(TObjectName objectname){
138        TColumnReference retval = (TColumnReference)createNode(ENodeType.T_ColumnReference.getId(),objectname);
139        return retval;
140    }
141
142    public TColumnReference createColumnReference(TSourceToken objectname){
143        TColumnReference retval = (TColumnReference)createNode(ENodeType.T_ColumnReference.getId(),objectname);
144        return retval;
145    }
146
147    public TTableReference createTableReference(TObjectName objectname){
148        TTableReference retval = (TTableReference)createNode(ENodeType.T_TableReference.getId(),objectname);
149        return retval;
150    }
151
152    public TObjectReference createObjectReference(TObjectName objectname, int objecttype){
153        TObjectReference retval = (TObjectReference)createNode(ENodeType.T_ObjectReference.getId(),objectname);
154        retval.setObjectType(objecttype);
155        return retval;
156    }
157
158    public TParseTreeNode createIntervalExpression(){
159        TIntervalExpression retval = (TIntervalExpression)createNode(ENodeType.T_IntervalExression.getId());
160        return retval;
161    }
162
163    public TParseTreeNode createDatetimeExpression(){
164        TDatetimeExpression retval = (TDatetimeExpression)createNode(ENodeType.T_DatetimeExression.getId());
165        return retval;
166    }
167
168    public TParseTreeNode createFunctionCall(EFunctionType eFunctionType, TObjectName functionName){
169        TFunctionCall retval = (TFunctionCall)createNode(ENodeType.T_FunctionCall.getId(),functionName,eFunctionType);
170     //   functionName.parseFunctionName();
171        return retval;
172    }
173
174    public TParseTreeNode createSelectSqlNode(){
175        TSelectSqlNode retval = (TSelectSqlNode)createNode(ENodeType.T_SelectSqlNode.getId());
176        return retval;
177    }
178    
179
180
181    public TParseTreeNode createExpression(EExpressionType operatorType){
182        TExpression retval = (TExpression)createNode(ENodeType.T_Expression.getId(),operatorType);
183        //retval.setExpressionType(operatorType);
184        //retval.setExprType(operatorType);
185        return retval;
186    }
187
188    public TParseTreeNode createExpression(EExpressionType operatorType,TExpression leftOperand,TExpression rightOperand){
189        TExpression retval = (TExpression)createNode(ENodeType.T_Expression.getId(),operatorType);
190        //retval.setExpressionType(operatorType);
191        //retval.setExprType(operatorType);
192        retval.setLeftOperand(leftOperand);
193        retval.setRightOperand(rightOperand);
194        return retval;
195    }
196
197    public TParseTreeNode createCompoundExpression(EExpressionType operatorType,TExpression leftOperand,TExpression rightOperand ){
198        EExpressionType lcOperatorType = operatorType;
199        if (lcOperatorType == EExpressionType.group_comparison_t){
200            if (leftOperand.getExpressionType() == EExpressionType.list_t){
201
202            }else{
203                lcOperatorType = EExpressionType.simple_comparison_t;
204            }
205        }
206       TExpression retval = (TExpression)createNode(ENodeType.T_Expression.getId(),lcOperatorType);
207        //retval.setExpressionType(operatorType);
208        //retval.setExprType(operatorType);
209        retval.setLeftOperand(leftOperand);
210        retval.setRightOperand(rightOperand);
211        return retval;
212    }
213
214    public TExpression createSimpleExpression(TObjectName or){
215       boolean isOracleDBMS_package_call = false;
216        TExpression retval;
217
218        if ((dbVendor == EDbVendor.dbvoracle) && (or.getNumberOfPart() == 2)){
219           // 检查是否为oracle DBMS_ package, 如果是的话,需要转为function_t, 而不是simple_object_name_t
220            isOracleDBMS_package_call = functionChecker.isOraclePredefinedPackageFunction(or.toString());
221       }
222        if (isOracleDBMS_package_call){
223            retval = (TExpression)createNode(ENodeType.T_Expression.getId(),EExpressionType.function_t);
224            retval.setFunctionCall((TFunctionCall) this.createFunctionCall(EFunctionType.oracle_dbms_package_t,or));
225        }else{
226            retval = (TExpression)createNode(ENodeType.T_Expression.getId(),EExpressionType.simple_object_name_t);
227            retval.setObjectOperand(or);
228        }
229
230        //retval.setExpressionType(TExpression.simpleObjectname);
231        //retval.setExprType(EExpressionType.simple_object_name_t);
232
233        retval.setStartToken(or);
234        retval.setEndToken(or);
235        return retval;
236    }
237
238    public TObjectName createObjectNameWithType(EDbObjectType dbObjectType, TSourceToken part) {
239        if ((part == null)) return null;
240        TObjectName retval = (TObjectName)createNode(ENodeType.T_ObjectName.getId(),dbObjectType,part);
241        retval.setStartToken(part);
242        retval.setEndToken(part);
243        return retval;
244    }
245
246    public TObjectName createObjectNameWithType(EDbObjectType dbObjectType, TSourceToken object,TSourceToken part) {
247        if ((object == null)&&(part == null)) return null;
248        TObjectName retval = (TObjectName)createNode(ENodeType.T_ObjectName.getId(),dbObjectType,object,part);
249
250        if (part != null){
251            retval.setEndToken(part);
252        }else {
253            if(object != null){
254                retval.setEndToken(object);
255            } else {
256            }
257        }
258
259
260        if(object != null){
261            retval.setStartToken(object);
262        } else {
263            if(part != null){
264                retval.setStartToken(part);
265            }
266        }
267
268        return retval;
269    }
270
271    public TObjectName createObjectNameWithType(EDbObjectType dbObjectType, TSourceToken schema,TSourceToken object,TSourceToken part) {
272        if ((object == null)&&(part == null)) return null;
273        TObjectName retval = (TObjectName)createNode(ENodeType.T_ObjectName.getId(),dbObjectType,schema,object,part);
274        retval.setStartToken(schema);
275        retval.setEndToken(part);
276
277        return retval;
278    }
279
280    public TObjectName createObjectName(EDbObjectType dbObjectType, TSourceToken schema,TSourceToken object,TSourceToken part){
281        if ((schema == null)&&(object == null)&&(part == null)) return null;
282        TObjectName retval = (TObjectName)createNode(ENodeType.T_ObjectName.getId(),dbObjectType,schema,object,part);
283
284        if (part != null){
285            retval.setEndToken(part);
286        }else {
287            if(object != null){
288                retval.setEndToken(object);
289            } else {
290                if(schema != null){
291                    retval.setEndToken(schema);
292                }
293            }
294        }
295
296        if (schema != null){
297            retval.setStartToken(schema);
298        }else {
299            if(object != null){
300                retval.setStartToken(object);
301            } else {
302                if(part != null){
303                    retval.setStartToken(part);
304                }
305            }
306        }
307
308        return retval;
309
310    }
311
312    /**
313     *  create a database object with schema, object and part name, type of this object will be
314     *  determined later in the context where it appears.
315     * @param schema schema name of this object.
316     * @param object object name such as table, view, function and etc.
317     * @param part part of object, depends on object, if object is table, then part will be column name; will be null if object is function
318     * @return
319     */
320    public TObjectName createObjectName(TSourceToken schema,TSourceToken object,TSourceToken part){
321        if ((schema == null)&&(object == null)&&(part == null)) return null;
322        TObjectName retval = (TObjectName)createNode(ENodeType.T_ObjectName.getId(),schema,object,part);
323
324        if (part != null){
325            retval.setEndToken(part);
326        }else {
327            if(object != null){
328                retval.setEndToken(object);
329            } else {
330                if(schema != null){
331                    retval.setEndToken(schema);
332                }
333            }
334        }
335
336        if (schema != null){
337            retval.setStartToken(schema);
338        }else {
339            if(object != null){
340                retval.setStartToken(object);
341            } else {
342                if(part != null){
343                    retval.setStartToken(part);
344                }
345            }
346        }
347
348        return retval;
349    }
350
351    public TObjectName createObjectNameWithPart(TSourceToken part){
352        return createObjectName(null,null,part);
353    }
354
355    public TObjectName createObjectNameWithObject(TSourceToken object){
356        return createObjectName(null,object,null);
357    }
358
359    public TObjectName createObjectNameWithPartAndObject(TSourceToken object,TSourceToken part){
360        return createObjectName(null,object,part);
361    }
362
363    public TParseTreeNode createSimpleExpression(TConstant cnt){
364        if (cnt.getLiteralType() == ELiteralType.etFakeDate){
365
366            TFunctionCall functionCall = (TFunctionCall)createFunctionCall(EFunctionType.date_t,TObjectName.createObjectName ( this.dbVendor, EDbObjectType.function,cnt.getStartToken()));
367            TExpression expression = (TExpression)createExpression(EExpressionType.function_t);
368            expression.setFunctionCall(functionCall);
369            expression.setStartToken(functionCall.getStartToken());
370            expression.setEndToken(functionCall.getEndToken());
371            return expression;
372
373        }else{
374            TExpression retval = (TExpression)createNode(ENodeType.T_Expression.getId(),EExpressionType.simple_constant_t);
375            //retval.setExpressionType(TExpression.simpleConstant);
376            //retval.setExprType(EExpressionType.simple_constant_t);
377            retval.setConstantOperand(cnt);
378            retval.setStartToken(cnt.getStartToken());
379            retval.setEndToken(cnt.getEndToken());
380            return retval;
381        }
382    }
383
384    public TParseTreeNode createSimpleExpression(TSourceToken st){
385       TExpression retval = (TExpression)createNode(ENodeType.T_Expression.getId(),EExpressionType.simple_source_token_t);
386       //retval.setExpressionType(TExpression.simpleSourcetoken);
387       //retval.setExprType(EExpressionType.simple_source_token_t);
388       retval.setSourcetokenOperand(st);
389        retval.setStartToken(st);
390        retval.setObjectOperand(createObjectNameWithPart(st));
391        retval.setEndToken(st);
392       return retval;
393    }
394
395    public TParseTreeNode createSimpleExpression(THiveVariable variable){
396       TExpression retval = (TExpression)createNode(ENodeType.T_Expression.getId(),EExpressionType.hive_variable_t);
397       retval.setHive_variable(variable);
398        retval.setStartToken(variable);
399        retval.setEndToken(variable);
400       return retval;
401    }
402
403    private ELiteralType getETByNT(ENodeType ent){
404        ELiteralType et = ELiteralType.etString;
405        switch (ent){
406            case T_Constant:
407                et = ELiteralType.etString;
408                break;
409            case T_Constant_Double:
410            case T_Constant_Float:
411                et = ELiteralType.etFloat;
412                break;
413            case T_Constant_Integer:
414                et = ELiteralType.etNumber;
415                break;
416            case T_Constant_String:
417                et = ELiteralType.etString;
418                break;
419            case T_Constant_BindV:
420                break;
421            case T_Constant_Boolean:
422                et = ELiteralType.bool;
423                break;
424            case T_Constant_Date:
425                et = ELiteralType.datetime_date;
426                break;
427            case T_Constant_Interval:
428                et = ELiteralType.interval;
429                break;
430            case T_Constant_Null:
431                et = ELiteralType.character_string;
432                break;
433            case T_Constant_Time:
434                et = ELiteralType.datetime_time;
435                break;
436            case T_Constant_Timestamp:
437                et = ELiteralType.datetime_timestamp;
438                break;
439            default:
440                break;
441        }
442        return et;
443    }
444    public TParseTreeNode createConstant(TSourceToken st,ENodeType ent){
445         TConstant retval = (TConstant)createNode(ENodeType.T_Constant.getId(),getETByNT(ent)); //(TConstant) createNode(ent.getId());
446         retval.setStartToken(st);
447         retval.setEndToken(st);
448         retval.setValueToken(st);
449         return retval;
450    }
451
452//    public TParseTreeNode createConstant(TParseTreeNode node,ENodeType ent){
453//         TConstant retval = (TConstant)createNode(ENodeType.T_Constant.getId(),getETByNT(ent));//(TConstant) createNode(ent.getId());
454//        retval.setStartToken(node);
455//        retval.setEndToken(node);
456//         return retval;
457//    }
458
459    private Class<? extends TParseTreeNode> getNodeClass(int nodeType) {
460        // ConcurrentHashMap.computeIfAbsent is thread-safe, but we add extra safety
461        return NODE_TYPE_CLASSES.computeIfAbsent(nodeType, id -> {
462            try {
463                ENodeType type = ENodeType.fromId(id);
464                if (type != null) {
465                    return (Class<? extends TParseTreeNode>) Class.forName(type.toString());
466                }
467                return null;
468            } catch (ClassNotFoundException e) {
469                // Log the error but return null to indicate class not found
470                System.err.println("Failed to load class for node type " + id + ": " + e.getMessage());
471                return null;
472            }
473        });
474    }
475
476    /**
477     * Get a node that takes no initializer arguments.
478     *
479     * @param nodeType          Identifier for the type of node.
480     *
481     * @return  A new ParseTree node.
482     */
483    public TParseTreeNode createNode(int nodeType) {
484        TParseTreeNode retval = null;
485        
486        // First check for a specialized factory method
487        Supplier<TParseTreeNode> factory = NODE_FACTORIES.get(nodeType);
488        if (factory != null) {
489            // Use direct instantiation without reflection
490            retval = factory.get();
491        } else {
492            // Get from class cache - this method handles thread-safe caching internally
493            Class<? extends TParseTreeNode> nodeClass = getNodeClass(nodeType);
494            
495            if (nodeClass == null) {
496                System.err.println("Unable to find or load class for nodeType: " + nodeType);
497                return null;
498            }
499
500            try {
501                retval = nodeClass.newInstance();
502            } catch (Exception iae) {
503                System.err.println("Failed to instantiate node: " + iae.toString() + ", nodeType: " + nodeType);
504                return null;
505            }
506        }
507
508        if (retval == null) {
509            return null;
510        }
511
512        // Thread-safe initialization of the created node
513        retval.setNodeType(nodeType);
514        if (nodeType != 25) {
515            // T_Typename(25,"gudusoft.gsqlparser.nodes.TTypeName"),
516            // don't sqlparser instance to a ttypename to avoid memory leak
517            TGSqlParser currentParser = this.gsqlparser; // Read volatile field once
518            if (currentParser != null) {
519                retval.setGsqlparser(currentParser);
520            }
521        }
522        
523        EDbVendor currentDbVendor = this.dbVendor; // Read volatile field once
524        if ((retval.dbvendor == EDbVendor.dbvgeneric) && (currentDbVendor != EDbVendor.dbvgeneric)){
525            // not already set in retval.setGsqlparser(this.gsqlparser);
526            retval.dbvendor = currentDbVendor;
527        }
528
529        return retval;
530    }
531
532    public <T>  TPTNodeList<T> createPTNodeList(T c) {
533        int nodeType = ENodeType.T_PTNodeList.getId(); // T_PTNodeList(14,"gudusoft.gsqlparser.nodes.TPTNodeList"),
534        TPTNodeList<T> retval = new gudusoft.gsqlparser.nodes.TPTNodeList<T>();
535        retval.setNodeType(nodeType);
536        
537        // Thread-safe access to volatile field
538        TGSqlParser currentParser = this.gsqlparser;
539        if (currentParser != null) {
540            retval.setGsqlparser(currentParser);
541        }
542        
543        retval.init(c);
544        return retval;
545    }
546
547
548    /**
549     * Translate a node type to a class name
550     *
551     * @param nodeType  A node type identifier 
552     *
553     */
554    protected String nodeName(int nodeType)
555    {
556       return ENodeType.fromId(nodeType).toString();
557    }
558
559    /**
560     * Get a node that takes one initializer argument.
561     *
562     * @param nodeType          Identifier for the type of node.
563     * @param arg1      The initializer argument
564     *
565     * @return  A new ParseTree node.
566     *
567     */
568    public final TParseTreeNode createNode(int nodeType, Object arg1)
569    {
570        TParseTreeNode retval = createNode(nodeType);
571
572        retval.init(arg1);
573
574        return  retval;
575    }
576
577    /**
578     * Get a node that takes one initializer argument.
579     *
580     * @param nodeType          Identifier for the type of node.
581     * @param arg1      The initializer argument
582     * @param arg2      The initializer argument
583     *
584     * @return  A new ParseTreeNode node.
585     *
586     */
587    public final TParseTreeNode createNode(int nodeType, Object arg1, Object arg2)
588    {
589        TParseTreeNode retval = createNode(nodeType);
590
591        retval.init(arg1,arg2);
592
593        return  retval;
594    }
595
596    /**
597     * Get a node that takes one initializer argument.
598     *
599     * @param nodeType          Identifier for the type of node.
600     * @param arg1      The initializer argument
601     * @param arg2      The initializer argument
602     * @param arg3      The initializer argument
603     *
604     * @return  A new ParseTreeNode node.
605     *
606     */
607    public final TParseTreeNode createNode(int nodeType, Object arg1, Object arg2, Object arg3)
608    {
609        TParseTreeNode retval = createNode(nodeType);
610
611        retval.init(arg1,arg2,arg3);
612
613        return  retval;
614    }
615
616    public final TParseTreeNode createNode(int nodeType, Object arg1, Object arg2, Object arg3, Object arg4)
617    {
618        TParseTreeNode retval = createNode(nodeType);
619
620        retval.init(arg1,arg2,arg3,arg4);
621
622        return  retval;
623    }
624
625    public final TParseTreeNode createNode(int nodeType, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)
626    {
627        TParseTreeNode retval = createNode(nodeType);
628
629        retval.init(arg1,arg2,arg3,arg4,arg5);
630
631        return  retval;
632    }
633
634    public final TParseTreeNode createNode(int nodeType, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6)
635    {
636        TParseTreeNode retval = createNode(nodeType);
637
638        retval.init(arg1,arg2,arg3,arg4,arg5,arg6);
639
640        return  retval;
641    }
642
643
644}