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 MssqlWritetextSqlNode = 628;
107    public final static int MssqlReadtextSqlNode = 629;
108    public final static int MssqlSetRowCountSqlNode = 714;
109    public final static int MssqlThrowSqlNode = 716;
110    public final static int MssqlReconfigureSqlNode = 717;
111    public final static int MssqlTryCatchSqlNode = 721;
112    public final static int MssqlCreateTypeSqlNode = 718;
113    public final static int MssqlCreateXmlSchemaCollectionSqlNode = 724;
114    public final static int MssqlBeginConversationTimerSqlNode = 726;
115
116    public final static int T_DisableEnableTriggerSqlNode = 737;
117    public final static int TCreatePartitionFunctionSqlNode = 747;
118    public final static int TAlterPartitionFunctionSqlNode = 748;
119    public final static int TCreatePartitionSchemeSqlNode = 750;
120    public final static int TAlterPartitionSchemeSqlNode = 751;
121
122    public final static int PrepareSqlNode = 808;
123    public final static int DeallocatePrepareSqlNode = 817;
124    public final static int LeaveSqlNode = 820;
125
126    public final static int T_CompoundSqlNode = 911;
127
128
129    public final static int  ForSqlNode = 913;
130    public final static int  SetSqlNode = 919;
131    public final static int  UnsetSqlNode = 920;
132    public final static int  WhileSqlNode = 921;
133    public final static int  RepeatSqlNode = 923;
134    public final static int  LoopSqlNode = 925;
135    //public final static int  ContinueSqlNode = 926;
136
137    public final static int ParseErrorNode = 990;
138    public final static int CreateTypeSqlNode = 992;
139
140    public final static int dummyNode = 1000;
141    public final static int dummyListNode = 1001;
142
143     //teradata
144    public final static int T_TeradataStmtStubSqlNode = 1105;
145    public final static int  T_TeradataUsingSqlNode = 1106;
146    public final static int  T_TeradataLockSqlNode = 1107;
147    public final static int  T_TeradataLockClause = 1108;
148    public final static int  T_TeradataGiveSqlNode = 1109;
149    public final static int T_CreateMacroSqlNode = 1110;
150    public final static int T_AbortSqlNode = 1112;
151    public final static int T_SetSessionSqlNode = 1117;
152
153
154
155    //postgresql
156    public final static int performanceSqlNode = 1264;
157    public final static int getDiagSqlNode = 1266;
158     public final static int moveSqlNode = 1268;
159
160    public final static int hiveLoadSqlNode = 1839;
161    public final static int hiveExportSqlNode = 1841;
162    public final static int hiveImportSqlNode = 1843;
163    public final static int hiveSwitchDBSqlNode = 1847;
164    public final static int hiveDropDBSqlNode = 1849;
165    public final static int hiveDescribeSqlNode = 1861;
166    public final static int hiveShowSqlNode = 1863;
167    public final static int msckSqlNode = 1865;
168    public final static int hiveDropFunctionSqlNode = 1867;
169    public final static int analyzeSqlNode = 1869;
170    public final static int LockSqlNode = 1871;
171    public final static int hiveCreateRoleSqlNode = 1873;
172    public final static int hiveGrantSqlNode = 1875;
173    public final static int hiveDropRoleSqlNode = 1887;
174    public final static int hiveShowGrantSqlNode = 1891;
175    public final static int hiveShowRoleGrantSqlNode = 1893;
176    public final static int hiveGrantRoleSqlNode = 1895;
177    public final static int hiveFromQuerySqlNode = 1897;
178    public final static int sybaseDumpTranSqlNode = 2001;
179    public final static int sybaseUpdateIndexStatisticsSqlNode = 2003;
180    public final static int sybaseInsertBulkSqlNode = 2005;
181    public final static int sybaseWritetextSqlNode = 2007;
182    public final static int sybaseDeleteStatisticsSqlNode = 2009;
183
184    public final static int upsertSqlNode = 5520;
185
186    public final static int TSignalSqlNode = 6701;
187
188    public final static int TCopyIntoNode = 6502;//snowflake, must match ENodeType.T_CopyIntoNode
189    public final static int TCreateStageSqlNode = 6505;//snowflake
190    public final static int TCreateStreamSqlNode = 6506;//snowflake
191    public final static int TCreatePipeSqlNode = 6507;//snowflake
192    public final static int  TCreateTaskSqlNode= 6508;//snowflake
193    public final static int  TCreateSemanticViewSqlNode= 6509;//snowflake
194    public final static int  TAlterSessionSqlNode= 6515;//snowflake
195    public final static int  TResetSqlNode= 6610;//gaussdb
196
197
198
199    public final static int TDoExecuteBlockSqlNode = 6611;//gaussdb
200
201    // StarRocks
202    public final static int TCreateRoutineLoadSqlNode = 7301;//starrocks
203    public final static int TRoutineLoadJobActionSqlNode = 7302;//starrocks
204    public final static int TAlterRoutineLoadSqlNode = 7303;//starrocks
205    public final static int TShowRoutineLoadSqlNode = 7304;//starrocks
206    public final static int TFilesTableFunction = 7305;//starrocks
207    public final static int TPipeOperator = 7306;//starrocks
208    public final static int TSubmitTaskSqlNode = 7307;//starrocks
209    public final static int TDropTaskSqlNode = 7308;//starrocks
210    public final static int TBeginLoadTransactionSqlNode = 7309;//starrocks
211    public final static int TCommitLoadTransactionSqlNode = 7310;//starrocks
212    public final static int TAbortLoadTransactionSqlNode = 7311;//starrocks
213    public final static int TShowLoadTransactionSqlNode = 7312;//starrocks
214    public final static int TExportSqlNode = 7313;//starrocks
215    public final static int TShowExportSqlNode = 7314;//starrocks
216    public final static int TCancelExportSqlNode = 7315;//starrocks
217    public final static int TCreateResourceGroupSqlNode = 7316;//starrocks
218    public final static int TDropResourceGroupSqlNode = 7317;//starrocks
219    public final static int TResourceGroupClassifier = 7318;//starrocks
220    public final static int TAlterResourceGroupSqlNode = 7319;//starrocks
221    public final static int TShowResourceGroupSqlNode = 7320;//starrocks
222    public final static int TCreateStorageVolumeSqlNode = 7321;//starrocks
223    public final static int TAlterStorageVolumeSqlNode = 7322;//starrocks
224    public final static int TDropStorageVolumeSqlNode = 7323;//starrocks
225    public final static int TShowStorageVolumeSqlNode = 7324;//starrocks
226    public final static int TDescStorageVolumeSqlNode = 7325;//starrocks
227    public final static int TBackupSnapshotSqlNode = 7326;//starrocks
228    public final static int TCreateRepositorySqlNode = 7327;//starrocks
229    public final static int TDropRepositorySqlNode = 7328;//starrocks
230    public final static int TRestoreSnapshotSqlNode = 7329;//starrocks
231    public final static int TShowBackupRestoreSqlNode = 7330;//starrocks
232    public final static int TShowSnapshotSqlNode = 7331;//starrocks
233    public final static int TCancelBackupRestoreSqlNode = 7332;//starrocks
234    public final static int TCacheSelectSqlNode = 7333;//starrocks
235    public final static int TCreateDictionarySqlNode = 7334;//starrocks
236    public final static int TDropDictionarySqlNode = 7335;//starrocks
237    public final static int TRefreshDictionarySqlNode = 7336;//starrocks
238    public final static int TShowDictionarySqlNode = 7337;//starrocks
239    public final static int TShowFunctionsSqlNode = 7338;//starrocks
240
241    public final static int TOnConflictClause = 7341;
242
243    // OceanBase Phase 4 Batch 1 — CREATE/ALTER/DROP TENANT
244    public final static int TOceanbaseCreateTenantSqlNode = 7342;
245    public final static int TOceanbaseAlterTenantSqlNode  = 7343;
246    public final static int TOceanbaseDropTenantSqlNode   = 7344;
247
248    // OceanBase Phase 4 Batch 2 — CREATE/ALTER/DROP RESOURCE POOL|UNIT
249    public final static int TOceanbaseCreateResourcePoolSqlNode = 7346;
250    public final static int TOceanbaseCreateResourceUnitSqlNode = 7347;
251    public final static int TOceanbaseAlterResourcePoolSqlNode  = 7348;
252    public final static int TOceanbaseAlterResourceUnitSqlNode  = 7349;
253    public final static int TOceanbaseDropResourcePoolSqlNode   = 7350;
254    public final static int TOceanbaseDropResourceUnitSqlNode   = 7351;
255
256    // OceanBase Phase 4 Batch 6 — CREATE/ALTER/DROP TABLEGROUP
257    public final static int TOceanbaseCreateTablegroupSqlNode = 7353;
258    public final static int TOceanbaseAlterTablegroupSqlNode  = 7354;
259    public final static int TOceanbaseDropTablegroupSqlNode   = 7355;
260
261    // OceanBase Phase 4 Batch 8 — CREATE/ALTER/DROP OUTLINE
262    public final static int TOceanbaseCreateOutlineSqlNode = 7357;
263    public final static int TOceanbaseAlterOutlineSqlNode  = 7358;
264    public final static int TOceanbaseDropOutlineSqlNode   = 7359;
265
266    // OceanBase Phase 4 Batch 3 + 10 — ALTER SYSTEM
267    public final static int TOceanbaseAlterSystemSqlNode   = 7360;
268
269    // OceanBase documented syntax gaps — SHOW TENANT family
270    public final static int TOceanbaseShowTenantSqlNode    = 7361;
271
272    // OceanBase US-003 — FLASHBACK / PURGE
273    public final static int TOceanbaseFlashbackSqlNode     = 7362;
274    public final static int TOceanbasePurgeSqlNode         = 7363;
275
276    // OceanBase US-004 Round 3 — XA transaction
277    public final static int TOceanbaseXaSqlNode            = 7364;
278
279    // OceanBase US-005 Round 3 — DBLINK DDL
280    public final static int TOceanbaseCreateDblinkSqlNode  = 7365;
281    public final static int TOceanbaseDropDblinkSqlNode    = 7366;
282
283    // OceanBase US-006 Round 3 — RESTORE POINT
284    public final static int TOceanbaseCreateRestorePointSqlNode = 7368;
285    public final static int TOceanbaseDropRestorePointSqlNode   = 7369;
286
287    private TParseTreeNode sqlNode = null;
288    private TCustomSqlStatement stmt = null;
289
290    public TCustomSqlStatement getStmt() {
291        return stmt;
292    }
293
294    private boolean isParsed = true;
295
296    public void setParsed(boolean parsed) {
297        isParsed = parsed;
298    }
299
300    public void setSqlNode(TParseTreeNode sqlNode) {
301        this.sqlNode = sqlNode;
302    }
303
304    public void init(Object arg1){
305        if (arg1 instanceof TCustomSqlStatement){
306           stmt = (TCustomSqlStatement)arg1;
307        }else{
308          sqlNode = (TParseTreeNode)arg1;
309        }
310    }
311
312    private  TObjectName endlabelName;
313
314    public void setEndlabelName(TObjectName endlabelName) {
315        this.endlabelName = endlabelName;
316    }
317
318    public TObjectName getEndlabelName() {
319
320        return endlabelName;
321    }
322
323    private  TObjectName labelName;
324
325    public void setLabelName(TObjectName labelName) {
326        this.labelName = labelName;
327    }
328
329    public TObjectName getLabelName() {
330
331        return labelName;
332    }
333
334    public void init(Object arg1,Object arg2){
335        this.init(arg1);
336        this.labelName = (TObjectName)arg2;
337    }
338
339
340    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
341        if (stmt != null){
342            // stmt in plsql already create stmt descends from  TCustomSqlStatement
343            if (!isParsed){
344              stmt.parsestatement(psql,isParsed);
345            }else{
346                stmt.doParseStatement(psql);
347            }
348            if (stmt.getLabelName() == null){
349                stmt.setLabelName(this.labelName);
350            }
351            return;
352        }
353        
354        if (sqlNode == null) return ;
355
356        switch(sqlNode.getNodeType()){
357            case(select):
358//                TSelectSqlNode selectSqlNode = (TSelectSqlNode)sqlNode;
359//                if (selectSqlNode.isHiveFromQuery()){
360//                    stmt = new THiveFromQuery(psql.dbvendor);
361//                }else{
362//                    stmt = new TSelectSqlStatement(psql.dbvendor);
363//                }
364
365                stmt = new TSelectSqlStatement(psql.dbvendor);
366                break;
367            case(delete):
368                stmt = new TDeleteSqlStatement(psql.dbvendor);
369                break;
370            case(update):
371                stmt = new TUpdateSqlStatement(psql.dbvendor);
372                break;
373            case(insert):
374                stmt = new TInsertSqlStatement(psql.dbvendor);
375                break;
376            case(MssqlBulkInsert):
377                stmt = new TMssqlBulkInsert(psql.dbvendor);
378                break;
379            case(MssqlUpdateTextSqlNode):
380                stmt = new TMssqlUpdateText(psql.dbvendor);
381                break;
382            case(MssqlWritetextSqlNode):
383                stmt = new TMssqlWriteText(psql.dbvendor);
384                break;
385            case(MssqlReadtextSqlNode):
386                stmt = new TMssqlReadText(psql.dbvendor);
387                break;
388            case (MssqlSetRowCountSqlNode):
389                stmt = new TMssqlSetRowCount(psql.dbvendor);
390                break;
391            case (MssqlThrowSqlNode):
392                stmt = new TMssqlThrow(psql.dbvendor);
393                break;
394            case MssqlReconfigureSqlNode:
395                stmt = new TReconfigure(psql.dbvendor);
396                break;
397            case MssqlCreateTypeSqlNode:
398                stmt = new TMssqlCreateType(psql.dbvendor);
399                break;
400            case(createtable):
401                stmt = new TCreateTableSqlStatement(psql.dbvendor);
402                break;
403            case(declare):
404                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvsybasease || psql.dbvendor == EDbVendor.dbvsqlanywhere || psql.dbvendor == EDbVendor.dbvsybaseiq)||(psql.dbvendor == EDbVendor.dbvhana)){
405                    stmt = new TMssqlDeclare(psql.dbvendor);
406                }else if ((psql.dbvendor == EDbVendor.dbvmysql)||(psql.dbvendor == EDbVendor.dbvbigquery)||psql.isMySQLDialect()){
407                    // OceanBase MySQL/system tenant is MySQL SQL (Mantis 4813)
408                    stmt = new TMssqlDeclare(psql.dbvendor);
409                }else if (psql.dbvendor == EDbVendor.dbvteradata){
410                    stmt = new TMssqlDeclare(psql.dbvendor);
411                }else if (psql.dbvendor == EDbVendor.dbvdb2){
412                  TDeclareSqlNode declareNode = (TDeclareSqlNode)sqlNode;
413                    switch(declareNode.getDeclareType()){
414                        case variable:
415                            stmt = new TDb2SqlVariableDeclaration(psql.dbvendor);
416                            break;
417                       case conditions:
418                           stmt = new TDb2ConditionDeclaration(psql.dbvendor);
419                           break;
420                       case returnCode:
421                           stmt = new TDb2ReturnCodesDeclaration(psql.dbvendor);
422                           break;
423                       case statement:
424                           stmt = new TDb2StatementDeclaration(psql.dbvendor);
425                           break;
426                       case cursor:
427                           stmt = new TDb2DeclareCursorStatement(psql.dbvendor);
428                           break;
429                       case handlers:
430                           stmt = new TDb2HandlerDeclaration(psql.dbvendor);
431                           break;
432                       default:
433                           break;
434                    }
435                }
436                break;
437            case T_CompoundSqlNode: //db2 compound sql node
438                stmt = new TCommonBlock(psql.dbvendor);
439                break;
440            case(block):
441                switch (psql.dbvendor){
442                    case dbvmssql:
443                    case dbvsybase:
444                    // case dbvazuresql:
445                        // Check if this is a TRY/CATCH block by examining tokens
446                        if (isTryCatchBlock(sqlNode)) {
447                            stmt = new TMssqlTryCatch(psql.dbvendor);
448                        } else {
449                            stmt = new TMssqlBlock(psql.dbvendor);
450                        }
451                        break;
452                    case dbvsybasease:
453                        // Check if this is a TRY/CATCH block by examining tokens
454                        if (isTryCatchBlock(sqlNode)) {
455                            stmt = new TMssqlTryCatch(psql.dbvendor);
456                        } else {
457                            stmt = new TMssqlBlock(psql.dbvendor);
458                        }
459                        break;
460                    case dbvsqlanywhere:
461                        // Check if this is a TRY/CATCH block by examining tokens
462                        if (isTryCatchBlock(sqlNode)) {
463                            stmt = new TMssqlTryCatch(psql.dbvendor);
464                        } else {
465                            stmt = new TMssqlBlock(psql.dbvendor);
466                        }
467                        break;
468                    case dbvsybaseiq:
469                        // Check if this is a TRY/CATCH block by examining tokens
470                        if (isTryCatchBlock(sqlNode)) {
471                            stmt = new TMssqlTryCatch(psql.dbvendor);
472                        } else {
473                            stmt = new TMssqlBlock(psql.dbvendor);
474                        }
475                        break;
476                    case dbvoracle:
477                    case dbvpostgresql:
478                    case dbvteradata:
479                    case dbvbigquery:
480                    case dbvsnowflake:
481                    case dbvmysql:
482                    case dbvnetezza:
483                    case dbvgreenplum:
484                    case dbvgaussdb:
485                    case dbvedb:
486                    case dbvredshift:
487                    case dbvhana:
488                    case dbvdameng:
489                    case dbvoceanbase:
490
491                        stmt = new TCommonBlock(psql.dbvendor);
492                        break;
493                    default:
494                        System.out.println("block type not implemented: "+psql.dbvendor.toString());
495                        break;
496                }
497//                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)){
498//                    stmt = new TMssqlBlock(psql.dbvendor);
499//                }else if ((psql.dbvendor == EDbVendor.dbvoracle)||(psql.dbvendor == EDbVendor.dbvpostgresql)
500//                            ||(psql.dbvendor == EDbVendor.dbvteradata)||(psql.dbvendor == EDbVendor.dbvbigquery)){
501//                    stmt = new TCommonBlock(psql.dbvendor);
502//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
503//                    stmt = new TCommonBlock(psql.dbvendor);
504//                }else{
505//                   System.out.println("block type not implemented: "+psql.dbvendor.toString());
506//                }
507                break;
508            case(MssqlTryCatchSqlNode):
509                stmt = new TMssqlTryCatch(psql.dbvendor);
510                break;
511            case(returnstmt):
512                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvsybasease || psql.dbvendor == EDbVendor.dbvsqlanywhere || psql.dbvendor == EDbVendor.dbvsybaseiq)||(psql.dbvendor == EDbVendor.dbvhana)){
513                    stmt = new TMssqlReturn(psql.dbvendor);
514                }else if (psql.dbvendor == EDbVendor.dbvdb2){
515                    stmt = new TDb2ReturnStmt(psql.dbvendor);
516                }else if ((psql.dbvendor == EDbVendor.dbvmysql)||psql.isMySQLDialect()){
517                    stmt = new TReturnStmt(psql.dbvendor);
518                }
519                break;
520            case(ifstmt):
521                switch (psql.dbvendor){
522                    case dbvmssql:
523                    case dbvsybase:
524                        stmt = new TMssqlIfElse(psql.dbvendor);
525                        if ((sqlNode instanceof TIfSqlNode)
526                                && (((TIfSqlNode)sqlNode).getStmtType() == TBaseType.condition_statement_while)) {
527                            stmt.sqlstatementtype = ESqlStatementType.sstmssqlwhile;
528                        }
529                        break;
530                    case dbvsybasease:
531                        stmt = new TMssqlIfElse(psql.dbvendor);
532                        if ((sqlNode instanceof TIfSqlNode)
533                                && (((TIfSqlNode)sqlNode).getStmtType() == TBaseType.condition_statement_while)) {
534                            stmt.sqlstatementtype = ESqlStatementType.sstmssqlwhile;
535                        }
536                        break;
537                    case dbvsqlanywhere:
538                        stmt = new TMssqlIfElse(psql.dbvendor);
539                        if ((sqlNode instanceof TIfSqlNode)
540                                && (((TIfSqlNode)sqlNode).getStmtType() == TBaseType.condition_statement_while)) {
541                            stmt.sqlstatementtype = ESqlStatementType.sstmssqlwhile;
542                        }
543                        break;
544                    case dbvsybaseiq:
545                        stmt = new TMssqlIfElse(psql.dbvendor);
546                        if ((sqlNode instanceof TIfSqlNode)
547                                && (((TIfSqlNode)sqlNode).getStmtType() == TBaseType.condition_statement_while)) {
548                            stmt.sqlstatementtype = ESqlStatementType.sstmssqlwhile;
549                        }
550                        break;
551                    case dbvmysql:
552                        stmt = new TMySQLIfStmt(psql.dbvendor);
553                        break;
554                    case dbvoceanbase:
555                        // MySQL/system tenant: the MySQL IF statement (Mantis 4813); Oracle tenant unchanged
556                        if (psql.isMySQLDialect()){
557                            stmt = new TMySQLIfStmt(psql.dbvendor);
558                        }
559                        break;
560                    case dbvbigquery:
561                    case dbvdb2:
562                    case dbvhana:
563                        stmt = new TIfStmt(psql.dbvendor);
564                        break;
565                }
566
567
568                break;
569            case (CreateProcedureSqlNode):
570                if ((psql.dbvendor == EDbVendor.dbvoracle)||(psql.dbvendor == EDbVendor.dbvgaussdb)||(psql.dbvendor == EDbVendor.dbvedb)){
571                    // plsql procedure declaration or specification
572                    stmt = new TPlsqlCreateProcedure(EDbVendor.dbvoracle);
573                    ((TPlsqlCreateProcedure)stmt).setKind(((TCreateProcedureSqlNode)sqlNode).getKind());
574                }else if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvsybasease || psql.dbvendor == EDbVendor.dbvsqlanywhere || psql.dbvendor == EDbVendor.dbvsybaseiq)){
575                    stmt = new TMssqlCreateProcedure(psql.dbvendor);
576                }else if (psql.dbvendor == EDbVendor.dbvdb2){
577                    stmt = new TCreateProcedureStmt(psql.dbvendor);
578                }else{
579                    System.out.println("create procedure not implemented: "+psql.dbvendor.toString());
580                }
581                break;
582            case (CreateFunctionSqlNode):
583                switch (psql.dbvendor){
584                    case dbvoracle:
585                        stmt = new TPlsqlCreateFunction(psql.dbvendor);
586                        ((TPlsqlCreateFunction)stmt).setKind(((TCreateFunctionSqlNode)sqlNode).getKind());
587                        break;
588                    case dbvdameng:
589                        stmt = new TPlsqlCreateFunction(psql.dbvendor);
590                        ((TPlsqlCreateFunction)stmt).setKind(((TCreateFunctionSqlNode)sqlNode).getKind());
591                        break;
592                    case dbvmssql:
593                    case dbvsybase:
594                        stmt = new TMssqlCreateFunction(psql.dbvendor);
595                        break;
596                    case dbvsybasease:
597                        stmt = new TMssqlCreateFunction(psql.dbvendor);
598                        break;
599                    case dbvsqlanywhere:
600                        stmt = new TMssqlCreateFunction(psql.dbvendor);
601                        break;
602                    case dbvsybaseiq:
603                        stmt = new TMssqlCreateFunction(psql.dbvendor);
604                        break;
605                    case dbvdb2:
606                    case dbvgreenplum:
607                    case dbvbigquery:
608                    case dbvgaussdb:
609                    case dbvedb:
610                        stmt = new TCreateFunctionStmt(psql.dbvendor);
611                        break;
612                    case dbvhive:
613                        stmt = new THiveCreateFunction(psql.dbvendor);
614                        break;
615                    default:
616                        System.out.println("create function not implemented: "+psql.dbvendor.toString());
617                        break;
618                }
619                break;
620            case (ExecImmeNode):
621                stmt = new TExecImmeStmt(psql.dbvendor);
622                break;
623            case (ContinueSqlNode):
624                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvsybasease || psql.dbvendor == EDbVendor.dbvsqlanywhere || psql.dbvendor == EDbVendor.dbvsybaseiq)) {
625                    stmt = new TMssqlContinue(psql.dbvendor);
626                }else if (psql.dbvendor == EDbVendor.dbvoracle){
627                    stmt = new TPlsqlContinue(psql.dbvendor);
628                }
629                break;
630            case (BreakSqlNode):
631                stmt = new TBreakStmt(psql.dbvendor);
632                break;
633            case (GrantSqlNode):
634                stmt = new TGrantStmt(psql.dbvendor);
635                break;
636            case (DenySqlNode):
637                stmt = new TDenyStmt(psql.dbvendor);
638                break;
639            case (RevokeSqlNode):
640                stmt = new TRevokeStmt(psql.dbvendor);
641                break;
642            case (FetchSqlNode):
643                if ((psql.dbvendor == EDbVendor.dbvmssql)
644                        ||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvsybasease || psql.dbvendor == EDbVendor.dbvsqlanywhere || psql.dbvendor == EDbVendor.dbvsybaseiq)||(psql.dbvendor == EDbVendor.dbvteradata)||(psql.dbvendor == EDbVendor.dbvhana)){
645                    stmt = new TMssqlFetch(psql.dbvendor);
646                }else if (psql.dbvendor == EDbVendor.dbvdb2){
647                    stmt = new TDb2FetchCursorStmt(psql.dbvendor);
648                }else if ((psql.dbvendor == EDbVendor.dbvmysql)||psql.isMySQLDialect()){
649                    stmt = new TFetchStmt(psql.dbvendor);
650                }
651                break;
652            case (OpenSqlNode):
653                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvsybasease || psql.dbvendor == EDbVendor.dbvsqlanywhere || psql.dbvendor == EDbVendor.dbvsybaseiq)||(psql.dbvendor == EDbVendor.dbvhana)){
654                    stmt = new TMssqlOpen(psql.dbvendor);
655                }else if (psql.dbvendor == EDbVendor.dbvdb2){
656                    stmt = new TDb2OpenCursorStmt(psql.dbvendor);
657                }else if ((psql.dbvendor == EDbVendor.dbvmysql)||psql.isMySQLDialect()){
658                    stmt = new TOpenStmt(psql.dbvendor);
659                }else if (psql.dbvendor == EDbVendor.dbvteradata){
660                    stmt = new TMssqlOpen(psql.dbvendor);
661                }
662                break;
663            case (CloseSqlNode):
664                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvsybasease || psql.dbvendor == EDbVendor.dbvsqlanywhere || psql.dbvendor == EDbVendor.dbvsybaseiq)||(psql.dbvendor == EDbVendor.dbvhana)){
665                    stmt = new TMssqlClose(psql.dbvendor);
666                }else if (psql.dbvendor == EDbVendor.dbvdb2){
667                    stmt = new TDb2CloseCursorStmt(psql.dbvendor);
668                }else if (psql.dbvendor == EDbVendor.dbvteradata){
669                    stmt = new TCloseStmt(EDbVendor.dbvteradata);
670                }else if ((psql.dbvendor == EDbVendor.dbvmysql)||psql.isMySQLDialect()){
671                    stmt = new TCloseStmt(psql.dbvendor);
672                }else if (psql.dbvendor == EDbVendor.dbvredshift){
673                    stmt = new TCloseStmt(psql.dbvendor);
674                }
675                break;
676            case (CreateIndexSqlNode):
677                stmt = new TCreateIndexSqlStatement(psql.dbvendor);
678                break;
679            case (DropTableSqlNode):
680                stmt = new TDropTableSqlStatement(psql.dbvendor);
681                break;
682            case (DropIndexSqlNode):
683                stmt = new TDropIndexSqlStatement(psql.dbvendor);
684                break;
685            case (DropViewSqlNode):
686                stmt = new TDropViewSqlStatement(psql.dbvendor);
687                break;
688            case (DropDbObjectSqlNode):
689                stmt = new TMssqlDropDbObject(psql.dbvendor);
690                break;
691            case (AlterTableSqlNode):
692                stmt = new TAlterTableStatement(psql.dbvendor);
693                break;
694            case (alterViewSqlNode):
695                stmt = new TAlterViewStatement(psql.dbvendor);
696                break;
697            case (alterDatabaseSqlNode):
698                stmt = new TAlterDatabaseStmt(psql.dbvendor);
699                break;
700            case (alterIndexSqlNode):
701                stmt = new TAlterIndexStmt(psql.dbvendor);
702                break;
703            case (MssqlDeallocateSqlNode):
704                stmt = new TMssqlDeallocate(psql.dbvendor);
705                break;
706            case(ExecuteSqlNode):
707                switch (psql.dbvendor){
708                    case dbvteradata:
709                        stmt = new TTeradataExecute(psql.dbvendor);
710                        break;
711                    case dbvpostgresql:
712                    case dbvsnowflake:
713                    case dbvnetezza:
714                    case dbvredshift:
715                        stmt = new TExecuteSqlStatement(psql.dbvendor);
716                        break;
717                    default:
718                        stmt = new TMssqlExecute(psql.dbvendor);
719                        break;
720                }
721
722                break;
723            case(ExecuteAsSqlNode):
724                stmt = new TMssqlExecuteAs(psql.dbvendor);
725                break;
726            case(BeginTranSqlNode):
727                stmt = new TBeginTran(psql.dbvendor);
728                break;
729            case(EndTranSqlNode):
730                stmt = new TEndTran(psql.dbvendor);
731                break;
732            case(MssqlRaiserrorSqlNode):
733                stmt = new TMssqlRaiserror(psql.dbvendor);
734                break;
735            case(MssqlLabelSqlNode):
736                stmt = new TMssqlLabel(psql.dbvendor);
737                break;
738            case(MssqlGotoSqlNode):
739                stmt = new TMssqlGoTo(psql.dbvendor);
740                break;
741            case(MssqlRevertSqlNode):
742                stmt = new TMssqlRevert(psql.dbvendor);
743                break;
744            case MssqlSendOnConversationSqlNode:
745                stmt = new  TMssqlSendOnConversation(psql.dbvendor);
746                break;
747            case(MssqlEndConversationSqlNode):
748                stmt = new TMssqlEndConversation(psql.dbvendor);
749                break;
750            case(MssqlBeginDialogSqlNode):
751                stmt = new TMssqlBeginDialog(psql.dbvendor);
752                break;
753            case MssqlSetSqlNode:
754                stmt = new TMssqlSet(psql.dbvendor);
755                break;
756            case LoopSqlNode:
757                switch (psql.dbvendor){
758                    case dbvdb2:
759                        stmt = new TDb2LoopStmt(EDbVendor.dbvdb2);
760                        break;
761                    default:
762                        stmt = new TLoopStmt(psql.dbvendor);
763                        break;
764
765                }
766                break;
767            case RepeatSqlNode:
768                stmt = new TRepeatStmt(psql.dbvendor);
769//                if (psql.dbvendor == EDbVendor.dbvdb2){
770//                    stmt = new TRepeatStmt(EDbVendor.dbvdb2);
771//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
772//                    stmt = new TMySQLRepeatStmt(EDbVendor.dbvmysql);
773//                }
774                break;
775            case WhileSqlNode:
776                stmt = new TWhileStmt(psql.dbvendor);
777//                if (psql.dbvendor == EDbVendor.dbvdb2){
778//                    stmt = new TWhileStmt(EDbVendor.dbvdb2);
779//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
780//                    stmt = new TMySQLWhileStmt(EDbVendor.dbvmysql);
781//                }
782                break;
783            case ForSqlNode:
784                stmt = new TForStmt(dbvendor);
785                break;
786            case SetSqlNode:
787                switch (psql.dbvendor){
788                    case dbvhive:
789                        stmt = new THiveSet(EDbVendor.dbvhive);
790                        break;
791                    case dbvmysql:
792                    case dbvbigquery:
793                    case dbvteradata:
794                    case dbvgaussdb:
795                    case dbvedb:
796                    case dbvsparksql:
797                        stmt = new TSetStmt(psql.dbvendor);
798                        break;
799                    case dbvoceanbase:
800                        // MySQL/system tenant: the MySQL SET (Mantis 4813); Oracle tenant keeps the default
801                        if (psql.isMySQLDialect()){
802                            stmt = new TSetStmt(psql.dbvendor);
803                        }else{
804                            stmt = new TDb2SetVariableStmt(EDbVendor.dbvdb2);
805                        }
806                        break;
807                    default:
808                        stmt = new TDb2SetVariableStmt(EDbVendor.dbvdb2);
809                        break;
810                }
811
812                break;
813            case UnsetSqlNode:
814                stmt = new TUnsetStmt(psql.dbvendor);
815                break;
816            case caseExpression:
817                switch (psql.dbvendor){
818                    case dbvdb2:
819                        stmt = new TDb2CaseStmt(EDbVendor.dbvdb2);
820                        break;
821                    case dbvmysql:
822                        stmt = new TMySQLCaseStmt(EDbVendor.dbvmysql);
823                        break;
824                    case dbvoceanbase:
825                        // MySQL/system tenant: the MySQL CASE statement (Mantis 4813); Oracle tenant unchanged
826                        if (psql.isMySQLDialect()){
827                            stmt = new TMySQLCaseStmt(psql.dbvendor);
828                        }
829                        break;
830                    case dbvteradata:
831                        stmt = new TCaseStmt(EDbVendor.dbvmysql);
832                        break;
833                    case dbvsybase:
834                        // The Watcom CASE statement of a procedure body (Mantis 4717).
835                        stmt = new TCaseStmt(psql.dbvendor);
836                        break;
837                    case dbvsybaseiq:
838                        // The Watcom CASE statement of a procedure body (Mantis 4717).
839                        stmt = new TCaseStmt(psql.dbvendor);
840                        break;
841                    case dbvsqlanywhere:
842                        // The Watcom CASE statement of a procedure body (Mantis 4717).
843                        stmt = new TCaseStmt(psql.dbvendor);
844                        break;
845                    default:
846                        break;
847                }
848
849                break;
850            case(MssqlStmtStubSqlNode):
851                //TMssqlStmtStubSqlNode stmt1 = (TMssqlStmtStubSqlNode)sqlNode;
852                if (((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() == ESqlStatementType.sstmssqlset){
853                    stmt = new TMssqlSet(psql.dbvendor);
854                    //((TMssqlSet)stmt).setSetType(TBaseType.mstSetCmd);
855                    stmt.setStartToken(sqlNode);
856                    stmt.setEndToken(sqlNode);
857                }else if (((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() == ESqlStatementType.sstmssqlupdatestatistics){
858                    stmt = new TMssqlUpdateStatistics(psql.dbvendor);
859                }else{
860                    stmt = new TMssqlStmtStub(psql.dbvendor);
861                    ((TMssqlStmtStub)stmt).setSqlStatementType( ((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() );
862                }
863                break;
864            case T_TeradataStmtStubSqlNode:
865                switch (((TTeradataStmtStubSqlNode)sqlNode).getSqlStatementType()){
866                    case sstRevoke:
867                        stmt = new TRevokeStmt(psql.dbvendor);
868                        break;
869                    default:
870                        stmt = new TTeradataStmtStub(psql.dbvendor);
871                        ((TTeradataStmtStub)stmt).sqlstatementtype = ( ((TTeradataStmtStubSqlNode)sqlNode).getSqlStatementType() );
872                }
873                break;
874            case stubStmtSqlNode:
875                TStubStmtSqlNode stubNode = (TStubStmtSqlNode)sqlNode;
876
877                switch(stubNode.getSqlStatementType()){
878                    case sstdb2signal:
879                    case sstsignal:
880                        stmt = new TSignalStmt(psql.dbvendor);
881                        break;
882                    default:
883                        break;
884                }
885
886                if (psql.dbvendor == EDbVendor.dbvdb2){
887                    switch(stubNode.getSqlStatementType()){
888                        case sstdb2iterate:
889                            stmt = new TDb2IterateStmt(EDbVendor.dbvdb2);
890                            break;
891                        case sstdb2call:
892                            stmt = new TDb2CallStmt(EDbVendor.dbvdb2);
893                            break;
894                        case sstdb2leave:
895                            stmt = new TDb2LeaveStmt(EDbVendor.dbvdb2);
896                            break;
897                        case sstdb2signal:
898                            break;
899                        case sstdb2goto:
900                            stmt = new TDb2GotoStmt(EDbVendor.dbvdb2);
901                            break;
902                        case sstdb2set:
903                            stmt = new TDb2SetStmt(EDbVendor.dbvdb2);
904                            break;
905                        default:
906                            stmt = new TDb2StmtStub(EDbVendor.dbvdb2);
907                            ((TDb2StmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
908                            break;
909                    }
910                }else if (psql.dbvendor == EDbVendor.dbvmysql){
911                    stmt = new TMySQLStmtStub(EDbVendor.dbvmysql);
912                    ((TMySQLStmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
913                }else if (psql.isMySQLDialect()){
914                    // OceanBase MySQL/system tenant (Mantis 4813)
915                    stmt = new TMySQLStmtStub(psql.dbvendor);
916                    ((TMySQLStmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
917                }else if (psql.dbvendor == EDbVendor.dbvbigquery){
918                    stmt = new TMySQLStmtStub(EDbVendor.dbvbigquery);
919                    ((TMySQLStmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
920                }
921                break;
922            case(dummyNode):
923                TDummy dummy = (TDummy)sqlNode;
924
925                switch (dummy.sqlstatementtype){
926                    case sstcommit:
927                        stmt = new TCommitStmt(psql.dbvendor);
928                        break;
929                    case sstmssqlcommit:
930                        stmt = new TMssqlCommit(psql.dbvendor);
931                        break;
932                    case sstmssqlrollback:
933                        stmt = new TMssqlRollback(psql.dbvendor);
934                        break;
935                    case sstrollback:
936                        stmt = new TRollbackStmt(psql.dbvendor);
937                        break;
938                    case sstmssqlsavetran:
939                        stmt = new TMssqlSaveTran(psql.dbvendor);
940                        break;
941                    case sstmssqlprint:
942                        stmt = new TMssqlPrint(psql.dbvendor);
943                        break;
944                    case sstmssqluse:
945                        stmt = new TUseDatabase(psql.dbvendor);
946                        break;
947                    case sstmssqlgo:
948                        stmt = new TMssqlGo(psql.dbvendor);
949                        break;
950                    case sstHelpProcedure:
951                        stmt = new THelpProcedure(psql.dbvendor);
952                        break;
953                    case sstShowProcedure:
954                        stmt = new TShowProcedure(psql.dbvendor);
955                        break;
956                    case sstRevoke:
957                        stmt = new TRevokeStmt(psql.dbvendor);
958                        break;
959                    case sstAllocate:
960                        stmt = new TAllocateStmt(psql.dbvendor);
961                        break;
962                    case sstDrop:
963                        stmt = new TDropStmt(psql.dbvendor);
964                        break;
965                    case sstmssqlDropSecurityPolicy:
966                        stmt = new TMssqlDropSecurityPolicy(psql.dbvendor);
967                        break;
968                    case sstbegintran:
969                        stmt = new TBeginTran(psql.dbvendor);
970                        break;
971                    default:
972                        // Any other statement the grammar models as a bare
973                        // TDummy. Without this the switch left stmt null, so
974                        // the statement PARSED FINE standalone and became a
975                        // token-less nothing the moment it was used as an
976                        // embedded statement -- an IF/WHILE body most visibly.
977                        //
978                        // That stayed invisible until TMssqlIfElse began
979                        // reporting a missing body (mantis 4686), at which point
980                        // valid T-SQL from Microsoft's own documentation --
981                        // "IF EXISTS (...) DROP PARTITION FUNCTION ..." -- began
982                        // failing to parse and SQL Server coverage fell from
983                        // 290/290 to 289/290.
984                        //
985                        // Blast radius, measured by sweeping every statement in
986                        // the SQL Server corpus through "parses standalone but
987                        // not as an IF body", pre-fix build vs post-fix build:
988                        // 14 corpus statements over 12 distinct constructs, and
989                        // 0 regressions. Only DROP PARTITION FUNCTION surfaced
990                        // in coverage, because it is the only one the corpus
991                        // happens to write inside an IF. The other 11 were
992                        // equally broken and equally silent:
993                        //   ALTER SECURITY POLICY, CREATE CREDENTIAL,
994                        //   CREATE DATABASE ENCRYPTION KEY,
995                        //   CREATE DATABASE SCOPED CREDENTIAL,
996                        //   CREATE EVENT SESSION, CREATE EXTERNAL DATA SOURCE,
997                        //   CREATE EXTERNAL LANGUAGE, CREATE MASTER KEY,
998                        //   CREATE SELECTIVE XML INDEX, DROP PARTITION SCHEME,
999                        //   DROP SYNONYM
1000                        // Hence a default rather than a case per construct: the
1001                        // next TDummy-modelled statement is then correct by
1002                        // construction instead of silently broken here. Carrying
1003                        // the node's own sqlstatementtype keeps it identifiable
1004                        // rather than flattened to sstunknown.
1005                        //
1006                        // NOT fixed here, and pre-existing: 85 further corpus
1007                        // statements still fail as an IF body (ALTER RESOURCE
1008                        // GOVERNOR, BULK INSERT, CREATE SCHEMA, ...). They do
1009                        // not reach this switch, so they are a separate
1010                        // limitation -- this default did not change them in
1011                        // either direction.
1012                        stmt = new TUnknownSqlStatement(psql.dbvendor);
1013                        stmt.sqlstatementtype = dummy.sqlstatementtype;
1014                        break;
1015                }
1016                break;
1017            case(ParseErrorNode):
1018                stmt = new TParseErrorSqlStatement(psql.dbvendor);
1019                break;
1020            case (truncateTable):
1021                stmt = new TTruncateStatement(psql.dbvendor);
1022                break;
1023            case(hiveLoadSqlNode):
1024                stmt = new THiveLoad(EDbVendor.dbvhive);
1025                break;
1026            case (hiveExportSqlNode):
1027                stmt = new THiveExportTable(EDbVendor.dbvhive);
1028                break;
1029            case (hiveImportSqlNode):
1030                stmt = new THiveImportTable(EDbVendor.dbvhive);
1031                break;
1032            case (createDatabaseSqlNode):
1033                stmt = new TCreateDatabaseSqlStatement(psql.dbvendor);
1034                break;
1035            case (hiveSwitchDBSqlNode):
1036                stmt = new THiveSwitchDatabase(psql.dbvendor);
1037                break;
1038            case (hiveDropDBSqlNode):
1039                stmt = new THiveDropDatabase(psql.dbvendor);
1040                break;
1041            case (hiveDescribeSqlNode):
1042                stmt = new THiveDescribe(psql.dbvendor);
1043                break;
1044            case (hiveShowSqlNode):
1045                stmt = new THiveShow(psql.dbvendor);
1046                break;
1047            case (msckSqlNode):
1048                stmt = new TMSCKStmt(psql.dbvendor);
1049                break;
1050            case (hiveDropFunctionSqlNode):
1051                stmt = new THiveDropFunction(psql.dbvendor);
1052                break;
1053            case (analyzeSqlNode):
1054                stmt = new TAnalyzeStmt(psql.dbvendor);
1055                break;
1056            case (LockSqlNode):
1057                stmt = new TLockTableStmt(psql.dbvendor);
1058                break;
1059            case (hiveCreateRoleSqlNode):
1060                stmt = new THiveCreateRole(psql.dbvendor);
1061                break;
1062            case (hiveGrantSqlNode):
1063                if (((THiveGrantSqlNode)sqlNode).isRevoke()){
1064                    stmt = new THiveRevoke(EDbVendor.dbvhive);
1065                }else{
1066                    stmt = new THiveGrant(EDbVendor.dbvhive);
1067                }
1068                break;
1069            case (hiveShowGrantSqlNode):
1070                stmt = new THiveShowGrant(psql.dbvendor);
1071                break;
1072            case (hiveDropRoleSqlNode):
1073                stmt = new THiveDropRole(psql.dbvendor);
1074                break;
1075            case (hiveShowRoleGrantSqlNode):
1076                stmt = new THiveShowRoleGrant(psql.dbvendor);
1077                break;
1078            case (hiveGrantRoleSqlNode):
1079                if(((THiveGrantRoleSqlNode)sqlNode).isRevoke()){
1080                    stmt = new THiveRevokeRole(psql.dbvendor);
1081                }else{
1082                    stmt = new THiveGrantRole(psql.dbvendor);
1083                }
1084
1085                break;
1086//            case hiveFromQuerySqlNode:
1087//                stmt = new THiveFromQuery(EDbVendor.dbvhive);
1088//                break;
1089           case sybaseDumpTranSqlNode:
1090               stmt = new TSybaseDumpTran(psql.dbvendor);
1091               break;
1092           case sybaseUpdateIndexStatisticsSqlNode:
1093               stmt = new TSybaseUpdateIndexStatistics(psql.dbvendor);
1094               break;
1095           case sybaseWritetextSqlNode:
1096               stmt = new TSybaseWritetext(psql.dbvendor);
1097               break;
1098           case sybaseDeleteStatisticsSqlNode:
1099               stmt = new TSybaseDeleteStatistics(psql.dbvendor);
1100               break;
1101           case callSqlNode:
1102               stmt = new TCallStatement(psql.dbvendor);
1103               break;
1104           case moveSqlNode:
1105               stmt = new TMoveStmt(EDbVendor.dbvpostgresql);
1106               break;
1107           case MergeSqlNode:
1108               stmt = new TMergeSqlStatement(psql.dbvendor) ;
1109               break;
1110            case dropSequenceSqlNode:
1111                stmt = new TDropSequenceStmt(psql.dbvendor);
1112                break;
1113            case dropProcedureSqlNode:
1114                stmt = new TDropProcedureStmt(psql.dbvendor);
1115                break;
1116            case OracleCompoundTriggerBody:
1117                stmt = new  TCompoundTriggerBody(psql.dbvendor);
1118                break;
1119            case createSynonymSqlNode:
1120                stmt = new TCreateSynonymStmt(psql.dbvendor);
1121                break;
1122            case T_TeradataLockSqlNode:
1123                stmt = new TTeradataLock(psql.dbvendor);
1124                break;
1125            case T_AbortSqlNode:
1126                stmt = new TTeradataAbort(psql.dbvendor);
1127                break;
1128            case  MssqlCreateXmlSchemaCollectionSqlNode:
1129                stmt = new TMssqlCreateXmlSchemaCollectionStmt(psql.dbvendor);
1130                break;
1131            case DeallocatePrepareSqlNode:
1132                stmt = new TMySQLDeallocatePrepareStmt(psql.dbvendor);
1133                break;
1134            case createSchemaSqlNode:
1135                stmt = new TCreateSchemaSqlStatement(psql.dbvendor);
1136                break;
1137            case dropDatabaseSqlNode:
1138                stmt = new TDropDatabaseStmt(psql.dbvendor);
1139                break;
1140            case dropSchemaSqlNode:
1141                stmt = new TDropSchemaSqlStatement(psql.dbvendor);
1142                break;
1143            case MssqlBeginConversationTimerSqlNode:
1144                stmt = new TMssqlBeginConversationTimer(psql.dbvendor);
1145                break;
1146            case getDiagSqlNode:
1147                stmt = new TGetDiagStmt(psql.dbvendor);
1148                break;
1149            case dropFunctionSqlNode:
1150                stmt = new TDropFunctionStmt(psql.dbvendor);
1151                break;
1152            case performanceSqlNode:
1153                stmt = new TPerformanceStmt(psql.dbvendor);
1154                break;
1155            case PrepareSqlNode:
1156                stmt = new TPrepareStmt(psql.dbvendor);
1157                break;
1158            case upsertSqlNode:
1159                stmt = new TUpsertStmt(psql.dbvendor);
1160                break;
1161            case createviewstmt:
1162                stmt = new TCreateViewSqlStatement(dbvendor);
1163                break;
1164            case LeaveSqlNode:
1165                stmt = new TLeaveStmt(dbvendor);
1166                break;
1167            case TSignalSqlNode:
1168                stmt = new TSignalStmt(dbvendor);
1169                break;
1170            case rolllbackSqlNode:
1171                stmt = new TRollbackStmt(dbvendor);
1172                break;
1173            case commitSqlNode:
1174                stmt = new TCommitStmt(dbvendor);
1175                break;
1176            case IterateSqlNode:
1177                stmt = new TIterateStmt(dbvendor);
1178                break;
1179            case T_SetSessionSqlNode:
1180                stmt  = new TTeradataSetSession(dbvendor);
1181                break;
1182            case T_DisableEnableTriggerSqlNode:
1183                stmt = new TDisableEnableTriggerStmt(dbvendor);
1184                break;
1185            case CommentSqlNode:
1186                stmt = new TCommentOnSqlStmt(dbvendor);
1187                break;
1188            case CreateTypeSqlNode:
1189                stmt = new TCreateTypeStmt(dbvendor);
1190                break;
1191            case TCopyIntoNode:
1192                stmt = new TSnowflakeCopyIntoStmt(dbvendor);
1193                break;
1194            case TCreateStageSqlNode:
1195                stmt = new TCreateStageStmt(dbvendor);
1196                break;
1197            case TCreateStreamSqlNode:
1198                stmt = new TCreateStreamStmt(dbvendor);
1199                break;
1200            case TCreatePipeSqlNode:
1201                stmt = new TCreatePipeStmt(dbvendor);
1202                break;
1203            case CollectStatisticsSqlNode:
1204                stmt = new TTeradataCollectStatistics(dbvendor);
1205                break;
1206            case TResetSqlNode:
1207                stmt = new TResetStmt(dbvendor);
1208                break;
1209            case TAlterSessionSqlNode:
1210                stmt = new TAlterSessionStatement(dbvendor);
1211                break;
1212            case TCreateTaskSqlNode:
1213                stmt = new TCreateTaskStmt(dbvendor);
1214                break;
1215            case TCreatePartitionFunctionSqlNode:
1216                stmt = new TCreatePartitionFunctionStmt(dbvendor);
1217                break;
1218            case TAlterPartitionFunctionSqlNode:
1219                stmt = new TAlterPartitionFunctionStmt(dbvendor);
1220                break;
1221            case TCreatePartitionSchemeSqlNode:
1222                stmt = new TCreatePartitionSchemeSqlStatement(dbvendor);
1223                break;
1224            case TAlterPartitionSchemeSqlNode:
1225                stmt = new TAlterPartitionSchemeSqlStatement(dbvendor);
1226                break;
1227            case TCreateRoutineLoadSqlNode:
1228                stmt = new TCreateRoutineLoadStmt(dbvendor);
1229                break;
1230            case TSubmitTaskSqlNode:
1231                stmt = new TSubmitTaskStmt(dbvendor);
1232                break;
1233            case TDropTaskSqlNode:
1234                stmt = new TStarrocksDropTaskStmt(dbvendor);
1235                break;
1236            case TBeginLoadTransactionSqlNode:
1237                stmt = new TBeginLoadTransactionStmt(dbvendor);
1238                break;
1239            case TCommitLoadTransactionSqlNode:
1240                stmt = new TCommitLoadTransactionStmt(dbvendor);
1241                break;
1242            case TAbortLoadTransactionSqlNode:
1243                stmt = new TAbortLoadTransactionStmt(dbvendor);
1244                break;
1245            case TShowLoadTransactionSqlNode:
1246                stmt = new TShowLoadTransactionStmt(dbvendor);
1247                break;
1248            case TExportSqlNode:
1249                stmt = new TStarrocksExportStmt(dbvendor);
1250                break;
1251            case TShowExportSqlNode:
1252                stmt = new TStarrocksShowExportStmt(dbvendor);
1253                break;
1254            case TCancelExportSqlNode:
1255                stmt = new TStarrocksCancelExportStmt(dbvendor);
1256                break;
1257            // OceanBase Phase 4 Batch 1
1258            case TOceanbaseCreateTenantSqlNode:
1259                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TCreateTenantSqlStatement(dbvendor);
1260                break;
1261            case TOceanbaseAlterTenantSqlNode:
1262                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TAlterTenantSqlStatement(dbvendor);
1263                break;
1264            case TOceanbaseDropTenantSqlNode:
1265                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TDropTenantSqlStatement(dbvendor);
1266                break;
1267            // OceanBase Phase 4 Batch 2
1268            case TOceanbaseCreateResourcePoolSqlNode:
1269                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TCreateResourcePoolSqlStatement(dbvendor);
1270                break;
1271            case TOceanbaseCreateResourceUnitSqlNode:
1272                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TCreateResourceUnitSqlStatement(dbvendor);
1273                break;
1274            case TOceanbaseAlterResourcePoolSqlNode:
1275                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TAlterResourcePoolSqlStatement(dbvendor);
1276                break;
1277            case TOceanbaseAlterResourceUnitSqlNode:
1278                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TAlterResourceUnitSqlStatement(dbvendor);
1279                break;
1280            case TOceanbaseDropResourcePoolSqlNode:
1281                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TDropResourcePoolSqlStatement(dbvendor);
1282                break;
1283            case TOceanbaseDropResourceUnitSqlNode:
1284                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TDropResourceUnitSqlStatement(dbvendor);
1285                break;
1286            // OceanBase Phase 4 Batch 6
1287            case TOceanbaseCreateTablegroupSqlNode:
1288                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TCreateTablegroupSqlStatement(dbvendor);
1289                break;
1290            case TOceanbaseAlterTablegroupSqlNode:
1291                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TAlterTablegroupSqlStatement(dbvendor);
1292                break;
1293            case TOceanbaseDropTablegroupSqlNode:
1294                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TDropTablegroupSqlStatement(dbvendor);
1295                break;
1296            // OceanBase Phase 4 Batch 8
1297            case TOceanbaseCreateOutlineSqlNode:
1298                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TCreateOutlineSqlStatement(dbvendor);
1299                break;
1300            case TOceanbaseAlterOutlineSqlNode:
1301                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TAlterOutlineSqlStatement(dbvendor);
1302                break;
1303            case TOceanbaseDropOutlineSqlNode:
1304                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TDropOutlineSqlStatement(dbvendor);
1305                break;
1306            // OceanBase Phase 4 Batch 3 + 10
1307            case TOceanbaseAlterSystemSqlNode:
1308                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TAlterSystemSqlStatement(dbvendor);
1309                break;
1310            // OceanBase documented syntax gaps — SHOW TENANT family
1311            case TOceanbaseShowTenantSqlNode:
1312                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TShowTenantSqlStatement(dbvendor);
1313                break;
1314            // OceanBase US-003 — FLASHBACK / PURGE
1315            case TOceanbaseFlashbackSqlNode:
1316                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TFlashbackSqlStatement(dbvendor);
1317                break;
1318            case TOceanbasePurgeSqlNode:
1319                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TPurgeSqlStatement(dbvendor);
1320                break;
1321            // OceanBase US-004 Round 3 — XA transaction
1322            case TOceanbaseXaSqlNode:
1323                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TXaSqlStatement(dbvendor);
1324                break;
1325            // OceanBase US-005 Round 3 — DBLINK DDL
1326            case TOceanbaseCreateDblinkSqlNode:
1327                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TCreateDblinkSqlStatement(dbvendor);
1328                break;
1329            case TOceanbaseDropDblinkSqlNode:
1330                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TDropDblinkSqlStatement(dbvendor);
1331                break;
1332            // OceanBase US-006 Round 3 — RESTORE POINT
1333            case TOceanbaseCreateRestorePointSqlNode:
1334                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TCreateRestorePointSqlStatement(dbvendor);
1335                break;
1336            case TOceanbaseDropRestorePointSqlNode:
1337                stmt = new gudusoft.gsqlparser.stmt.oceanbase.TDropRestorePointSqlStatement(dbvendor);
1338                break;
1339            default:
1340                break;
1341        }
1342
1343        if (stmt != null){
1344            stmt.rootNode = sqlNode;
1345            stmt.setStartToken(sqlNode);
1346            stmt.setEndToken(sqlNode);
1347            stmt.setLabelName(this.labelName);
1348            stmt.doParseStatement(psql);
1349
1350//            if (stmt.getStartToken() == null){
1351//                stmt.setStartToken(sqlNode.getStartToken());
1352//            }
1353//            if (stmt.getEndToken() == null){
1354//                stmt.setEndToken(sqlNode.getEndToken());
1355//            }
1356        }else{
1357           // System.out.println("stmt is null:"+sqlNode.getNodeType());
1358        }
1359
1360    }
1361
1362    /**
1363     * Check if the given block node represents a TRY/CATCH block
1364     * by examining the token pattern: BEGIN TRY ... or END CATCH
1365     */
1366    private boolean isTryCatchBlock(TParseTreeNode sqlNode) {
1367        TSourceToken startToken = sqlNode.getStartToken();
1368        TSourceToken endToken = sqlNode.getEndToken();
1369
1370        if (startToken == null || endToken == null) {
1371            return false;
1372        }
1373
1374        // Check if end token is CATCH (indicates TRY/CATCH block)
1375        if (endToken.astext != null && endToken.astext.equalsIgnoreCase("CATCH")) {
1376            return true;
1377        }
1378
1379        // Check if end token is TRY (TRY-only block without CATCH)
1380        if (endToken.astext != null && endToken.astext.equalsIgnoreCase("TRY")) {
1381            return true;
1382        }
1383
1384        // Check if start is BEGIN and next solid token is TRY
1385        if (startToken.astext != null && startToken.astext.equalsIgnoreCase("BEGIN")) {
1386            TSourceTokenList tokenList = startToken.container;
1387            if (tokenList != null) {
1388                for (int i = startToken.posinlist + 1; i < tokenList.size(); i++) {
1389                    TSourceToken token = tokenList.get(i);
1390                    if (token.tokentype != ETokenType.ttwhitespace &&
1391                        token.tokentype != ETokenType.ttreturn) {
1392                        if (token.astext != null && token.astext.equalsIgnoreCase("TRY")) {
1393                            return true;
1394                        }
1395                        break; // First non-whitespace token is not TRY
1396                    }
1397                }
1398            }
1399        }
1400
1401        return false;
1402    }
1403}
1404