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    private TParseTreeNode sqlNode = null;
198    private TCustomSqlStatement stmt = null;
199
200    public TCustomSqlStatement getStmt() {
201        return stmt;
202    }
203
204    private boolean isParsed = true;
205
206    public void setParsed(boolean parsed) {
207        isParsed = parsed;
208    }
209
210    public void setSqlNode(TParseTreeNode sqlNode) {
211        this.sqlNode = sqlNode;
212    }
213
214    public void init(Object arg1){
215        if (arg1 instanceof TCustomSqlStatement){
216           stmt = (TCustomSqlStatement)arg1;
217        }else{
218          sqlNode = (TParseTreeNode)arg1;
219        }
220    }
221
222    private  TObjectName endlabelName;
223
224    public void setEndlabelName(TObjectName endlabelName) {
225        this.endlabelName = endlabelName;
226    }
227
228    public TObjectName getEndlabelName() {
229
230        return endlabelName;
231    }
232
233    private  TObjectName labelName;
234
235    public void setLabelName(TObjectName labelName) {
236        this.labelName = labelName;
237    }
238
239    public TObjectName getLabelName() {
240
241        return labelName;
242    }
243
244    public void init(Object arg1,Object arg2){
245        this.init(arg1);
246        this.labelName = (TObjectName)arg2;
247    }
248
249
250    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
251        if (stmt != null){
252            // stmt in plsql already create stmt descends from  TCustomSqlStatement
253            if (!isParsed){
254              stmt.parsestatement(psql,isParsed);
255            }else{
256                stmt.doParseStatement(psql);
257            }
258            if (stmt.getLabelName() == null){
259                stmt.setLabelName(this.labelName);
260            }
261            return;
262        }
263        
264        if (sqlNode == null) return ;
265
266        switch(sqlNode.getNodeType()){
267            case(select):
268//                TSelectSqlNode selectSqlNode = (TSelectSqlNode)sqlNode;
269//                if (selectSqlNode.isHiveFromQuery()){
270//                    stmt = new THiveFromQuery(psql.dbvendor);
271//                }else{
272//                    stmt = new TSelectSqlStatement(psql.dbvendor);
273//                }
274
275                stmt = new TSelectSqlStatement(psql.dbvendor);
276                break;
277            case(delete):
278                stmt = new TDeleteSqlStatement(psql.dbvendor);
279                break;
280            case(update):
281                stmt = new TUpdateSqlStatement(psql.dbvendor);
282                break;
283            case(insert):
284                stmt = new TInsertSqlStatement(psql.dbvendor);
285                break;
286            case(MssqlBulkInsert):
287                stmt = new TMssqlBulkInsert(psql.dbvendor);
288                break;
289            case(MssqlUpdateTextSqlNode):
290                stmt = new TMssqlUpdateText(psql.dbvendor);
291                break;
292            case (MssqlSetRowCountSqlNode):
293                stmt = new TMssqlSetRowCount(psql.dbvendor);
294                break;
295            case (MssqlThrowSqlNode):
296                stmt = new TMssqlThrow(psql.dbvendor);
297                break;
298            case MssqlReconfigureSqlNode:
299                stmt = new TReconfigure(psql.dbvendor);
300                break;
301            case MssqlCreateTypeSqlNode:
302                stmt = new TMssqlCreateType(psql.dbvendor);
303                break;
304            case(createtable):
305                stmt = new TCreateTableSqlStatement(psql.dbvendor);
306                break;
307            case(declare):
308                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
309                    stmt = new TMssqlDeclare(psql.dbvendor);
310                }else if ((psql.dbvendor == EDbVendor.dbvmysql)||(psql.dbvendor == EDbVendor.dbvbigquery)){
311                    stmt = new TMssqlDeclare(psql.dbvendor);
312                }else if (psql.dbvendor == EDbVendor.dbvteradata){
313                    stmt = new TMssqlDeclare(psql.dbvendor);
314                }else if (psql.dbvendor == EDbVendor.dbvdb2){
315                  TDeclareSqlNode declareNode = (TDeclareSqlNode)sqlNode;
316                    switch(declareNode.getDeclareType()){
317                        case variable:
318                            stmt = new TDb2SqlVariableDeclaration(psql.dbvendor);
319                            break;
320                       case conditions:
321                           stmt = new TDb2ConditionDeclaration(psql.dbvendor);
322                           break;
323                       case returnCode:
324                           stmt = new TDb2ReturnCodesDeclaration(psql.dbvendor);
325                           break;
326                       case statement:
327                           stmt = new TDb2StatementDeclaration(psql.dbvendor);
328                           break;
329                       case cursor:
330                           stmt = new TDb2DeclareCursorStatement(psql.dbvendor);
331                           break;
332                       case handlers:
333                           stmt = new TDb2HandlerDeclaration(psql.dbvendor);
334                           break;
335                       default:
336                           break;
337                    }
338                }
339                break;
340            case T_CompoundSqlNode: //db2 compound sql node
341                stmt = new TCommonBlock(psql.dbvendor);
342                break;
343            case(block):
344                switch (psql.dbvendor){
345                    case dbvmssql:
346                    case dbvsybase:
347                    // case dbvazuresql:
348                        // Check if this is a TRY/CATCH block by examining tokens
349                        if (isTryCatchBlock(sqlNode)) {
350                            stmt = new TMssqlTryCatch(psql.dbvendor);
351                        } else {
352                            stmt = new TMssqlBlock(psql.dbvendor);
353                        }
354                        break;
355                    case dbvoracle:
356                    case dbvpostgresql:
357                    case dbvteradata:
358                    case dbvbigquery:
359                    case dbvsnowflake:
360                    case dbvmysql:
361                    case dbvnetezza:
362                    case dbvgreenplum:
363                    case dbvgaussdb:
364                    case dbvredshift:
365                    case dbvhana:
366
367                        stmt = new TCommonBlock(psql.dbvendor);
368                        break;
369                    default:
370                        System.out.println("block type not implemented: "+psql.dbvendor.toString());
371                        break;
372                }
373//                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)){
374//                    stmt = new TMssqlBlock(psql.dbvendor);
375//                }else if ((psql.dbvendor == EDbVendor.dbvoracle)||(psql.dbvendor == EDbVendor.dbvpostgresql)
376//                            ||(psql.dbvendor == EDbVendor.dbvteradata)||(psql.dbvendor == EDbVendor.dbvbigquery)){
377//                    stmt = new TCommonBlock(psql.dbvendor);
378//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
379//                    stmt = new TCommonBlock(psql.dbvendor);
380//                }else{
381//                   System.out.println("block type not implemented: "+psql.dbvendor.toString());
382//                }
383                break;
384            case(MssqlTryCatchSqlNode):
385                stmt = new TMssqlTryCatch(psql.dbvendor);
386                break;
387            case(returnstmt):
388                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
389                    stmt = new TMssqlReturn(psql.dbvendor);
390                }else if (psql.dbvendor == EDbVendor.dbvdb2){
391                    stmt = new TDb2ReturnStmt(psql.dbvendor);
392                }else if (psql.dbvendor == EDbVendor.dbvmysql){
393                    stmt = new TReturnStmt(psql.dbvendor);
394                }
395                break;
396            case(ifstmt):
397                switch (psql.dbvendor){
398                    case dbvmssql:
399                    case dbvsybase:
400                        stmt = new TMssqlIfElse(psql.dbvendor);
401                        break;
402                    case dbvmysql:
403                        stmt = new TMySQLIfStmt(psql.dbvendor);
404                        break;
405                    case dbvbigquery:
406                    case dbvdb2:
407                    case dbvhana:
408                        stmt = new TIfStmt(psql.dbvendor);
409                        break;
410                }
411
412
413                break;
414            case (CreateProcedureSqlNode):
415                if ((psql.dbvendor == EDbVendor.dbvoracle)||(psql.dbvendor == EDbVendor.dbvgaussdb)){
416                    // plsql procedure declaration or specification
417                    stmt = new TPlsqlCreateProcedure(EDbVendor.dbvoracle);
418                    ((TPlsqlCreateProcedure)stmt).setKind(((TCreateProcedureSqlNode)sqlNode).getKind());
419                }else if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)){
420                    stmt = new TMssqlCreateProcedure(psql.dbvendor);
421                }else if (psql.dbvendor == EDbVendor.dbvdb2){
422                    stmt = new TCreateProcedureStmt(psql.dbvendor);
423                }else{
424                    System.out.println("create procedure not implemented: "+psql.dbvendor.toString());
425                }
426                break;
427            case (CreateFunctionSqlNode):
428                switch (psql.dbvendor){
429                    case dbvoracle:
430                        stmt = new TPlsqlCreateFunction(EDbVendor.dbvoracle);
431                        ((TPlsqlCreateFunction)stmt).setKind(((TCreateFunctionSqlNode)sqlNode).getKind());
432                        break;
433                    case dbvmssql:
434                    case dbvsybase:
435                        stmt = new TMssqlCreateFunction(psql.dbvendor);
436                        break;
437                    case dbvdb2:
438                    case dbvgreenplum:
439                    case dbvbigquery:
440                    case dbvgaussdb:
441                        stmt = new TCreateFunctionStmt(psql.dbvendor);
442                        break;
443                    case dbvhive:
444                        stmt = new THiveCreateFunction(psql.dbvendor);
445                        break;
446                    default:
447                        System.out.println("create function not implemented: "+psql.dbvendor.toString());
448                        break;
449                }
450                break;
451            case (ExecImmeNode):
452                stmt = new TExecImmeStmt(EDbVendor.dbvoracle);
453                break;
454            case (ContinueSqlNode):
455                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)) {
456                    stmt = new TMssqlContinue(psql.dbvendor);
457                }else if (psql.dbvendor == EDbVendor.dbvoracle){
458                    stmt = new TPlsqlContinue(psql.dbvendor);
459                }
460                break;
461            case (BreakSqlNode):
462                stmt = new TBreakStmt(psql.dbvendor);
463                break;
464            case (GrantSqlNode):
465                stmt = new TGrantStmt(psql.dbvendor);
466                break;
467            case (DenySqlNode):
468                stmt = new TDenyStmt(psql.dbvendor);
469                break;
470            case (RevokeSqlNode):
471                stmt = new TRevokeStmt(psql.dbvendor);
472                break;
473            case (FetchSqlNode):
474                if ((psql.dbvendor == EDbVendor.dbvmssql)
475                        ||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvteradata)||(psql.dbvendor == EDbVendor.dbvhana)){
476                    stmt = new TMssqlFetch(psql.dbvendor);
477                }else if (psql.dbvendor == EDbVendor.dbvdb2){
478                    stmt = new TDb2FetchCursorStmt(psql.dbvendor);
479                }else if (psql.dbvendor == EDbVendor.dbvmysql){
480                    stmt = new TFetchStmt(psql.dbvendor);
481                }
482                break;
483            case (OpenSqlNode):
484                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
485                    stmt = new TMssqlOpen(psql.dbvendor);
486                }else if (psql.dbvendor == EDbVendor.dbvdb2){
487                    stmt = new TDb2OpenCursorStmt(psql.dbvendor);
488                }else if (psql.dbvendor == EDbVendor.dbvmysql){
489                    stmt = new TOpenStmt(psql.dbvendor);
490                }else if (psql.dbvendor == EDbVendor.dbvteradata){
491                    stmt = new TMssqlOpen(psql.dbvendor);
492                }
493                break;
494            case (CloseSqlNode):
495                if ((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)||(psql.dbvendor == EDbVendor.dbvhana)){
496                    stmt = new TMssqlClose(psql.dbvendor);
497                }else if (psql.dbvendor == EDbVendor.dbvdb2){
498                    stmt = new TDb2CloseCursorStmt(psql.dbvendor);
499                }else if (psql.dbvendor == EDbVendor.dbvteradata){
500                    stmt = new TCloseStmt(EDbVendor.dbvteradata);
501                }else if (psql.dbvendor == EDbVendor.dbvmysql){
502                    stmt = new TCloseStmt(psql.dbvendor);
503                }else if (psql.dbvendor == EDbVendor.dbvredshift){
504                    stmt = new TCloseStmt(psql.dbvendor);
505                }
506                break;
507            case (CreateIndexSqlNode):
508                stmt = new TCreateIndexSqlStatement(psql.dbvendor);
509                break;
510            case (DropTableSqlNode):
511                stmt = new TDropTableSqlStatement(psql.dbvendor);
512                break;
513            case (DropIndexSqlNode):
514                stmt = new TDropIndexSqlStatement(psql.dbvendor);
515                break;
516            case (DropViewSqlNode):
517                stmt = new TDropViewSqlStatement(psql.dbvendor);
518                break;
519            case (DropDbObjectSqlNode):
520                stmt = new TMssqlDropDbObject(psql.dbvendor);
521                break;
522            case (AlterTableSqlNode):
523                stmt = new TAlterTableStatement(psql.dbvendor);
524                break;
525            case (alterViewSqlNode):
526                stmt = new TAlterViewStatement(psql.dbvendor);
527                break;
528            case (alterDatabaseSqlNode):
529                stmt = new TAlterDatabaseStmt(psql.dbvendor);
530                break;
531            case (alterIndexSqlNode):
532                stmt = new TAlterIndexStmt(psql.dbvendor);
533                break;
534            case (MssqlDeallocateSqlNode):
535                stmt = new TMssqlDeallocate(psql.dbvendor);
536                break;
537            case(ExecuteSqlNode):
538                switch (psql.dbvendor){
539                    case dbvteradata:
540                        stmt = new TTeradataExecute(psql.dbvendor);
541                        break;
542                    case dbvpostgresql:
543                    case dbvsnowflake:
544                    case dbvnetezza:
545                    case dbvredshift:
546                        stmt = new TExecuteSqlStatement(psql.dbvendor);
547                        break;
548                    default:
549                        stmt = new TMssqlExecute(psql.dbvendor);
550                        break;
551                }
552
553                break;
554            case(ExecuteAsSqlNode):
555                stmt = new TMssqlExecuteAs(psql.dbvendor);
556                break;
557            case(BeginTranSqlNode):
558                stmt = new TBeginTran(psql.dbvendor);
559                break;
560            case(EndTranSqlNode):
561                stmt = new TEndTran(psql.dbvendor);
562                break;
563            case(MssqlRaiserrorSqlNode):
564                stmt = new TMssqlRaiserror(psql.dbvendor);
565                break;
566            case(MssqlLabelSqlNode):
567                stmt = new TMssqlLabel(psql.dbvendor);
568                break;
569            case(MssqlGotoSqlNode):
570                stmt = new TMssqlGoTo(psql.dbvendor);
571                break;
572            case(MssqlRevertSqlNode):
573                stmt = new TMssqlRevert(psql.dbvendor);
574                break;
575            case MssqlSendOnConversationSqlNode:
576                stmt = new  TMssqlSendOnConversation(psql.dbvendor);
577                break;
578            case(MssqlEndConversationSqlNode):
579                stmt = new TMssqlEndConversation(psql.dbvendor);
580                break;
581            case(MssqlBeginDialogSqlNode):
582                stmt = new TMssqlBeginDialog(psql.dbvendor);
583                break;
584            case MssqlSetSqlNode:
585                stmt = new TMssqlSet(psql.dbvendor);
586                break;
587            case LoopSqlNode:
588                switch (psql.dbvendor){
589                    case dbvdb2:
590                        stmt = new TDb2LoopStmt(EDbVendor.dbvdb2);
591                        break;
592                    default:
593                        stmt = new TLoopStmt(psql.dbvendor);
594                        break;
595
596                }
597                break;
598            case RepeatSqlNode:
599                stmt = new TRepeatStmt(psql.dbvendor);
600//                if (psql.dbvendor == EDbVendor.dbvdb2){
601//                    stmt = new TRepeatStmt(EDbVendor.dbvdb2);
602//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
603//                    stmt = new TMySQLRepeatStmt(EDbVendor.dbvmysql);
604//                }
605                break;
606            case WhileSqlNode:
607                stmt = new TWhileStmt(psql.dbvendor);
608//                if (psql.dbvendor == EDbVendor.dbvdb2){
609//                    stmt = new TWhileStmt(EDbVendor.dbvdb2);
610//                }else if (psql.dbvendor == EDbVendor.dbvmysql){
611//                    stmt = new TMySQLWhileStmt(EDbVendor.dbvmysql);
612//                }
613                break;
614            case ForSqlNode:
615                stmt = new TForStmt(dbvendor);
616                break;
617            case SetSqlNode:
618                switch (psql.dbvendor){
619                    case dbvhive:
620                        stmt = new THiveSet(EDbVendor.dbvhive);
621                        break;
622                    case dbvmysql:
623                    case dbvbigquery:
624                    case dbvteradata:
625                    case dbvgaussdb:
626                        stmt = new TSetStmt(psql.dbvendor);
627                        break;
628                    default:
629                        stmt = new TDb2SetVariableStmt(EDbVendor.dbvdb2);
630                        break;
631                }
632
633                break;
634            case UnsetSqlNode:
635                stmt = new TUnsetStmt(psql.dbvendor);
636                break;
637            case caseExpression:
638                switch (psql.dbvendor){
639                    case dbvdb2:
640                        stmt = new TDb2CaseStmt(EDbVendor.dbvdb2);
641                        break;
642                    case dbvmysql:
643                        stmt = new TMySQLCaseStmt(EDbVendor.dbvmysql);
644                        break;
645                    case dbvteradata:
646                        stmt = new TCaseStmt(EDbVendor.dbvmysql);
647                        break;
648                    default:
649                        break;
650                }
651
652                break;
653            case(MssqlStmtStubSqlNode):
654                //TMssqlStmtStubSqlNode stmt1 = (TMssqlStmtStubSqlNode)sqlNode;
655                if (((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() == ESqlStatementType.sstmssqlset){
656                    stmt = new TMssqlSet(psql.dbvendor);
657                    //((TMssqlSet)stmt).setSetType(TBaseType.mstSetCmd);
658                    stmt.setStartToken(sqlNode);
659                    stmt.setEndToken(sqlNode);
660                }else{
661                    stmt = new TMssqlStmtStub(psql.dbvendor);
662                    ((TMssqlStmtStub)stmt).setSqlStatementType( ((TMssqlStmtStubSqlNode)sqlNode).getSqlStatementType() );
663                }
664                break;
665            case T_TeradataStmtStubSqlNode:
666                switch (((TTeradataStmtStubSqlNode)sqlNode).getSqlStatementType()){
667                    case sstRevoke:
668                        stmt = new TRevokeStmt(psql.dbvendor);
669                        break;
670                    default:
671                        stmt = new TTeradataStmtStub(psql.dbvendor);
672                        ((TTeradataStmtStub)stmt).sqlstatementtype = ( ((TTeradataStmtStubSqlNode)sqlNode).getSqlStatementType() );
673                }
674                break;
675            case stubStmtSqlNode:
676                TStubStmtSqlNode stubNode = (TStubStmtSqlNode)sqlNode;
677
678                switch(stubNode.getSqlStatementType()){
679                    case sstdb2signal:
680                    case sstsignal:
681                        stmt = new TSignalStmt(psql.dbvendor);
682                        break;
683                    default:
684                        break;
685                }
686
687                if (psql.dbvendor == EDbVendor.dbvdb2){
688                    switch(stubNode.getSqlStatementType()){
689                        case sstdb2iterate:
690                            stmt = new TDb2IterateStmt(EDbVendor.dbvdb2);
691                            break;
692                        case sstdb2call:
693                            stmt = new TDb2CallStmt(EDbVendor.dbvdb2);
694                            break;
695                        case sstdb2leave:
696                            stmt = new TDb2LeaveStmt(EDbVendor.dbvdb2);
697                            break;
698                        case sstdb2signal:
699                            break;
700                        case sstdb2goto:
701                            stmt = new TDb2GotoStmt(EDbVendor.dbvdb2);
702                            break;
703                        case sstdb2set:
704                            stmt = new TDb2SetStmt(EDbVendor.dbvdb2);
705                            break;
706                        default:
707                            stmt = new TDb2StmtStub(EDbVendor.dbvdb2);
708                            ((TDb2StmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
709                            break;
710                    }
711                }else if (psql.dbvendor == EDbVendor.dbvmysql){
712                    stmt = new TMySQLStmtStub(EDbVendor.dbvmysql);
713                    ((TMySQLStmtStub)stmt).setSqlStatementType( ((TStubStmtSqlNode)sqlNode).getSqlStatementType() );
714                }
715                break;
716            case(dummyNode):
717                TDummy dummy = (TDummy)sqlNode;
718
719                switch (dummy.sqlstatementtype){
720                    case sstcommit:
721                        stmt = new TCommitStmt(psql.dbvendor);
722                        break;
723                    case sstmssqlcommit:
724                        stmt = new TMssqlCommit(psql.dbvendor);
725                        break;
726                    case sstmssqlrollback:
727                        stmt = new TMssqlRollback(psql.dbvendor);
728                        break;
729                    case sstrollback:
730                        stmt = new TRollbackStmt(psql.dbvendor);
731                        break;
732                    case sstmssqlsavetran:
733                        stmt = new TMssqlSaveTran(psql.dbvendor);
734                        break;
735                    case sstmssqlprint:
736                        stmt = new TMssqlPrint(psql.dbvendor);
737                        break;
738                    case sstmssqluse:
739                        stmt = new TUseDatabase(psql.dbvendor);
740                        break;
741                    case sstmssqlgo:
742                        stmt = new TMssqlGo(psql.dbvendor);
743                        break;
744                    case sstHelpProcedure:
745                        stmt = new THelpProcedure(psql.dbvendor);
746                        break;
747                    case sstShowProcedure:
748                        stmt = new TShowProcedure(psql.dbvendor);
749                        break;
750                    case sstRevoke:
751                        stmt = new TRevokeStmt(psql.dbvendor);
752                        break;
753                    case sstAllocate:
754                        stmt = new TAllocateStmt(psql.dbvendor);
755                        break;
756                    case sstDrop:
757                        stmt = new TDropStmt(psql.dbvendor);
758                        break;
759                    case sstmssqlDropSecurityPolicy:
760                        stmt = new TMssqlDropSecurityPolicy(psql.dbvendor);
761                        break;
762                }
763                break;
764            case(ParseErrorNode):
765                stmt = new TParseErrorSqlStatement(psql.dbvendor);
766                break;
767            case (truncateTable):
768                stmt = new TTruncateStatement(psql.dbvendor);
769                break;
770            case(hiveLoadSqlNode):
771                stmt = new THiveLoad(EDbVendor.dbvhive);
772                break;
773            case (hiveExportSqlNode):
774                stmt = new THiveExportTable(EDbVendor.dbvhive);
775                break;
776            case (hiveImportSqlNode):
777                stmt = new THiveImportTable(EDbVendor.dbvhive);
778                break;
779            case (createDatabaseSqlNode):
780                stmt = new TCreateDatabaseSqlStatement(psql.dbvendor);
781                break;
782            case (hiveSwitchDBSqlNode):
783                stmt = new THiveSwitchDatabase(psql.dbvendor);
784                break;
785            case (hiveDropDBSqlNode):
786                stmt = new THiveDropDatabase(psql.dbvendor);
787                break;
788            case (hiveDescribeSqlNode):
789                stmt = new THiveDescribe(psql.dbvendor);
790                break;
791            case (hiveShowSqlNode):
792                stmt = new THiveShow(psql.dbvendor);
793                break;
794            case (msckSqlNode):
795                stmt = new TMSCKStmt(psql.dbvendor);
796                break;
797            case (hiveDropFunctionSqlNode):
798                stmt = new THiveDropFunction(psql.dbvendor);
799                break;
800            case (analyzeSqlNode):
801                stmt = new TAnalyzeStmt(psql.dbvendor);
802                break;
803            case (LockSqlNode):
804                stmt = new TLockTableStmt(psql.dbvendor);
805                break;
806            case (hiveCreateRoleSqlNode):
807                stmt = new THiveCreateRole(psql.dbvendor);
808                break;
809            case (hiveGrantSqlNode):
810                if (((THiveGrantSqlNode)sqlNode).isRevoke()){
811                    stmt = new THiveRevoke(EDbVendor.dbvhive);
812                }else{
813                    stmt = new THiveGrant(EDbVendor.dbvhive);
814                }
815                break;
816            case (hiveShowGrantSqlNode):
817                stmt = new THiveShowGrant(psql.dbvendor);
818                break;
819            case (hiveDropRoleSqlNode):
820                stmt = new THiveDropRole(psql.dbvendor);
821                break;
822            case (hiveShowRoleGrantSqlNode):
823                stmt = new THiveShowRoleGrant(psql.dbvendor);
824                break;
825            case (hiveGrantRoleSqlNode):
826                if(((THiveGrantRoleSqlNode)sqlNode).isRevoke()){
827                    stmt = new THiveRevokeRole(psql.dbvendor);
828                }else{
829                    stmt = new THiveGrantRole(psql.dbvendor);
830                }
831
832                break;
833//            case hiveFromQuerySqlNode:
834//                stmt = new THiveFromQuery(EDbVendor.dbvhive);
835//                break;
836           case sybaseDumpTranSqlNode:
837               stmt = new TSybaseDumpTran(EDbVendor.dbvsybase);
838               break;
839           case sybaseUpdateIndexStatisticsSqlNode:
840               stmt = new TSybaseUpdateIndexStatistics(EDbVendor.dbvsybase);
841               break;
842           case sybaseWritetextSqlNode:
843               stmt = new TSybaseWritetext(EDbVendor.dbvsybase);
844               break;
845           case sybaseDeleteStatisticsSqlNode:
846               stmt = new TSybaseDeleteStatistics(EDbVendor.dbvsybase);
847               break;
848           case callSqlNode:
849               stmt = new TCallStatement(psql.dbvendor);
850               break;
851           case moveSqlNode:
852               stmt = new TMoveStmt(EDbVendor.dbvpostgresql);
853               break;
854           case MergeSqlNode:
855               stmt = new TMergeSqlStatement(psql.dbvendor) ;
856               break;
857            case dropSequenceSqlNode:
858                stmt = new TDropSequenceStmt(psql.dbvendor);
859                break;
860            case dropProcedureSqlNode:
861                stmt = new TDropProcedureStmt(psql.dbvendor);
862                break;
863            case OracleCompoundTriggerBody:
864                stmt = new  TCompoundTriggerBody(psql.dbvendor);
865                break;
866            case createSynonymSqlNode:
867                stmt = new TCreateSynonymStmt(psql.dbvendor);
868                break;
869            case T_TeradataLockSqlNode:
870                stmt = new TTeradataLock(psql.dbvendor);
871                break;
872            case  MssqlCreateXmlSchemaCollectionSqlNode:
873                stmt = new TMssqlCreateXmlSchemaCollectionStmt(psql.dbvendor);
874                break;
875            case DeallocatePrepareSqlNode:
876                stmt = new TMySQLDeallocatePrepareStmt(psql.dbvendor);
877                break;
878            case createSchemaSqlNode:
879                stmt = new TCreateSchemaSqlStatement(psql.dbvendor);
880                break;
881            case dropDatabaseSqlNode:
882                stmt = new TDropDatabaseStmt(psql.dbvendor);
883                break;
884            case dropSchemaSqlNode:
885                stmt = new TDropSchemaSqlStatement(psql.dbvendor);
886                break;
887            case MssqlBeginConversationTimerSqlNode:
888                stmt = new TMssqlBeginConversationTimer(psql.dbvendor);
889                break;
890            case getDiagSqlNode:
891                stmt = new TGetDiagStmt(psql.dbvendor);
892                break;
893            case dropFunctionSqlNode:
894                stmt = new TDropFunctionStmt(psql.dbvendor);
895                break;
896            case performanceSqlNode:
897                stmt = new TPerformanceStmt(psql.dbvendor);
898                break;
899            case PrepareSqlNode:
900                stmt = new TPrepareStmt(psql.dbvendor);
901                break;
902            case upsertSqlNode:
903                stmt = new TUpsertStmt(psql.dbvendor);
904                break;
905            case createviewstmt:
906                stmt = new TCreateViewSqlStatement(dbvendor);
907                break;
908            case LeaveSqlNode:
909                stmt = new TLeaveStmt(dbvendor);
910                break;
911            case TSignalSqlNode:
912                stmt = new TSignalStmt(dbvendor);
913                break;
914            case rolllbackSqlNode:
915                stmt = new TRollbackStmt(dbvendor);
916                break;
917            case commitSqlNode:
918                stmt = new TCommitStmt(dbvendor);
919                break;
920            case IterateSqlNode:
921                stmt = new TIterateStmt(dbvendor);
922                break;
923            case T_SetSessionSqlNode:
924                stmt  = new TTeradataSetSession(dbvendor);
925                break;
926            case T_DisableEnableTriggerSqlNode:
927                stmt = new TDisableEnableTriggerStmt(dbvendor);
928                break;
929            case CommentSqlNode:
930                stmt = new TCommentOnSqlStmt(dbvendor);
931                break;
932            case CreateTypeSqlNode:
933                stmt = new TCreateTypeStmt(dbvendor);
934                break;
935            case TCreateStageSqlNode:
936                stmt = new TCreateStageStmt(dbvendor);
937                break;
938            case TCreateStreamSqlNode:
939                stmt = new TCreateStreamStmt(dbvendor);
940                break;
941            case TCreatePipeSqlNode:
942                stmt = new TCreatePipeStmt(dbvendor);
943                break;
944            case CollectStatisticsSqlNode:
945                stmt = new TTeradataCollectStatistics(dbvendor);
946                break;
947            case TResetSqlNode:
948                stmt = new TResetStmt(dbvendor);
949                break;
950            case TAlterSessionSqlNode:
951                stmt = new TAlterSessionStatement(dbvendor);
952                break;
953            case TCreateTaskSqlNode:
954                stmt = new TCreateTaskStmt(dbvendor);
955                break;
956            case TCreatePartitionFunctionSqlNode:
957                stmt = new TCreatePartitionFunctionStmt(dbvendor);
958                break;
959            case TAlterPartitionFunctionSqlNode:
960                stmt = new TAlterPartitionFunctionStmt(dbvendor);
961                break;
962            case TCreatePartitionSchemeSqlNode:
963                stmt = new TCreatePartitionSchemeSqlStatement(dbvendor);
964                break;
965            case TAlterPartitionSchemeSqlNode:
966                stmt = new TAlterPartitionSchemeSqlStatement(dbvendor);
967                break;
968            default:
969                break;
970        }
971
972        if (stmt != null){
973            stmt.rootNode = sqlNode;
974            stmt.setStartToken(sqlNode);
975            stmt.setEndToken(sqlNode);
976            stmt.setLabelName(this.labelName);
977            stmt.doParseStatement(psql);
978
979//            if (stmt.getStartToken() == null){
980//                stmt.setStartToken(sqlNode.getStartToken());
981//            }
982//            if (stmt.getEndToken() == null){
983//                stmt.setEndToken(sqlNode.getEndToken());
984//            }
985        }else{
986           // System.out.println("stmt is null:"+sqlNode.getNodeType());
987        }
988
989    }
990
991    /**
992     * Check if the given block node represents a TRY/CATCH block
993     * by examining the token pattern: BEGIN TRY ... or END CATCH
994     */
995    private boolean isTryCatchBlock(TParseTreeNode sqlNode) {
996        TSourceToken startToken = sqlNode.getStartToken();
997        TSourceToken endToken = sqlNode.getEndToken();
998
999        if (startToken == null || endToken == null) {
1000            return false;
1001        }
1002
1003        // Check if end token is CATCH (indicates TRY/CATCH block)
1004        if (endToken.astext != null && endToken.astext.equalsIgnoreCase("CATCH")) {
1005            return true;
1006        }
1007
1008        // Check if end token is TRY (TRY-only block without CATCH)
1009        if (endToken.astext != null && endToken.astext.equalsIgnoreCase("TRY")) {
1010            return true;
1011        }
1012
1013        // Check if start is BEGIN and next solid token is TRY
1014        if (startToken.astext != null && startToken.astext.equalsIgnoreCase("BEGIN")) {
1015            TSourceTokenList tokenList = startToken.container;
1016            if (tokenList != null) {
1017                for (int i = startToken.posinlist + 1; i < tokenList.size(); i++) {
1018                    TSourceToken token = tokenList.get(i);
1019                    if (token.tokentype != ETokenType.ttwhitespace &&
1020                        token.tokentype != ETokenType.ttreturn) {
1021                        if (token.astext != null && token.astext.equalsIgnoreCase("TRY")) {
1022                            return true;
1023                        }
1024                        break; // First non-whitespace token is not TRY
1025                    }
1026                }
1027            }
1028        }
1029
1030        return false;
1031    }
1032}
1033