001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.hive.THiveGrantRoleSqlNode;
005import gudusoft.gsqlparser.nodes.hive.THiveGrantSqlNode;
006import gudusoft.gsqlparser.nodes.mssql.TMssqlStmtStubSqlNode;
007import gudusoft.gsqlparser.stmt.*;
008import gudusoft.gsqlparser.stmt.hive.*;
009import gudusoft.gsqlparser.stmt.mysql.*;
010import gudusoft.gsqlparser.stmt.db2.*;
011import gudusoft.gsqlparser.stmt.oracle.*;
012import gudusoft.gsqlparser.stmt.mssql.*;
013import gudusoft.gsqlparser.stmt.postgresql.TMoveStmt;
014import gudusoft.gsqlparser.stmt.postgresql.TPerformanceStmt;
015import gudusoft.gsqlparser.stmt.snowflake.*;
016import gudusoft.gsqlparser.stmt.sybase.TSybaseDeleteStatistics;
017import gudusoft.gsqlparser.stmt.sybase.TSybaseDumpTran;
018import gudusoft.gsqlparser.stmt.sybase.TSybaseUpdateIndexStatistics;
019import gudusoft.gsqlparser.stmt.sybase.TSybaseWritetext;
020import gudusoft.gsqlparser.stmt.teradata.*;
021import gudusoft.gsqlparser.nodes.teradata.TTeradataStmtStubSqlNode;
022
023
024
025public class TStatementSqlNode extends TParseTreeNode {
026
027    public final static int caseExpression = 41;
028    public final static int truncateTable = 77;
029
030    public final static int stubStmtSqlNode = 80;
031    public final static int rolllbackSqlNode = 82;
032    public final static int commitSqlNode = 83;
033
034
035    public final static int select = 100;
036    public final static int delete = 101;
037    public final static int update = 102;
038    public final static int insert = 103;
039    public final static int createtable = 104;
040    public final static int CreateProcedureSqlNode = 105;
041    public final static int CreateFunctionSqlNode = 106;
042    public final static int block = 107;  // sql server block, plsql_block,
043    public final static int returnstmt = 108;
044    public final static int createviewstmt = 110;
045    public final static int ifstmt = 112;
046    public final static int declare = 113;
047    public final static int CreateIndexSqlNode = 116;
048    public final static int DropTableSqlNode = 119;
049    public final static int DropIndexSqlNode = 120;
050    public final static int DropViewSqlNode = 121;
051    public final static int AlterTableSqlNode = 123;
052    public final static int MergeSqlNode = 124;
053    public final static int ContinueSqlNode = 125;
054    public final static int BreakSqlNode = 126;
055    public final static int GrantSqlNode = 127;
056    public final static int FetchSqlNode = 128;
057    public final static int OpenSqlNode = 129;
058    public final static int CloseSqlNode = 130;
059    public final static int ExecuteAsSqlNode = 131;
060    public final static int ExecuteSqlNode = 132;
061    public final static int RevokeSqlNode = 133;
062    public final static int DropDbObjectSqlNode = 135;
063    public final static int CollectStatisticsSqlNode = 136;
064    public final static int callSqlNode = 137;
065    public final static int createDatabaseSqlNode = 151;
066    public final static int createSchemaSqlNode = 153;
067    public final static int DenySqlNode = 155;
068
069    public final static int CommentSqlNode = 185;
070
071    public final static int alterViewSqlNode = 355;
072    public final static int alterIndexSqlNode = 356;
073    public final static int alterDatabaseSqlNode = 357;
074
075    public final static int dropSequenceSqlNode = 364;
076    public final static int dropProcedureSqlNode = 366;
077    public final static int dropDatabaseSqlNode = 367;
078    public final static int dropSchemaSqlNode = 368;
079    public final static int dropFunctionSqlNode = 369;
080
081    public final static int IterateSqlNode = 410;
082
083
084
085    public final static int ExecImmeNode = 514;
086
087    public final static int createSynonymSqlNode = 552;
088    public final static int OracleConstructorSpec = 585;
089    public final static int OracleConstructorBody = 587;
090    public final static int OracleCompoundTriggerBody = 597;
091
092    public final static int EndTranSqlNode = 610;
093    public final static int MssqlSetSqlNode = 611;
094    public final static int BeginTranSqlNode = 612;
095    public final static int MssqlRaiserrorSqlNode = 613;
096    public final static int MssqlGotoSqlNode = 614;
097    public final static int MssqlLabelSqlNode = 615;
098    public final static int MssqlDeallocateSqlNode = 616;
099    public final static int MssqlBeginDialogSqlNode = 619;
100    public final static int MssqlSendOnConversationSqlNode = 620;
101    public final static int MssqlEndConversationSqlNode = 621;
102    public final static int MssqlRevertSqlNode = 622;
103    public final static int MssqlBulkInsert = 625;
104    public final static int MssqlUpdateTextSqlNode = 626;
105    public final static int MssqlStmtStubSqlNode = 627;
106    public final static int MssqlSetRowCountSqlNode = 714;
107    public final static int MssqlThrowSqlNode = 716;
108    public final static int MssqlReconfigureSqlNode = 717;
109    public final static int MssqlTryCatchSqlNode = 721;
110    public final static int MssqlCreateTypeSqlNode = 718;
111    public final static int MssqlCreateXmlSchemaCollectionSqlNode = 724;
112    public final static int MssqlBeginConversationTimerSqlNode = 726;
113
114    public final static int T_DisableEnableTriggerSqlNode = 737;
115    public final static int TCreatePartitionFunctionSqlNode = 747;
116    public final static int TAlterPartitionFunctionSqlNode = 748;
117    public final static int TCreatePartitionSchemeSqlNode = 750;
118    public final static int TAlterPartitionSchemeSqlNode = 751;
119
120    public final static int PrepareSqlNode = 808;
121    public final static int DeallocatePrepareSqlNode = 817;
122    public final static int LeaveSqlNode = 820;
123
124    public final static int T_CompoundSqlNode = 911;
125
126
127    public final static int  ForSqlNode = 913;
128    public final static int  SetSqlNode = 919;
129    public final static int  UnsetSqlNode = 920;
130    public final static int  WhileSqlNode = 921;
131    public final static int  RepeatSqlNode = 923;
132    public final static int  LoopSqlNode = 925;
133    //public final static int  ContinueSqlNode = 926;
134
135    public final static int ParseErrorNode = 990;
136    public final static int CreateTypeSqlNode = 992;
137
138    public final static int dummyNode = 1000;
139    public final static int dummyListNode = 1001;
140
141     //teradata
142    public final static int T_TeradataStmtStubSqlNode = 1105;
143    public final static int  T_TeradataUsingSqlNode = 1106;
144    public final static int  T_TeradataLockSqlNode = 1107;
145    public final static int  T_TeradataLockClause = 1108;
146    public final static int  T_TeradataGiveSqlNode = 1109;
147    public final static int T_CreateMacroSqlNode = 1110;
148    public final static int T_SetSessionSqlNode = 1117;
149
150
151
152    //postgresql
153    public final static int performanceSqlNode = 1264;
154    public final static int getDiagSqlNode = 1266;
155     public final static int moveSqlNode = 1268;
156
157    public final static int hiveLoadSqlNode = 1839;
158    public final static int hiveExportSqlNode = 1841;
159    public final static int hiveImportSqlNode = 1843;
160    public final static int hiveSwitchDBSqlNode = 1847;
161    public final static int hiveDropDBSqlNode = 1849;
162    public final static int hiveDescribeSqlNode = 1861;
163    public final static int hiveShowSqlNode = 1863;
164    public final static int msckSqlNode = 1865;
165    public final static int hiveDropFunctionSqlNode = 1867;
166    public final static int analyzeSqlNode = 1869;
167    public final static int LockSqlNode = 1871;
168    public final static int hiveCreateRoleSqlNode = 1873;
169    public final static int hiveGrantSqlNode = 1875;
170    public final static int hiveDropRoleSqlNode = 1887;
171    public final static int hiveShowGrantSqlNode = 1891;
172    public final static int hiveShowRoleGrantSqlNode = 1893;
173    public final static int hiveGrantRoleSqlNode = 1895;
174    public final static int hiveFromQuerySqlNode = 1897;
175    public final static int sybaseDumpTranSqlNode = 2001;
176    public final static int sybaseUpdateIndexStatisticsSqlNode = 2003;
177    public final static int sybaseInsertBulkSqlNode = 2005;
178    public final static int sybaseWritetextSqlNode = 2007;
179    public final static int sybaseDeleteStatisticsSqlNode = 2009;
180
181    public final static int upsertSqlNode = 5520;
182
183    public final static int TSignalSqlNode = 6701;
184
185    public final static int TCreateStageSqlNode = 6505;//snowflake
186    public final static int TCreateStreamSqlNode = 6506;//snowflake
187    public final static int TCreatePipeSqlNode = 6507;//snowflake
188    public final static int  TCreateTaskSqlNode= 6508;//snowflake
189    public final static int  TCreateSemanticViewSqlNode= 6509;//snowflake
190    public final static int  TAlterSessionSqlNode= 6515;//snowflake
191    public final static int  TResetSqlNode= 6610;//gaussdb
192
193
194
195    public final static int TDoExecuteBlockSqlNode = 6611;//gaussdb
196
197    // StarRocks
198    public final static int TCreateRoutineLoadSqlNode = 7301;//starrocks
199    public final static int TRoutineLoadJobActionSqlNode = 7302;//starrocks
200    public final static int TAlterRoutineLoadSqlNode = 7303;//starrocks
201    public final static int TShowRoutineLoadSqlNode = 7304;//starrocks
202    public final static int TFilesTableFunction = 7305;//starrocks
203    public final static int TPipeOperator = 7306;//starrocks
204    public final static int TSubmitTaskSqlNode = 7307;//starrocks
205    public final static int TDropTaskSqlNode = 7308;//starrocks
206    public final static int TBeginLoadTransactionSqlNode = 7309;//starrocks
207    public final static int TCommitLoadTransactionSqlNode = 7310;//starrocks
208    public final static int TAbortLoadTransactionSqlNode = 7311;//starrocks
209    public final static int TShowLoadTransactionSqlNode = 7312;//starrocks
210    public final static int TExportSqlNode = 7313;//starrocks
211    public final static int TShowExportSqlNode = 7314;//starrocks
212    public final static int TCancelExportSqlNode = 7315;//starrocks
213    public final static int TCreateResourceGroupSqlNode = 7316;//starrocks
214    public final static int TDropResourceGroupSqlNode = 7317;//starrocks
215    public final static int TResourceGroupClassifier = 7318;//starrocks
216    public final static int TAlterResourceGroupSqlNode = 7319;//starrocks
217    public final static int TShowResourceGroupSqlNode = 7320;//starrocks
218    public final static int TCreateStorageVolumeSqlNode = 7321;//starrocks
219    public final static int TAlterStorageVolumeSqlNode = 7322;//starrocks
220    public final static int TDropStorageVolumeSqlNode = 7323;//starrocks
221    public final static int TShowStorageVolumeSqlNode = 7324;//starrocks
222    public final static int TDescStorageVolumeSqlNode = 7325;//starrocks
223    public final static int TBackupSnapshotSqlNode = 7326;//starrocks
224    public final static int TCreateRepositorySqlNode = 7327;//starrocks
225    public final static int TDropRepositorySqlNode = 7328;//starrocks
226    public final static int TRestoreSnapshotSqlNode = 7329;//starrocks
227    public final static int TShowBackupRestoreSqlNode = 7330;//starrocks
228    public final static int TShowSnapshotSqlNode = 7331;//starrocks
229    public final static int TCancelBackupRestoreSqlNode = 7332;//starrocks
230    public final static int TCacheSelectSqlNode = 7333;//starrocks
231    public final static int TCreateDictionarySqlNode = 7334;//starrocks
232    public final static int TDropDictionarySqlNode = 7335;//starrocks
233    public final static int TRefreshDictionarySqlNode = 7336;//starrocks
234    public final static int TShowDictionarySqlNode = 7337;//starrocks
235    public final static int TShowFunctionsSqlNode = 7338;//starrocks
236
237    public final static int TOnConflictClause = 7341;
238
239    private TParseTreeNode sqlNode = null;
240    private TCustomSqlStatement stmt = null;
241
242    public TCustomSqlStatement getStmt() {
243        return stmt;
244    }
245
246    private boolean isParsed = true;
247
248    public void setParsed(boolean parsed) {
249        isParsed = parsed;
250    }
251
252    public void setSqlNode(TParseTreeNode sqlNode) {
253        this.sqlNode = sqlNode;
254    }
255
256    public void init(Object arg1){
257        if (arg1 instanceof TCustomSqlStatement){
258           stmt = (TCustomSqlStatement)arg1;
259        }else{
260          sqlNode = (TParseTreeNode)arg1;
261        }
262    }
263
264    private  TObjectName endlabelName;
265
266    public void setEndlabelName(TObjectName endlabelName) {
267        this.endlabelName = endlabelName;
268    }
269
270    public TObjectName getEndlabelName() {
271
272        return endlabelName;
273    }
274
275    private  TObjectName labelName;
276
277    public void setLabelName(TObjectName labelName) {
278        this.labelName = labelName;
279    }
280
281    public TObjectName getLabelName() {
282
283        return labelName;
284    }
285
286    public void init(Object arg1,Object arg2){
287        this.init(arg1);
288        this.labelName = (TObjectName)arg2;
289    }
290
291
292    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
293        if (stmt != null){
294            // stmt in plsql already create stmt descends from  TCustomSqlStatement
295            if (!isParsed){
296              stmt.parsestatement(psql,isParsed);
297            }else{
298                stmt.doParseStatement(psql);
299            }
300            if (stmt.getLabelName() == null){
301                stmt.setLabelName(this.labelName);
302            }
303            return;
304        }
305        
306        if (sqlNode == null) return ;
307
308        switch(sqlNode.getNodeType()){
309            case(select):
310//                TSelectSqlNode selectSqlNode = (TSelectSqlNode)sqlNode;
311//                if (selectSqlNode.isHiveFromQuery()){
312//                    stmt = new THiveFromQuery(psql.dbvendor);
313//                }else{
314//                    stmt = new TSelectSqlStatement(psql.dbvendor);
315//                }
316
317                stmt = new TSelectSqlStatement(psql.dbvendor);
318                break;
319            case(delete):
320                stmt = new TDeleteSqlStatement(psql.dbvendor);
321                break;
322            case(update):
323                stmt = new TUpdateSqlStatement(psql.dbvendor);
324                break;
325            case(insert):
326                stmt = new TInsertSqlStatement(psql.dbvendor);
327                break;
328            case(MssqlBulkInsert):
329                stmt = new TMssqlBulkInsert(psql.dbvendor);
330                break;
331            case(MssqlUpdateTextSqlNode):
332                stmt = new TMssqlUpdateText(psql.dbvendor);
333                break;
334            case (MssqlSetRowCountSqlNode):
335                stmt = new TMssqlSetRowCount(psql.dbvendor);
336                break;
337            case (MssqlThrowSqlNode):
338                stmt = new TMssqlThrow(psql.dbvendor);
339                break;
340            case MssqlReconfigureSqlNode:
341                stmt = new TReconfigure(psql.dbvendor);
342                break;
343            case MssqlCreateTypeSqlNode:
344                stmt = new TMssqlCreateType(psql.dbvendor);
345                break;
346            case(createtable):
347                stmt = new TCreateTableSqlStatement(psql.dbvendor);
348                break;
349            case(declare):
350                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
351                    stmt = new TMssqlDeclare(psql.dbvendor);
352                }else if ((psql.dbvendor == EDbVendor.dbvmysql)||(psql.dbvendor == EDbVendor.dbvbigquery)){
353                    stmt = new TMssqlDeclare(psql.dbvendor);
354                }else if (psql.dbvendor == EDbVendor.dbvteradata){
355                    stmt = new TMssqlDeclare(psql.dbvendor);
356                }else if (psql.dbvendor == EDbVendor.dbvdb2){
357                  TDeclareSqlNode declareNode = (TDeclareSqlNode)sqlNode;
358                    switch(declareNode.getDeclareType()){
359                        case variable:
360                            stmt = new TDb2SqlVariableDeclaration(psql.dbvendor);
361                            break;
362                       case conditions:
363                           stmt = new TDb2ConditionDeclaration(psql.dbvendor);
364                           break;
365                       case returnCode:
366                           stmt = new TDb2ReturnCodesDeclaration(psql.dbvendor);
367                           break;
368                       case statement:
369                           stmt = new TDb2StatementDeclaration(psql.dbvendor);
370                           break;
371                       case cursor:
372                           stmt = new TDb2DeclareCursorStatement(psql.dbvendor);
373                           break;
374                       case handlers:
375                           stmt = new TDb2HandlerDeclaration(psql.dbvendor);
376                           break;
377                       default:
378                           break;
379                    }
380                }
381                break;
382            case T_CompoundSqlNode: //db2 compound sql node
383                stmt = new TCommonBlock(psql.dbvendor);
384                break;
385            case(block):
386                switch (psql.dbvendor){
387                    case dbvmssql:
388                    case dbvsybase:
389                    // case dbvazuresql:
390                        // Check if this is a TRY/CATCH block by examining tokens
391                        if (isTryCatchBlock(sqlNode)) {
392                            stmt = new TMssqlTryCatch(psql.dbvendor);
393                        } else {
394                            stmt = new TMssqlBlock(psql.dbvendor);
395                        }
396                        break;
397                    case dbvoracle:
398                    case dbvpostgresql:
399                    case dbvteradata:
400                    case dbvbigquery:
401                    case dbvsnowflake:
402                    case dbvmysql:
403                    case dbvnetezza:
404                    case dbvgreenplum:
405                    case dbvgaussdb:
406                    case dbvredshift:
407                    case dbvhana:
408
409                        stmt = new TCommonBlock(psql.dbvendor);
410                        break;
411                    default:
412                        System.out.println("block type not implemented: "+psql.dbvendor.toString());
413                        break;
414                }
415//                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)){
416//                    stmt = new TMssqlBlock(psql.dbvendor);
417//                }else if ((psql.dbvendor == EDbVendor.dbvoracle)||(psql.dbvendor == EDbVendor.dbvpostgresql)
418//                            ||(psql.dbvendor == EDbVendor.dbvteradata)||(psql.dbvendor == EDbVendor.dbvbigquery)){
419//                    stmt = new TCommonBlock(psql.dbvendor);
420//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
421//                    stmt = new TCommonBlock(psql.dbvendor);
422//                }else{
423//                   System.out.println("block type not implemented: "+psql.dbvendor.toString());
424//                }
425                break;
426            case(MssqlTryCatchSqlNode):
427                stmt = new TMssqlTryCatch(psql.dbvendor);
428                break;
429            case(returnstmt):
430                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
431                    stmt = new TMssqlReturn(psql.dbvendor);
432                }else if (psql.dbvendor == EDbVendor.dbvdb2){
433                    stmt = new TDb2ReturnStmt(psql.dbvendor);
434                }else if (psql.dbvendor == EDbVendor.dbvmysql){
435                    stmt = new TReturnStmt(psql.dbvendor);
436                }
437                break;
438            case(ifstmt):
439                switch (psql.dbvendor){
440                    case dbvmssql:
441                    case dbvsybase:
442                        stmt = new TMssqlIfElse(psql.dbvendor);
443                        break;
444                    case dbvmysql:
445                        stmt = new TMySQLIfStmt(psql.dbvendor);
446                        break;
447                    case dbvbigquery:
448                    case dbvdb2:
449                    case dbvhana:
450                        stmt = new TIfStmt(psql.dbvendor);
451                        break;
452                }
453
454
455                break;
456            case (CreateProcedureSqlNode):
457                if ((psql.dbvendor == EDbVendor.dbvoracle)||(psql.dbvendor == EDbVendor.dbvgaussdb)){
458                    // plsql procedure declaration or specification
459                    stmt = new TPlsqlCreateProcedure(EDbVendor.dbvoracle);
460                    ((TPlsqlCreateProcedure)stmt).setKind(((TCreateProcedureSqlNode)sqlNode).getKind());
461                }else if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)){
462                    stmt = new TMssqlCreateProcedure(psql.dbvendor);
463                }else if (psql.dbvendor == EDbVendor.dbvdb2){
464                    stmt = new TCreateProcedureStmt(psql.dbvendor);
465                }else{
466                    System.out.println("create procedure not implemented: "+psql.dbvendor.toString());
467                }
468                break;
469            case (CreateFunctionSqlNode):
470                switch (psql.dbvendor){
471                    case dbvoracle:
472                        stmt = new TPlsqlCreateFunction(EDbVendor.dbvoracle);
473                        ((TPlsqlCreateFunction)stmt).setKind(((TCreateFunctionSqlNode)sqlNode).getKind());
474                        break;
475                    case dbvmssql:
476                    case dbvsybase:
477                        stmt = new TMssqlCreateFunction(psql.dbvendor);
478                        break;
479                    case dbvdb2:
480                    case dbvgreenplum:
481                    case dbvbigquery:
482                    case dbvgaussdb:
483                        stmt = new TCreateFunctionStmt(psql.dbvendor);
484                        break;
485                    case dbvhive:
486                        stmt = new THiveCreateFunction(psql.dbvendor);
487                        break;
488                    default:
489                        System.out.println("create function not implemented: "+psql.dbvendor.toString());
490                        break;
491                }
492                break;
493            case (ExecImmeNode):
494                stmt = new TExecImmeStmt(psql.dbvendor);
495                break;
496            case (ContinueSqlNode):
497                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)) {
498                    stmt = new TMssqlContinue(psql.dbvendor);
499                }else if (psql.dbvendor == EDbVendor.dbvoracle){
500                    stmt = new TPlsqlContinue(psql.dbvendor);
501                }
502                break;
503            case (BreakSqlNode):
504                stmt = new TBreakStmt(psql.dbvendor);
505                break;
506            case (GrantSqlNode):
507                stmt = new TGrantStmt(psql.dbvendor);
508                break;
509            case (DenySqlNode):
510                stmt = new TDenyStmt(psql.dbvendor);
511                break;
512            case (RevokeSqlNode):
513                stmt = new TRevokeStmt(psql.dbvendor);
514                break;
515            case (FetchSqlNode):
516                if ((psql.dbvendor == EDbVendor.dbvmssql)
517                        ||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvteradata)||(psql.dbvendor == EDbVendor.dbvhana)){
518                    stmt = new TMssqlFetch(psql.dbvendor);
519                }else if (psql.dbvendor == EDbVendor.dbvdb2){
520                    stmt = new TDb2FetchCursorStmt(psql.dbvendor);
521                }else if (psql.dbvendor == EDbVendor.dbvmysql){
522                    stmt = new TFetchStmt(psql.dbvendor);
523                }
524                break;
525            case (OpenSqlNode):
526                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
527                    stmt = new TMssqlOpen(psql.dbvendor);
528                }else if (psql.dbvendor == EDbVendor.dbvdb2){
529                    stmt = new TDb2OpenCursorStmt(psql.dbvendor);
530                }else if (psql.dbvendor == EDbVendor.dbvmysql){
531                    stmt = new TOpenStmt(psql.dbvendor);
532                }else if (psql.dbvendor == EDbVendor.dbvteradata){
533                    stmt = new TMssqlOpen(psql.dbvendor);
534                }
535                break;
536            case (CloseSqlNode):
537                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
538                    stmt = new TMssqlClose(psql.dbvendor);
539                }else if (psql.dbvendor == EDbVendor.dbvdb2){
540                    stmt = new TDb2CloseCursorStmt(psql.dbvendor);
541                }else if (psql.dbvendor == EDbVendor.dbvteradata){
542                    stmt = new TCloseStmt(EDbVendor.dbvteradata);
543                }else if (psql.dbvendor == EDbVendor.dbvmysql){
544                    stmt = new TCloseStmt(psql.dbvendor);
545                }else if (psql.dbvendor == EDbVendor.dbvredshift){
546                    stmt = new TCloseStmt(psql.dbvendor);
547                }
548                break;
549            case (CreateIndexSqlNode):
550                stmt = new TCreateIndexSqlStatement(psql.dbvendor);
551                break;
552            case (DropTableSqlNode):
553                stmt = new TDropTableSqlStatement(psql.dbvendor);
554                break;
555            case (DropIndexSqlNode):
556                stmt = new TDropIndexSqlStatement(psql.dbvendor);
557                break;
558            case (DropViewSqlNode):
559                stmt = new TDropViewSqlStatement(psql.dbvendor);
560                break;
561            case (DropDbObjectSqlNode):
562                stmt = new TMssqlDropDbObject(psql.dbvendor);
563                break;
564            case (AlterTableSqlNode):
565                stmt = new TAlterTableStatement(psql.dbvendor);
566                break;
567            case (alterViewSqlNode):
568                stmt = new TAlterViewStatement(psql.dbvendor);
569                break;
570            case (alterDatabaseSqlNode):
571                stmt = new TAlterDatabaseStmt(psql.dbvendor);
572                break;
573            case (alterIndexSqlNode):
574                stmt = new TAlterIndexStmt(psql.dbvendor);
575                break;
576            case (MssqlDeallocateSqlNode):
577                stmt = new TMssqlDeallocate(psql.dbvendor);
578                break;
579            case(ExecuteSqlNode):
580                switch (psql.dbvendor){
581                    case dbvteradata:
582                        stmt = new TTeradataExecute(psql.dbvendor);
583                        break;
584                    case dbvpostgresql:
585                    case dbvsnowflake:
586                    case dbvnetezza:
587                    case dbvredshift:
588                        stmt = new TExecuteSqlStatement(psql.dbvendor);
589                        break;
590                    default:
591                        stmt = new TMssqlExecute(psql.dbvendor);
592                        break;
593                }
594
595                break;
596            case(ExecuteAsSqlNode):
597                stmt = new TMssqlExecuteAs(psql.dbvendor);
598                break;
599            case(BeginTranSqlNode):
600                stmt = new TBeginTran(psql.dbvendor);
601                break;
602            case(EndTranSqlNode):
603                stmt = new TEndTran(psql.dbvendor);
604                break;
605            case(MssqlRaiserrorSqlNode):
606                stmt = new TMssqlRaiserror(psql.dbvendor);
607                break;
608            case(MssqlLabelSqlNode):
609                stmt = new TMssqlLabel(psql.dbvendor);
610                break;
611            case(MssqlGotoSqlNode):
612                stmt = new TMssqlGoTo(psql.dbvendor);
613                break;
614            case(MssqlRevertSqlNode):
615                stmt = new TMssqlRevert(psql.dbvendor);
616                break;
617            case MssqlSendOnConversationSqlNode:
618                stmt = new  TMssqlSendOnConversation(psql.dbvendor);
619                break;
620            case(MssqlEndConversationSqlNode):
621                stmt = new TMssqlEndConversation(psql.dbvendor);
622                break;
623            case(MssqlBeginDialogSqlNode):
624                stmt = new TMssqlBeginDialog(psql.dbvendor);
625                break;
626            case MssqlSetSqlNode:
627                stmt = new TMssqlSet(psql.dbvendor);
628                break;
629            case LoopSqlNode:
630                switch (psql.dbvendor){
631                    case dbvdb2:
632                        stmt = new TDb2LoopStmt(EDbVendor.dbvdb2);
633                        break;
634                    default:
635                        stmt = new TLoopStmt(psql.dbvendor);
636                        break;
637
638                }
639                break;
640            case RepeatSqlNode:
641                stmt = new TRepeatStmt(psql.dbvendor);
642//                if (psql.dbvendor == EDbVendor.dbvdb2){
643//                    stmt = new TRepeatStmt(EDbVendor.dbvdb2);
644//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
645//                    stmt = new TMySQLRepeatStmt(EDbVendor.dbvmysql);
646//                }
647                break;
648            case WhileSqlNode:
649                stmt = new TWhileStmt(psql.dbvendor);
650//                if (psql.dbvendor == EDbVendor.dbvdb2){
651//                    stmt = new TWhileStmt(EDbVendor.dbvdb2);
652//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
653//                    stmt = new TMySQLWhileStmt(EDbVendor.dbvmysql);
654//                }
655                break;
656            case ForSqlNode:
657                stmt = new TForStmt(dbvendor);
658                break;
659            case SetSqlNode:
660                switch (psql.dbvendor){
661                    case dbvhive:
662                        stmt = new THiveSet(EDbVendor.dbvhive);
663                        break;
664                    case dbvmysql:
665                    case dbvbigquery:
666                    case dbvteradata:
667                    case dbvgaussdb:
668                    case dbvsparksql:
669                        stmt = new TSetStmt(psql.dbvendor);
670                        break;
671                    default:
672                        stmt = new TDb2SetVariableStmt(EDbVendor.dbvdb2);
673                        break;
674                }
675
676                break;
677            case UnsetSqlNode:
678                stmt = new TUnsetStmt(psql.dbvendor);
679                break;
680            case caseExpression:
681                switch (psql.dbvendor){
682                    case dbvdb2:
683                        stmt = new TDb2CaseStmt(EDbVendor.dbvdb2);
684                        break;
685                    case dbvmysql:
686                        stmt = new TMySQLCaseStmt(EDbVendor.dbvmysql);
687                        break;
688                    case dbvteradata:
689                        stmt = new TCaseStmt(EDbVendor.dbvmysql);
690                        break;
691                    default:
692                        break;
693                }
694
695                break;
696            case(MssqlStmtStubSqlNode):
697                //TMssqlStmtStubSqlNode stmt1 = (TMssqlStmtStubSqlNode)sqlNode;
698                if (((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() == ESqlStatementType.sstmssqlset){
699                    stmt = new TMssqlSet(psql.dbvendor);
700                    //((TMssqlSet)stmt).setSetType(TBaseType.mstSetCmd);
701                    stmt.setStartToken(sqlNode);
702                    stmt.setEndToken(sqlNode);
703                }else if (((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() == ESqlStatementType.sstmssqlupdatestatistics){
704                    stmt = new TMssqlUpdateStatistics(psql.dbvendor);
705                }else{
706                    stmt = new TMssqlStmtStub(psql.dbvendor);
707                    ((TMssqlStmtStub)stmt).setSqlStatementType( ((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() );
708                }
709                break;
710            case T_TeradataStmtStubSqlNode:
711                switch (((TTeradataStmtStubSqlNode)sqlNode).getSqlStatementType()){
712                    case sstRevoke:
713                        stmt = new TRevokeStmt(psql.dbvendor);
714                        break;
715                    default:
716                        stmt = new TTeradataStmtStub(psql.dbvendor);
717                        ((TTeradataStmtStub)stmt).sqlstatementtype = ( ((TTeradataStmtStubSqlNode)sqlNode).getSqlStatementType() );
718                }
719                break;
720            case stubStmtSqlNode:
721                TStubStmtSqlNode stubNode = (TStubStmtSqlNode)sqlNode;
722
723                switch(stubNode.getSqlStatementType()){
724                    case sstdb2signal:
725                    case sstsignal:
726                        stmt = new TSignalStmt(psql.dbvendor);
727                        break;
728                    default:
729                        break;
730                }
731
732                if (psql.dbvendor == EDbVendor.dbvdb2){
733                    switch(stubNode.getSqlStatementType()){
734                        case sstdb2iterate:
735                            stmt = new TDb2IterateStmt(EDbVendor.dbvdb2);
736                            break;
737                        case sstdb2call:
738                            stmt = new TDb2CallStmt(EDbVendor.dbvdb2);
739                            break;
740                        case sstdb2leave:
741                            stmt = new TDb2LeaveStmt(EDbVendor.dbvdb2);
742                            break;
743                        case sstdb2signal:
744                            break;
745                        case sstdb2goto:
746                            stmt = new TDb2GotoStmt(EDbVendor.dbvdb2);
747                            break;
748                        case sstdb2set:
749                            stmt = new TDb2SetStmt(EDbVendor.dbvdb2);
750                            break;
751                        default:
752                            stmt = new TDb2StmtStub(EDbVendor.dbvdb2);
753                            ((TDb2StmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
754                            break;
755                    }
756                }else if (psql.dbvendor == EDbVendor.dbvmysql){
757                    stmt = new TMySQLStmtStub(EDbVendor.dbvmysql);
758                    ((TMySQLStmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
759                }else if (psql.dbvendor == EDbVendor.dbvbigquery){
760                    stmt = new TMySQLStmtStub(EDbVendor.dbvbigquery);
761                    ((TMySQLStmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
762                }
763                break;
764            case(dummyNode):
765                TDummy dummy = (TDummy)sqlNode;
766
767                switch (dummy.sqlstatementtype){
768                    case sstcommit:
769                        stmt = new TCommitStmt(psql.dbvendor);
770                        break;
771                    case sstmssqlcommit:
772                        stmt = new TMssqlCommit(psql.dbvendor);
773                        break;
774                    case sstmssqlrollback:
775                        stmt = new TMssqlRollback(psql.dbvendor);
776                        break;
777                    case sstrollback:
778                        stmt = new TRollbackStmt(psql.dbvendor);
779                        break;
780                    case sstmssqlsavetran:
781                        stmt = new TMssqlSaveTran(psql.dbvendor);
782                        break;
783                    case sstmssqlprint:
784                        stmt = new TMssqlPrint(psql.dbvendor);
785                        break;
786                    case sstmssqluse:
787                        stmt = new TUseDatabase(psql.dbvendor);
788                        break;
789                    case sstmssqlgo:
790                        stmt = new TMssqlGo(psql.dbvendor);
791                        break;
792                    case sstHelpProcedure:
793                        stmt = new THelpProcedure(psql.dbvendor);
794                        break;
795                    case sstShowProcedure:
796                        stmt = new TShowProcedure(psql.dbvendor);
797                        break;
798                    case sstRevoke:
799                        stmt = new TRevokeStmt(psql.dbvendor);
800                        break;
801                    case sstAllocate:
802                        stmt = new TAllocateStmt(psql.dbvendor);
803                        break;
804                    case sstDrop:
805                        stmt = new TDropStmt(psql.dbvendor);
806                        break;
807                    case sstmssqlDropSecurityPolicy:
808                        stmt = new TMssqlDropSecurityPolicy(psql.dbvendor);
809                        break;
810                    case sstbegintran:
811                        stmt = new TBeginTran(psql.dbvendor);
812                        break;
813                }
814                break;
815            case(ParseErrorNode):
816                stmt = new TParseErrorSqlStatement(psql.dbvendor);
817                break;
818            case (truncateTable):
819                stmt = new TTruncateStatement(psql.dbvendor);
820                break;
821            case(hiveLoadSqlNode):
822                stmt = new THiveLoad(EDbVendor.dbvhive);
823                break;
824            case (hiveExportSqlNode):
825                stmt = new THiveExportTable(EDbVendor.dbvhive);
826                break;
827            case (hiveImportSqlNode):
828                stmt = new THiveImportTable(EDbVendor.dbvhive);
829                break;
830            case (createDatabaseSqlNode):
831                stmt = new TCreateDatabaseSqlStatement(psql.dbvendor);
832                break;
833            case (hiveSwitchDBSqlNode):
834                stmt = new THiveSwitchDatabase(psql.dbvendor);
835                break;
836            case (hiveDropDBSqlNode):
837                stmt = new THiveDropDatabase(psql.dbvendor);
838                break;
839            case (hiveDescribeSqlNode):
840                stmt = new THiveDescribe(psql.dbvendor);
841                break;
842            case (hiveShowSqlNode):
843                stmt = new THiveShow(psql.dbvendor);
844                break;
845            case (msckSqlNode):
846                stmt = new TMSCKStmt(psql.dbvendor);
847                break;
848            case (hiveDropFunctionSqlNode):
849                stmt = new THiveDropFunction(psql.dbvendor);
850                break;
851            case (analyzeSqlNode):
852                stmt = new TAnalyzeStmt(psql.dbvendor);
853                break;
854            case (LockSqlNode):
855                stmt = new TLockTableStmt(psql.dbvendor);
856                break;
857            case (hiveCreateRoleSqlNode):
858                stmt = new THiveCreateRole(psql.dbvendor);
859                break;
860            case (hiveGrantSqlNode):
861                if (((THiveGrantSqlNode)sqlNode).isRevoke()){
862                    stmt = new THiveRevoke(EDbVendor.dbvhive);
863                }else{
864                    stmt = new THiveGrant(EDbVendor.dbvhive);
865                }
866                break;
867            case (hiveShowGrantSqlNode):
868                stmt = new THiveShowGrant(psql.dbvendor);
869                break;
870            case (hiveDropRoleSqlNode):
871                stmt = new THiveDropRole(psql.dbvendor);
872                break;
873            case (hiveShowRoleGrantSqlNode):
874                stmt = new THiveShowRoleGrant(psql.dbvendor);
875                break;
876            case (hiveGrantRoleSqlNode):
877                if(((THiveGrantRoleSqlNode)sqlNode).isRevoke()){
878                    stmt = new THiveRevokeRole(psql.dbvendor);
879                }else{
880                    stmt = new THiveGrantRole(psql.dbvendor);
881                }
882
883                break;
884//            case hiveFromQuerySqlNode:
885//                stmt = new THiveFromQuery(EDbVendor.dbvhive);
886//                break;
887           case sybaseDumpTranSqlNode:
888               stmt = new TSybaseDumpTran(EDbVendor.dbvsybase);
889               break;
890           case sybaseUpdateIndexStatisticsSqlNode:
891               stmt = new TSybaseUpdateIndexStatistics(EDbVendor.dbvsybase);
892               break;
893           case sybaseWritetextSqlNode:
894               stmt = new TSybaseWritetext(EDbVendor.dbvsybase);
895               break;
896           case sybaseDeleteStatisticsSqlNode:
897               stmt = new TSybaseDeleteStatistics(EDbVendor.dbvsybase);
898               break;
899           case callSqlNode:
900               stmt = new TCallStatement(psql.dbvendor);
901               break;
902           case moveSqlNode:
903               stmt = new TMoveStmt(EDbVendor.dbvpostgresql);
904               break;
905           case MergeSqlNode:
906               stmt = new TMergeSqlStatement(psql.dbvendor) ;
907               break;
908            case dropSequenceSqlNode:
909                stmt = new TDropSequenceStmt(psql.dbvendor);
910                break;
911            case dropProcedureSqlNode:
912                stmt = new TDropProcedureStmt(psql.dbvendor);
913                break;
914            case OracleCompoundTriggerBody:
915                stmt = new  TCompoundTriggerBody(psql.dbvendor);
916                break;
917            case createSynonymSqlNode:
918                stmt = new TCreateSynonymStmt(psql.dbvendor);
919                break;
920            case T_TeradataLockSqlNode:
921                stmt = new TTeradataLock(psql.dbvendor);
922                break;
923            case  MssqlCreateXmlSchemaCollectionSqlNode:
924                stmt = new TMssqlCreateXmlSchemaCollectionStmt(psql.dbvendor);
925                break;
926            case DeallocatePrepareSqlNode:
927                stmt = new TMySQLDeallocatePrepareStmt(psql.dbvendor);
928                break;
929            case createSchemaSqlNode:
930                stmt = new TCreateSchemaSqlStatement(psql.dbvendor);
931                break;
932            case dropDatabaseSqlNode:
933                stmt = new TDropDatabaseStmt(psql.dbvendor);
934                break;
935            case dropSchemaSqlNode:
936                stmt = new TDropSchemaSqlStatement(psql.dbvendor);
937                break;
938            case MssqlBeginConversationTimerSqlNode:
939                stmt = new TMssqlBeginConversationTimer(psql.dbvendor);
940                break;
941            case getDiagSqlNode:
942                stmt = new TGetDiagStmt(psql.dbvendor);
943                break;
944            case dropFunctionSqlNode:
945                stmt = new TDropFunctionStmt(psql.dbvendor);
946                break;
947            case performanceSqlNode:
948                stmt = new TPerformanceStmt(psql.dbvendor);
949                break;
950            case PrepareSqlNode:
951                stmt = new TPrepareStmt(psql.dbvendor);
952                break;
953            case upsertSqlNode:
954                stmt = new TUpsertStmt(psql.dbvendor);
955                break;
956            case createviewstmt:
957                stmt = new TCreateViewSqlStatement(dbvendor);
958                break;
959            case LeaveSqlNode:
960                stmt = new TLeaveStmt(dbvendor);
961                break;
962            case TSignalSqlNode:
963                stmt = new TSignalStmt(dbvendor);
964                break;
965            case rolllbackSqlNode:
966                stmt = new TRollbackStmt(dbvendor);
967                break;
968            case commitSqlNode:
969                stmt = new TCommitStmt(dbvendor);
970                break;
971            case IterateSqlNode:
972                stmt = new TIterateStmt(dbvendor);
973                break;
974            case T_SetSessionSqlNode:
975                stmt  = new TTeradataSetSession(dbvendor);
976                break;
977            case T_DisableEnableTriggerSqlNode:
978                stmt = new TDisableEnableTriggerStmt(dbvendor);
979                break;
980            case CommentSqlNode:
981                stmt = new TCommentOnSqlStmt(dbvendor);
982                break;
983            case CreateTypeSqlNode:
984                stmt = new TCreateTypeStmt(dbvendor);
985                break;
986            case TCreateStageSqlNode:
987                stmt = new TCreateStageStmt(dbvendor);
988                break;
989            case TCreateStreamSqlNode:
990                stmt = new TCreateStreamStmt(dbvendor);
991                break;
992            case TCreatePipeSqlNode:
993                stmt = new TCreatePipeStmt(dbvendor);
994                break;
995            case CollectStatisticsSqlNode:
996                stmt = new TTeradataCollectStatistics(dbvendor);
997                break;
998            case TResetSqlNode:
999                stmt = new TResetStmt(dbvendor);
1000                break;
1001            case TAlterSessionSqlNode:
1002                stmt = new TAlterSessionStatement(dbvendor);
1003                break;
1004            case TCreateTaskSqlNode:
1005                stmt = new TCreateTaskStmt(dbvendor);
1006                break;
1007            case TCreatePartitionFunctionSqlNode:
1008                stmt = new TCreatePartitionFunctionStmt(dbvendor);
1009                break;
1010            case TAlterPartitionFunctionSqlNode:
1011                stmt = new TAlterPartitionFunctionStmt(dbvendor);
1012                break;
1013            case TCreatePartitionSchemeSqlNode:
1014                stmt = new TCreatePartitionSchemeSqlStatement(dbvendor);
1015                break;
1016            case TAlterPartitionSchemeSqlNode:
1017                stmt = new TAlterPartitionSchemeSqlStatement(dbvendor);
1018                break;
1019            case TCreateRoutineLoadSqlNode:
1020                stmt = new TCreateRoutineLoadStmt(dbvendor);
1021                break;
1022            case TSubmitTaskSqlNode:
1023                stmt = new TSubmitTaskStmt(dbvendor);
1024                break;
1025            case TDropTaskSqlNode:
1026                stmt = new TStarrocksDropTaskStmt(dbvendor);
1027                break;
1028            case TBeginLoadTransactionSqlNode:
1029                stmt = new TBeginLoadTransactionStmt(dbvendor);
1030                break;
1031            case TCommitLoadTransactionSqlNode:
1032                stmt = new TCommitLoadTransactionStmt(dbvendor);
1033                break;
1034            case TAbortLoadTransactionSqlNode:
1035                stmt = new TAbortLoadTransactionStmt(dbvendor);
1036                break;
1037            case TShowLoadTransactionSqlNode:
1038                stmt = new TShowLoadTransactionStmt(dbvendor);
1039                break;
1040            case TExportSqlNode:
1041                stmt = new TStarrocksExportStmt(dbvendor);
1042                break;
1043            case TShowExportSqlNode:
1044                stmt = new TStarrocksShowExportStmt(dbvendor);
1045                break;
1046            case TCancelExportSqlNode:
1047                stmt = new TStarrocksCancelExportStmt(dbvendor);
1048                break;
1049            default:
1050                break;
1051        }
1052
1053        if (stmt != null){
1054            stmt.rootNode = sqlNode;
1055            stmt.setStartToken(sqlNode);
1056            stmt.setEndToken(sqlNode);
1057            stmt.setLabelName(this.labelName);
1058            stmt.doParseStatement(psql);
1059
1060//            if (stmt.getStartToken() == null){
1061//                stmt.setStartToken(sqlNode.getStartToken());
1062//            }
1063//            if (stmt.getEndToken() == null){
1064//                stmt.setEndToken(sqlNode.getEndToken());
1065//            }
1066        }else{
1067           // System.out.println("stmt is null:"+sqlNode.getNodeType());
1068        }
1069
1070    }
1071
1072    /**
1073     * Check if the given block node represents a TRY/CATCH block
1074     * by examining the token pattern: BEGIN TRY ... or END CATCH
1075     */
1076    private boolean isTryCatchBlock(TParseTreeNode sqlNode) {
1077        TSourceToken startToken = sqlNode.getStartToken();
1078        TSourceToken endToken = sqlNode.getEndToken();
1079
1080        if (startToken == null || endToken == null) {
1081            return false;
1082        }
1083
1084        // Check if end token is CATCH (indicates TRY/CATCH block)
1085        if (endToken.astext != null && endToken.astext.equalsIgnoreCase("CATCH")) {
1086            return true;
1087        }
1088
1089        // Check if end token is TRY (TRY-only block without CATCH)
1090        if (endToken.astext != null && endToken.astext.equalsIgnoreCase("TRY")) {
1091            return true;
1092        }
1093
1094        // Check if start is BEGIN and next solid token is TRY
1095        if (startToken.astext != null && startToken.astext.equalsIgnoreCase("BEGIN")) {
1096            TSourceTokenList tokenList = startToken.container;
1097            if (tokenList != null) {
1098                for (int i = startToken.posinlist + 1; i < tokenList.size(); i++) {
1099                    TSourceToken token = tokenList.get(i);
1100                    if (token.tokentype != ETokenType.ttwhitespace &&
1101                        token.tokentype != ETokenType.ttreturn) {
1102                        if (token.astext != null && token.astext.equalsIgnoreCase("TRY")) {
1103                            return true;
1104                        }
1105                        break; // First non-whitespace token is not TRY
1106                    }
1107                }
1108            }
1109        }
1110
1111        return false;
1112    }
1113}
1114