001//import test.SqlFileList;
002import java.io.*;
003import java.nio.charset.Charset;
004import java.nio.charset.StandardCharsets;
005import java.text.NumberFormat;
006import java.text.SimpleDateFormat;
007import java.util.*;
008
009import gudusoft.gsqlparser.*;
010import gudusoft.gsqlparser.compiler.TAnnotatedTree;
011import gudusoft.gsqlparser.compiler.TTypeAndScopeScanner;
012import gudusoft.gsqlparser.compiler.util.TSimpleEvaluationContext;
013import gudusoft.gsqlparser.nodes.*;
014import gudusoft.gsqlparser.resolver2.format.DisplayNameMode;
015import gudusoft.gsqlparser.sqlenv.TSQLCatalog;
016import gudusoft.gsqlparser.sqlenv.TSQLEnv;
017import gudusoft.gsqlparser.sqlenv.TSQLSchema;
018import gudusoft.gsqlparser.sqlenv.TSQLTable;
019import gudusoft.gsqlparser.stmt.*;
020import gudusoft.gsqlparser.stmt.mssql.TMssqlBlock;
021import gudusoft.gsqlparser.stmt.mssql.TMssqlCreateProcedure;
022import gudusoft.gsqlparser.stmt.oracle.TBasicStmt;
023import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateFunction;
024import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreatePackage;
025import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateProcedure;
026import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateTrigger;
027import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateType;
028import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateTypeBody;
029import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateType_Placeholder;
030import gudusoft.gsqlparser.stmt.oracle.TPlsqlDummyStmt;
031import gudusoft.gsqlparser.stmt.TExecImmeStmt;
032import gudusoft.gsqlparser.stmt.oracle.TPlsqlForallStmt;
033import gudusoft.gsqlparser.stmt.oracle.TPlsqlGotoStmt;
034import gudusoft.gsqlparser.stmt.oracle.TPlsqlNullStmt;
035import gudusoft.gsqlparser.stmt.oracle.TPlsqlPipeRowStmt;
036import gudusoft.gsqlparser.stmt.oracle.TPlsqlPragmaDeclStmt;
037import gudusoft.gsqlparser.stmt.oracle.TPlsqlProcedureSpecStmt;
038import gudusoft.gsqlparser.stmt.oracle.TPlsqlRecordTypeDefStmt;
039import gudusoft.gsqlparser.stmt.oracle.TPlsqlSqlStmt;
040import gudusoft.gsqlparser.stmt.oracle.TPlsqlSubProgram;
041import gudusoft.gsqlparser.stmt.oracle.TPlsqlTableTypeDefStmt;
042import gudusoft.gsqlparser.stmt.oracle.TPlsqlVarrayTypeDefStmt;
043import gudusoft.gsqlparser.stmt.oracle.TSqlplusCmdStatement;
044import gudusoft.gsqlparser.stmt.teradata.TTeradataNotImplement;
045import gudusoft.gsqlparser.util.VariableSubstitutor;
046
047
048
049
050class SqlFileList {
051
052        public final List<String> sqlfiles = new ArrayList<String>();
053        private String suffix = ".sql";
054        private boolean listAllFiles = false;
055
056        public SqlFileList(String dir, boolean includeSubDir) {
057                File parent = new File(dir);
058                if (parent.exists() && parent.isDirectory())
059                        traverseSqlFiles(parent, includeSubDir);
060        }
061
062        public SqlFileList(String dir, boolean includeSubDir, boolean listAllFiles) {
063                this.listAllFiles = listAllFiles;
064                File parent = new File(dir);
065                if (parent.exists() && parent.isDirectory())
066                        traverseSqlFiles(parent, includeSubDir);
067        }
068
069        public SqlFileList(String dir) {
070                this(dir, false);
071        }
072
073        private void traverseSqlFiles(File parent, boolean includeSubDir) {
074                File[] files = parent.listFiles(new FileFilter() {
075
076                        public boolean accept(File file) {
077                                if (listAllFiles){
078                                        sqlfiles.add(file.getAbsolutePath());
079                                }else if (file.getName().toLowerCase().endsWith(suffix)) {
080                                        sqlfiles.add(file.getAbsolutePath());
081                                }
082
083                                if (file.isDirectory())
084                                        return true;
085
086                                return false;
087                        }
088                });
089
090                if (includeSubDir) {
091                        if (files != null && files.length > 0) {
092                                for (File file : files) {
093                                        traverseSqlFiles(file, includeSubDir);
094                                }
095                        }
096                }
097        }
098
099}
100
101class getObject {
102        public final static int compareMode = 1;
103        public final static int showMode = 2;
104
105        String sqlfile;
106        String[] desiredTables = new String[100];
107        String[] desiredColumns = new String[100];
108        int desiredTableCount = 0, desiredColumnCount = 0;
109
110        String oracle_sqldir = "D:/prg/gsqlparser/Test/TestCases/java/oracle/dbobject/";
111        String[] oracle_sqlfiles = { "berger_example_01", "berger_sqltest_01", "berger_sqltest_02", "berger_sqltest_03",
112                        "berger_sqltest_04", "berger_sqltest_05", "createtrigger", "plsql_block_correlated_subquery",
113                        "createfunction", "createpackagebody" };
114
115        String sqlserver_sqldir = "D:/prg/gsqlparser/Test/TestCases/fetchdbobject/mssql/java/";
116        String[] sqlserver_sqlfiles = { "bigjoin1", "shurleyjoin", "delete1", "delete2", "delete3", "delete4", "update1",
117                        "update2", "update3", "insert1", "createfunction1", "createprocedure1", "createtrigger1", "createview1",
118                        "while1"
119
120        };
121
122        String sqldir;
123        String[] sqlfiles;
124        int files_count = 0;
125
126        public String showModeFile;
127
128        String[] foundTables = new String[1000];
129        String[] foundColumns = new String[1000];
130        int foundTableCount = 0;
131        int foundColumnsCount = 0;
132
133        EDbVendor dbvendor;
134
135        getObject(EDbVendor db) {
136                this.dbvendor = db;
137                if (db == EDbVendor.dbvoracle) {
138                        sqldir = oracle_sqldir;
139                        sqlfiles = oracle_sqlfiles;
140                        files_count = sqlfiles.length;
141                } else {
142                        sqldir = sqlserver_sqldir;
143                        sqlfiles = sqlserver_sqlfiles;
144                        files_count = sqlfiles.length;
145                }
146        }
147
148        void getDesiredTablesColumns(String sqlfile, String[] pTables, String[] pColumns) {
149                String line;
150                desiredTableCount = 0;
151                desiredColumnCount = 0;
152                boolean isTable = false, isColumn = false;
153                try {
154                        BufferedReader br = new BufferedReader(new FileReader(sqlfile));
155
156                        try {
157                                while ((line = br.readLine()) != null) {
158
159                                        if (line.toLowerCase().indexOf("tables:") >= 0) {
160                                                isTable = true;
161                                                isColumn = false;
162                                                continue;
163                                        }
164
165                                        if (line.toLowerCase().indexOf("fields:") >= 0) {
166                                                isTable = false;
167                                                isColumn = true;
168                                                continue;
169                                        }
170
171                                        if (line.toLowerCase().indexOf("functions:") >= 0) {
172                                                isTable = false;
173                                                isColumn = false;
174                                                continue;
175                                        }
176
177                                        if (line.toLowerCase().indexOf("schema:") >= 0) {
178                                                isTable = false;
179                                                isColumn = false;
180                                                continue;
181                                        }
182
183                                        if (isTable) {
184                                                pTables[desiredTableCount] = line.trim();
185                                                desiredTableCount++;
186                                        }
187
188                                        if (isColumn) {
189                                                pColumns[desiredColumnCount] = line.trim();
190                                                desiredColumnCount++;
191                                        }
192                                }
193                                br.close();
194                        } catch (IOException e) {
195                                System.out.println(e.toString());
196                        }
197
198                } catch (FileNotFoundException e) {
199                        System.out.println(e.toString());
200                }
201
202        }
203
204        void run(int pmode) {
205                // 1: compare, compare found table/column with desired results in a file
206                // 2: show result, don't compare
207
208                TGSqlParser sqlparser = new TGSqlParser(this.dbvendor);
209                if (pmode == showMode) {
210                        files_count = 1;
211                }
212                for (int k = 0; k < files_count; k++) {
213                        foundColumnsCount = 0;
214                        foundTableCount = 0;
215                        if (pmode == showMode) {
216                                sqlparser.sqlfilename = showModeFile;
217                        } else {
218                                sqlparser.sqlfilename = sqldir + sqlfiles[k] + ".sql";
219                        }
220
221                        int ret = sqlparser.parse();
222                        if (ret == 0) {
223                                if (pmode == compareMode) {
224                                        getDesiredTablesColumns(sqldir + sqlfiles[k] + ".out", desiredTables, desiredColumns);
225                                }
226
227                                TCustomSqlStatement stmt = null;
228                                for (int i = 0; i < sqlparser.sqlstatements.size(); i++) {
229                                        analyzeStmt(sqlparser.sqlstatements.get(i));
230                                }
231
232                                String[] foundTables2 = new String[foundTableCount];
233                                for (int k1 = 0; k1 < foundTableCount; k1++) {
234                                        foundTables[k1] = foundTables[k1].toLowerCase();
235                                }
236                                System.arraycopy(foundTables, 0, foundTables2, 0, foundTableCount);
237                                Set set = new HashSet(Arrays.asList(foundTables2));
238                                Object[] foundTables3 = set.toArray();
239                                Arrays.sort(foundTables3);
240
241                                String[] foundColumns2 = new String[foundColumnsCount];
242                                for (int k1 = 0; k1 < foundColumnsCount; k1++) {
243                                        foundColumns[k1] = foundColumns[k1].toLowerCase();
244                                }
245                                System.arraycopy(foundColumns, 0, foundColumns2, 0, foundColumnsCount);
246                                Set set2 = new HashSet(Arrays.asList(foundColumns2));
247                                Object[] foundColumns3 = set2.toArray();
248                                Arrays.sort(foundColumns3);
249
250                                if (pmode == compareMode) {
251                                        System.out.println("process: " + sqlfiles[k] + ", tables desired: " + desiredTableCount
252                                                        + ", found: " + foundTables3.length + ", columns desired: " + desiredColumnCount
253                                                        + ", found columns: " + foundColumns3.length);
254                                }
255
256                                if (pmode == showMode) {
257                                        System.out.println("Tables:");
258                                        for (int j = 0; j < foundTables3.length; j++) {
259                                                System.out.println(foundTables3[j]);
260                                        }
261
262                                        System.out.println("Fields:");
263                                        for (int j = 0; j < foundColumns3.length; j++) {
264                                                System.out.println(foundColumns3[j]);
265                                        }
266
267                                        return;
268                                }
269
270                                boolean isfound = false;
271                                for (int i = 0; i < desiredColumnCount; i++) {
272                                        isfound = false;
273                                        for (int j = 0; j < foundColumns3.length; j++) {
274                                                if (desiredColumns[i].toString().equalsIgnoreCase(foundColumns3[j].toString())) {
275                                                        isfound = true;
276                                                        break;
277                                                }
278                                        }
279
280                                        if (!isfound) {
281                                                System.out.println("desired column not found:" + desiredColumns[i]);
282                                        }
283                                }
284
285                                for (int i = 0; i < foundColumns3.length; i++) {
286                                        isfound = false;
287                                        for (int j = 0; j < desiredColumnCount; j++) {
288                                                if (foundColumns3[i].toString().equalsIgnoreCase(desiredColumns[j].toString())) {
289                                                        isfound = true;
290                                                        break;
291                                                }
292                                        }
293
294                                        if (!isfound) {
295                                                System.out.println("not in desired column:" + foundColumns3[i]);
296                                        }
297                                }
298
299                        } else {
300                                System.out.println(sqlparser.getErrormessage());
301                        }
302                }
303        }
304
305        protected void analyzeStmt(TCustomSqlStatement stmt) {
306                for (int i = 0; i < stmt.tables.size(); i++) {
307                        if (stmt.tables.getTable(i).isBaseTable()) {
308                                if ((stmt.dbvendor == EDbVendor.dbvmssql)
309                                                && ((stmt.tables.getTable(i).getFullName().equalsIgnoreCase("deleted"))
310                                                                || (stmt.tables.getTable(i).getFullName().equalsIgnoreCase("inserted")))) {
311                                        continue;
312                                }
313
314                                foundTables[foundTableCount] = stmt.tables.getTable(i).getFullName();
315                                foundTableCount++;
316                                for (int j = 0; j < stmt.tables.getTable(i).getObjectNameReferences().size(); j++) {
317                                        foundColumns[foundColumnsCount] = stmt.tables.getTable(i).getFullName() + "."
318                                                        + stmt.tables.getTable(i).getObjectNameReferences().getObjectName(j).getColumnNameOnly();
319                                        foundColumnsCount++;
320                                }
321                        }
322                        // System.out.println(stmt.tables.getTable(i).getFullName());
323                }
324
325                for (int i = 0; i < stmt.getStatements().size(); i++) {
326                        analyzeStmt(stmt.getStatements().get(i));
327                }
328
329        }
330
331}
332
333class tableEffected {
334        public final static int select = 0;
335        public final static int createtable = 1;
336        public final static int delete = 2;
337        public final static int insert = 3;
338        public final static int update = 4;
339        public final static String[] stmtstr = { "s", "c", "d", "i", "u" };
340
341        TObjectName tablename;
342        int[] statetments;
343
344        public tableEffected() {
345                statetments = new int[5];
346        }
347
348}
349
350class ProcessFile {
351        String sqlfilename;
352        FileInputStream streamFromSqlFile = null;
353
354        public ProcessFile(String filename) {
355                sqlfilename = filename;
356        }
357
358        public void openIt() {
359                try {
360
361                        streamFromSqlFile = new FileInputStream(sqlfilename);
362                        InputStreamReader isr = new InputStreamReader(streamFromSqlFile, Charset.defaultCharset().name());
363
364                        BufferedReader finputstream = new BufferedReader(isr);
365
366                        String thisLine;
367                        while ((thisLine = finputstream.readLine()) != null) {
368                                System.out.println(thisLine);
369                        }
370
371                } catch (Exception e) {
372                        System.out.println(e.toString());
373                } finally {
374                }
375
376                System.out.println("Process: " + sqlfilename);
377        }
378
379        public void closeIt() {
380                try {
381                        streamFromSqlFile.close();
382                } catch (IOException e) {
383                        e.printStackTrace();
384                }
385        }
386
387}
388
389class crud {
390        public final static int max_tables = 100;
391        tableEffected[] tables;
392        int total_tables;
393        EDbVendor dbvendor;
394        String sqlfile;
395
396        public crud(EDbVendor db, String sqlfile) {
397                this.dbvendor = db;
398                this.sqlfile = sqlfile;
399                tables = new tableEffected[max_tables];
400                total_tables = 0;
401        }
402
403        public int run() {
404                TGSqlParser sqlparser = new TGSqlParser(this.dbvendor);
405                sqlparser.sqlfilename = sqlfile;
406                int ret = sqlparser.parse();
407                if (ret != 0) {
408                        System.out.println(sqlparser.getErrormessage());
409                        return ret;
410                }
411
412                for (int i = 0; i < sqlparser.sqlstatements.size(); i++) {
413                        analyzeStmt(sqlparser.sqlstatements.get(i));
414                }
415
416                showResult();
417                return ret;
418        }
419
420        void showResult() {
421                String str = "";
422
423                for (int i = 0; i < total_tables; i++) {
424                        for (int j = 0; j < 5; j++) {
425                                str = str + "\t\t\t\t" + tables[i].statetments[j] + "(" + tableEffected.stmtstr[j] + ")";
426                        }
427                        System.out.println(tables[i].tablename.toString() + str);
428                        str = "";
429                }
430
431        }
432
433        protected void analyzeStmt(TCustomSqlStatement stmt) {
434                for (int i = 0; i < stmt.tables.size(); i++) {
435                        if (stmt.tables.getTable(i).isBaseTable()) {
436                                if ((stmt.dbvendor == EDbVendor.dbvmssql)
437                                                && ((stmt.tables.getTable(i).getFullName().equalsIgnoreCase("deleted"))
438                                                                || (stmt.tables.getTable(i).getFullName().equalsIgnoreCase("inserted")))) {
439                                        continue;
440                                }
441
442                                switch (stmt.sqlstatementtype) {
443                                case sstselect:
444                                        addTable(stmt.tables.getTable(i).getTableName(), tableEffected.select);
445                                        break;
446                                case sstcreatetable:
447                                        addTable(stmt.tables.getTable(i).getTableName(), tableEffected.createtable);
448                                        break;
449                                case sstdelete:
450                                        if (i == 0) {
451                                                addTable(stmt.tables.getTable(i).getTableName(), tableEffected.delete);
452                                        } else {
453                                                addTable(stmt.tables.getTable(i).getTableName(), tableEffected.select);
454                                        }
455                                        break;
456                                case sstinsert:
457                                        addTable(stmt.tables.getTable(i).getTableName(), tableEffected.insert);
458                                        break;
459                                case sstupdate:
460                                        if (i == 0) {
461                                                addTable(stmt.tables.getTable(i).getTableName(), tableEffected.update);
462                                        } else {
463                                                addTable(stmt.tables.getTable(i).getTableName(), tableEffected.select);
464                                        }
465                                        break;
466                                default:
467                                        System.out.println(stmt.sqlstatementtype.toString()
468                                                        + " was not supported in current version, this version able to get table information from select/create table/delete/insert/update");
469                                        break;
470                                }
471
472                        }
473                        // System.out.println(stmt.tables.getTable(i).getFullName());
474                }
475
476                for (int i = 0; i < stmt.getStatements().size(); i++) {
477                        analyzeStmt(stmt.getStatements().get(i));
478                }
479        }
480
481        void addTable(TObjectName tablename, int kind) {
482                // check is this table already in tables
483                boolean isFound = false;
484
485                for (int i = 0; i < total_tables; i++) {
486                        if (tables[i].tablename.toString().compareToIgnoreCase(tablename.toString()) == 0) {
487                                tables[i].statetments[kind]++;
488                                isFound = true;
489                                break;
490                        }
491                }
492
493                if (!isFound) {
494                        tables[total_tables] = new tableEffected();
495                        tables[total_tables].tablename = tablename;
496                        tables[total_tables].statetments[kind]++;
497                        total_tables++;
498                }
499
500        }
501}
502
503class TtextVisitor extends TParseTreeVisitor {
504        void show(TCustomSqlStatement stmt) {
505                System.out.println("sql type: " + stmt.sqlstatementtype);
506                // System.out.println("sql text: "+stmt.toString());
507        }
508
509        void showNode(TParseTreeNode node) {
510                System.out.println("node type: " + node.getNodeType());
511        }
512
513        public void preVisit(TSelectSqlStatement stmt) {
514                show(stmt);
515        }
516
517        public void postVisit(TStatementList node) {
518                System.out.println("stmt list: " + node.size());
519        }
520
521        public void postVisit(TCommonBlock node) {
522                show(node);
523        }
524
525        public void postVisit(TExceptionClause node) {
526                showNode(node);
527        }
528
529        public void postVisit(TExceptionHandler node) {
530                showNode(node);
531        }
532
533        public void postVisit(TCreateSequenceStmt node) {
534                show(node);
535        }
536
537        public void postVisit(TAssignStmt node) {
538                show(node);
539        }
540
541        public void postVisit(TBasicStmt node) {
542                show(node);
543        }
544
545        public void postVisit(TCaseStmt node) {
546                show(node);
547        }
548
549        public void postVisit(TCloseStmt node) {
550                show(node);
551        }
552
553        public void postVisit(TPlsqlCreateFunction node) {
554                show(node);
555        }
556
557        public void postVisit(TPlsqlCreatePackage node) {
558                show(node);
559        }
560
561        public void postVisit(TPlsqlCreateProcedure node) {
562                show(node);
563        }
564
565        public void postVisit(TPlsqlCreateTrigger node) {
566                show(node);
567        }
568
569        public void postVisit(TPlsqlCreateType node) {
570                show(node);
571        }
572
573        public void postVisit(TPlsqlCreateType_Placeholder node) {
574                show(node);
575        }
576
577        public void postVisit(TPlsqlCreateTypeBody node) {
578                show(node);
579        }
580
581        public void visit(TCursorDeclStmt node) {
582                show(node);
583        }
584
585        public void visit(TPlsqlDummyStmt node) {
586                show(node);
587        }
588
589        public void visit(TElsifStmt node) {
590                show(node);
591        }
592
593        public void visit(TExecImmeStmt node) {
594                show(node);
595        }
596
597        public void visit(TExitStmt node) {
598                show(node);
599        }
600
601        public void visit(TFetchStmt node) {
602                show(node);
603        }
604
605        public void visit(TPlsqlForallStmt node) {
606                show(node);
607        }
608
609        public void visit(TPlsqlGotoStmt node) {
610                show(node);
611        }
612
613        public void visit(TIfStmt node) {
614                show(node);
615        }
616
617        public void visit(TLoopStmt node) {
618                show(node);
619        }
620
621        public void visit(TPlsqlNullStmt node) {
622                show(node);
623        }
624
625        public void visit(TOpenforStmt node) {
626                show(node);
627        }
628
629        public void visit(TOpenStmt node) {
630                show(node);
631        }
632
633        public void visit(TPlsqlPipeRowStmt node) {
634                show(node);
635        }
636
637        public void visit(TPlsqlPragmaDeclStmt node) {
638                show(node);
639        }
640
641        public void visit(TPlsqlProcedureSpecStmt node) {
642                show(node);
643        }
644
645        public void visit(TRaiseStmt node) {
646                show(node);
647        }
648
649        public void visit(TPlsqlRecordTypeDefStmt node) {
650                show(node);
651        }
652
653        public void visit(TReturnStmt node) {
654                show(node);
655        }
656
657        public void visit(TPlsqlSqlStmt node) {
658                show(node);
659        }
660
661        public void visit(TPlsqlSubProgram node) {
662                show(node);
663        }
664
665        public void visit(TPlsqlTableTypeDefStmt node) {
666                show(node);
667        }
668
669        public void visit(TVarDeclStmt node) {
670                show(node);
671        }
672
673        public void visit(TPlsqlVarrayTypeDefStmt node) {
674                show(node);
675        }
676
677        public void visit(TSqlplusCmdStatement node) {
678                show(node);
679        }
680
681}
682
683
684public class demo {
685
686        // public static YYTrec yyt[] = {new YYTrec("1".toCharArray(),1)};
687
688        static String getQueryFromFile(String filename) {
689
690                File file = new File(filename);
691                StringBuffer contents = new StringBuffer();
692                BufferedReader reader = null;
693
694                try {
695                        reader = new BufferedReader(new FileReader(file));
696                        String text = null;
697
698                        // repeat until all lines is read
699                        while ((text = reader.readLine()) != null) {
700                                contents.append(text).append(System.getProperty("line.separator"));
701                        }
702                } catch (FileNotFoundException e) {
703                        e.printStackTrace();
704                } catch (IOException e) {
705                        e.printStackTrace();
706                } finally {
707                        try {
708                                if (reader != null) {
709                                        reader.close();
710                                }
711                        } catch (IOException e) {
712                                e.printStackTrace();
713                        }
714                }
715
716                // show file contents here
717                return contents.toString();
718
719        }
720
721        public static void writeToFile(String outContent, String outfile,String charset) throws IOException {
722                Writer out = new BufferedWriter(new OutputStreamWriter(
723                                new FileOutputStream(outfile), charset));
724                try {
725                        out.write(outContent);
726                } finally {
727                        out.close();
728                }
729        }
730        public static void readfile1(String filename,String charset) {
731                FileInputStream streamFromSqlFile = null;
732                InputStreamReader sqlStreamReader = null;
733                BufferedReader finputstream = null;
734                StringBuilder s = new StringBuilder(80);
735                int c;
736
737                //String charset = Charset.defaultCharset().name();//"UTF-8";
738                //System.out.println(charset);
739       // String charset = "gb2312";//"gb2312" ""UTF-8";
740
741                //System.out.println(Charset.defaultCharset().name());
742                try {
743                        streamFromSqlFile =   new FileInputStream(filename);
744                        sqlStreamReader = new InputStreamReader(streamFromSqlFile,charset);
745                        finputstream =  new BufferedReader(sqlStreamReader);
746
747                        while ( (c = finputstream.read()) != -1){
748                                //System.out.println(String.format("0x%08X", c)+", "+(char)c);
749                                if (c == 0xA0){
750                                //      System.out.println("Find "+String.format("0x%08X", c));
751                                }
752                                s.append((char)c);
753                                //parseIntToHex(c);
754                                //String s1 = new String( intToByteArray(c) , Charset.forName(charset));
755                                System.out.println("\\u"+Integer.toHexString(c).toUpperCase()+", integer="+c);
756
757                                char[] unicodeChar = Character.toChars(c);
758                                if (c > 255){
759                                        System.out.println(new String(unicodeChar));
760                                }
761
762                                //System.out.println(s1);
763                                //s.append(s1);
764
765                        }
766                        //System.out.println( TBaseType.toHex(s.toString(),charset));
767                        System.out.println( "\n"+s.toString());
768
769
770                        writeToFile(s.toString(),"c:\\prg\\tmp\\demo.out.txt", charset);
771
772                }catch(FileNotFoundException e){
773
774                } catch (UnsupportedEncodingException e) {
775                        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
776                } catch (IOException e) {
777                        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
778                }
779        }
780
781        public static void readbigfile(String filename) {
782                try {
783
784                        FileInputStream fstream = new FileInputStream(filename);
785                        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
786
787                        String strLine;
788                        int lineNo = 0;
789                        try {
790                                while ((strLine = br.readLine()) != null) {
791                                        // Print the content on the console
792                                        System.out.println(strLine);
793                                        if (lineNo++ > 1000)
794                                                break;
795                                }
796                                br.close();
797                        } catch (IOException o) {
798                                o.printStackTrace();
799                        }
800                } catch (FileNotFoundException e) {
801                        e.printStackTrace(); // To change body of catch statement use File |
802                                                                        // Settings | File Templates.
803                }
804        }
805
806        enum Tax {
807                        one(1),two(2), three(3);
808                private final int value;
809                private Tax(int value) {
810                        this.value = value;
811                }
812
813                public int getValue() {
814                        return value;
815                }
816        };
817
818        public static void parseIntToHex(int value){
819                // turn int into 4 bytes
820                byte byte0 = (byte)(value & 0xF);
821                byte byte1 = (byte)((value >> 4) & 0xF);
822                byte byte2 = (byte)((value >> 8) & 0xF);
823                byte byte3 = (byte)((value >> 12) & 0xF);
824
825                System.out.println(String.format("%01X%01X%01X%01X ", byte3, byte2, byte1, byte0));
826//              System.out.println(String.format("%01X ", byte1));
827//              System.out.println(String.format("%01X ", byte2));
828//              System.out.println(String.format("%01X ", byte3));
829        }
830
831        public static byte[] intToByteArray(int num){
832                byte[] intBytes = new byte[4];
833                intBytes[0] = (byte) (num >>> 24);
834                intBytes[1] = (byte) (num >>> 16);
835                intBytes[2] = (byte) (num >>> 8);
836                intBytes[3] = (byte) num;
837
838//              intBytes[3] = (byte)(num & 0xF);
839//              intBytes[2] = (byte)((num >> 4) & 0xF);
840//              intBytes[1] = (byte)((num >> 8) & 0xF);
841//              intBytes[0] = (byte)((num >> 12) & 0xF);
842
843                return intBytes;
844        }
845
846
847
848        public static void main(String args[]) throws IOException {
849                // Handle compareResolvers command
850                if (args.length > 0 && "compareResolvers".equalsIgnoreCase(args[0])) {
851                        String[] subArgs = new String[args.length - 1];
852                        System.arraycopy(args, 1, subArgs, 0, args.length - 1);
853                        runCompareResolvers(subArgs);
854                        return;
855                }
856
857                long t;
858                String sqlfile = "c:/prg/tmp/demo.sql";
859                String outfile = "c:/prg/tmp/demo.out.txt";
860                // int i;
861                t = System.currentTimeMillis();
862                //parseIntToHex(0x1A2B);
863                // readfile1(sqlfile,"UTF-8"); //"gb2312";//"gb2312" ""UTF-8";
864
865
866                // TGetTableColumn getTableColumn = new
867                // TGetTableColumn(EDbVendor.dbvmysql);
868                // getTableColumn.listStarColumn = true;
869                // getTableColumn.showTreeStructure = true;
870                // getTableColumn.runFile(sqlfile);
871
872                // getObject go = new getObject(EDbVendor.dbvmssql);
873                // go.showModeFile = "c:/prg/tmp/demo.sql";
874                // go.run(getObject.showMode);
875
876                // readbigfile("d:/tmp/all_requests_uniq_cleared.dat");
877                // StringBuffer literalbuf = new StringBuffer(1024);
878                //
879                // literalbuf.append("q'<'So,' she said, 'It's finished.'>'");
880                //
881                /*
882                 * TJoinList jl = new TJoinList(); if (jl instanceof TJoinList){
883                 * System.out.println("TJoinList"); } if (jl instanceof
884                 * TParseTreeNodeList){ System.out.println("TParseTreeNodeList"); } if
885                 * (jl instanceof TParseTreeNode){ System.out.println("TParseTreeNode");
886                 * }
887                 */
888
889                // TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvoracle);
890                // OnlySql o = new OnlySql("sql");
891                // getrawsqlstatements(EDbVendor.dbvmysql,"D:/prg/gsqlparser/Test\\TestCases\\undertest\\mysql/rawsqlstatements.sql");
892                // String[] desiredTables =
893                // {"CDS_H_KONTOKORRENT","CDS_H_KUNDEN_OBJEKT","CDS_H_ZINSEN","CDS_VERARBEITUNG","cds_vw_prm_waehrung_transl","CDS.CDS_APP"};
894
895                // go.showModeFile =
896                // "D:/prg/gsqlparser/Test/TestCases/java/oracle/dbobject/createpackagebody.sql";
897                // go.showModeFile =
898                // "D:/prg/gsqlparser/Test/TestCases/fetchdbobject/mssql/java/while1.sql";
899                // go.run(getObject.compareMode);
900
901                // mysqlPerformanceText();
902
903                // parseallfiles();
904
905
906                 //listSupportedSQLs(EDbVendor.dbvsparksql,true);
907
908                // TBaseType.c_createTableStrictParsing = true;
909
910                //EDbVendor dbVendor = EDbVendor.dbvpostgresql;
911                String logfile = "23T14_02";
912                //extractSQL("f:\\tmp\\syngenta\\useractivitylog_2021-11-23\\1\\useractivitylog_2021-11-"+logfile);
913                // extractSQLFromDir("f:\\tmp\\syngenta\\redshift-logs\\2021-12-09\\");
914//              try {
915//                      sleep(10000);
916//              } catch (InterruptedException e) {
917//                      e.printStackTrace();
918//              }
919
920                //parseInt(1234);
921                //testToScript();
922
923                // sqlfile =  "c:\\tmp\\1002\\sql_1108.sql"; //"c:\\prg\\tmp\\demo.sql";
924                sqlfile = "c:\\prg\\tmp\\demo.sql";
925
926                 //TBaseType.DUMP_RESOLVER_LOG_TO_CONSOLE = true;
927
928                // tokenizeSqltext(EDbVendor.dbvdb2,"c:/prg/tmp/demo.sql");
929                // tokenizeSqltext(EDbVendor.dbvhive,"c:/prg/tmp/demo.sql");
930                // tokenizeSqltext(EDbVendor.dbvmssql,"c:/prg/tmp/demo.sql");
931
932                //  getrawsqlstatements(EDbVendor.dbvmssql,sqlfile,false);
933
934                //  TStatementList statements = parse(EDbVendor.dbvsnowflake, sqlfile, false);
935
936                 //   testSelectStarColumn1Direct();
937             compareResolvers(EDbVendor.dbvbigquery, sqlfile);
938
939        //         toScript(EDbVendor.dbvoracle,sqlfile);
940
941//              String [] dbs = EDbVendor.getAllVendorAliases(true);
942//              System.out.println(dbs.length+":"+ String.join(", ", dbs));
943
944                // parsefiles(EDbVendor.dbvpostgresql, "g:\\tmp\\sql\\");
945
946                //testVariableSubstitution();
947
948                // System.out.println(TLexerAnsi.getKeywordType("WORK"));
949
950
951//              testSQLEnv();
952
953//              if (TBaseType.logSize() > 0){
954//                      TBaseType.log("Above logs is from sql file: "+sqlfile,TLog.DEBUG);
955//                      TBaseType.dumpLogsToFile("c:\\prg\\tmp\\column_reslover_debug.log");
956//                      TBaseType.clearLogs();
957//              }
958
959        //       getrawsqlstatements(EDbVendor.dbvteradata,sqlfile);
960        //       tokenizeSqltext(EDbVendor.dbvpostgresql,sqlfile);
961
962
963                //  tokenizeSqltext(EDbVendor.dbvnetezza,"c:/prg/tmp/demo.sql");
964                // asCanonical(EDbVendor.dbvsnowflake, sqlfile);
965
966                // getrawsqlstatements(EDbVendor.dbvgreenplum,sqlfile);
967                //tokenizeSqltext(EDbVendor.dbvredshift,"c:/prg/tmp/demo.sql");
968
969                // evaluate(EDbVendor.dbvpostgresql,sqlfile);
970
971
972                //String fmt = String.format("Hello %s", "World");
973                //String fmt = String.format("Testing %s, %s, %s, %%", "one", "two", "three");
974                //String fmt = String.format("INSERT INTO \"%s\" VALUES('%s')", "Foo bar", "O\\'Reilly");
975                //String fmt = String.format("'|%10s|","foo");
976        //      System.out.println(fmt);
977
978//               readfile1("f:\\tmp\\alexsolutions\\breaking_sql.sql");
979
980        //      tokenizeSqltext(EDbVendor.dbvhive,sqlfile);
981
982//               EDbVendor[] dbs = EDbVendor.values();
983//               int l = dbs.length;
984//               EDbVendor oracle = EDbVendor.dbvoracle;
985//               int[] aaa = {
986//                               1,2,3
987//
988//
989//                      };
990//               System.out.println( aaa[oracle.ordinal()] );
991
992
993//               if (statements != null){
994//                       TCompiler compiler  = new TCompiler();
995//                       compiler.compile(statements,true,false);
996//               }
997
998
999                // TBaseType.db_version_num = 12;
1000                // parse(EDbVendor.dbvdb2,"C:\\Users\\Tako\\Downloads\\craddl.ddl");
1001
1002
1003                // iterateStatements(EDbVendor.dbvoracle,"D:/prg/tmp/demo.sql") ;
1004                // parseAndFetch(EDbVendor.dbvoracle,"D:/prg/tmp/demo.sql") ;
1005
1006                // crud go = new crud(EDbVendor.dbvmssql,"D:/prg/tmp/demo.sql");
1007                // go.run();
1008                // textVisitor(EDbVendor.dbvoracle,"D:/prg/tmp/demo.sql");
1009                // modifySql("D:/prg/tmp/demo.sql");
1010
1011                // selecttoString();
1012                // teradataTest();
1013                // parseSQLInputStream(EDbVendor.dbvoracle,sqlfile);
1014                // parseSQLInputStream(EDbVendor.dbvoracle,"c:\\prg\\gsqlparser\\Test\\TestCases\\unicode\\chinese_utf16_be_with_bom.sql");
1015                // System.out.println("[Dim].[vwBorrower]".replaceAll("\\[","").replaceAll("]",""));
1016                // System.out.println("\"Dim\".\"vwBorrower\"".replaceAll("\"",""));
1017                // System.out.println(compareIdentifier(EDbVendor.dbvdb2,"\"DIM.VWBORROWEr\"","Dim.vwBorrower"));
1018                // getQuotedString("'select $1 + $2;'");
1019                // teradataCmds();
1020                // mssqlTest();
1021
1022                // int iterateNum = 50;
1023                // TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvoracle);
1024                // perfTest(sqlparser,sqlfile,iterateNum);
1025                // System.out.println("Time Escaped: " + (System.currentTimeMillis() -
1026                // t)+", each sql: "+(System.currentTimeMillis() - t)/iterateNum);
1027                // listSupportedSQLs(EDbVendor.dbvteradata,true);
1028                // example1();
1029                // printMemoryUsage();
1030                // System.out.println("Default Charset=" + Charset.defaultCharset());
1031                // System.out.println(keywordChecker.getAvailableDbVersions(EDbVendor.dbvimpala));
1032                // System.out.println(keywordChecker.isKeyword( "identifier",
1033                // EDbVendor.dbvimpala,
1034                // "6.1",
1035                // true ));
1036
1037                // generateKeywordList("c:\\prg\\tmp\\keyword.txt","c:\\prg\\tmp\\out.txt");
1038                // example1();
1039                // testSQLPlus();
1040                // testUseFile(sqlfile);
1041                // System.in.read();
1042                // testReplace();
1043                // testSQLEnv();
1044                // functionLoader.getFunctionList(EDbVendor.dbvhana);
1045                // functionChecker.getBuiltInFunctionList(EDbVendor.dbvhana,"7");
1046                // System.out.println(functionChecker.isBuiltInFunction("CURRENT_TIMESTAMP",EDbVendor.dbvmysql,"6.0"));
1047                // System.out.println("where recording_date >
1048                // ''1/1/2015'".replaceAll("''","'"));
1049
1050                // parseJsonFile(EDbVendor.dbvmssql,"c:\\prg\\tmp\\DBexport20191119.txt")
1051                // ;
1052                // testSetNodeText();
1053                //String[] a = "a*".split("[.]");
1054                // System.out.println(a.length);
1055                // System.out.println(TSQLEnv.getSchemaName("table"));
1056
1057
1058                // TParseTreeNode.doubleLinkedTokenListToString = true;
1059                // testSetNodeText();
1060                // textIterator(EDbVendor.dbvmssql,"c:/prg/tmp/demo.sql");
1061                // testModifySQL();
1062                // testExprRemoveResultOrderBy();
1063                // showNodeOfToken();
1064                // testRenameTable();
1065                // testRemoveTableList();
1066
1067
1068                System.out.println("Time Escaped: " + (System.currentTimeMillis() - t) + ", version:" + TBaseType.versionid);
1069
1070        }
1071
1072
1073        public static void  testVariableSubstitution(){
1074                String sql = "SELECT * FROM DWH_META_${DWHENV}.LOADPROTOCOL_GTMP WHERE env = ${ENV}";
1075
1076                // Define variables and their values
1077                Map<String, String> variables = new HashMap<>();
1078                variables.put("DWHENV", "PROD");
1079                variables.put("ENV", "production");
1080
1081                // Perform substitution
1082                String result = VariableSubstitutor.substituteVariables(sql, variables);
1083                System.out.println(result);
1084        }
1085
1086        public static void testSQLEnv(){
1087                String declareSQL = "DECLARE\n" +
1088                                "\tz_empid employees.employee_id%TYPE;\n" +
1089                                "\tz_depid employees.department_id%TYPE;\n" +
1090                                "\tz_firstname employees.first_name%TYPE;\n" +
1091                                "\tz_lastname employees.last_name%TYPE;\n" +
1092                                "\n" +
1093                                "\tCURSOR cur_stclerk IS\n" +
1094                                "\t\tSELECT employee_id,\n" +
1095                                "\t\tdepartment_id,\n" +
1096                                "\t\tfirst_name,\n" +
1097                                "\t\tlast_name\n" +
1098                                "\t\tFROM employees\n" +
1099                                "\t\tWHERE job_id = 'ST_CLERK';\n" +
1100                                "BEGIN\n" +
1101                                "OPEN cur_stclerk;\n" +
1102                                "LOOP\n" +
1103                                "\tFETCH cur_stclerk INTO z_empid,z_depid,z_firstname,\n" +
1104                                "\tz_lastname;\n" +
1105                                "\tEXIT WHEN cur_stclerk%NOTFOUND;\n" +
1106                                "\n" +
1107                                "\tINSERT INTO emp_temp\n" +
1108                                "\t(employee_id,\n" +
1109                                "\tdepartment_id,\n" +
1110                                "\tjob_id)\n" +
1111                                "\tVALUES (z_empid,\n" +
1112                                "\tz_depid,\n" +
1113                                "\t'ST_CLERK');\n" +
1114                                "\n" +
1115                                "\tINSERT INTO emp_detls_temp\n" +
1116                                "\t(employee_id,\n" +
1117                                "\tempname)\n" +
1118                                "\tVALUES (z_empid,\n" +
1119                                "\tz_firstname\n" +
1120                                "\t|| ' '\n" +
1121                                "\t|| z_lastname);\n" +
1122                                "END LOOP;\n" +
1123                                "\n" +
1124                                "CLOSE cur_stclerk;\n" +
1125                                "COMMIT;\n" +
1126                                "END;";
1127                TGSqlParser sqlParser = new TGSqlParser(EDbVendor.dbvoracle);
1128
1129                String tableName = "ot.persons";
1130                int maxTables = 1000*10;
1131                for(int i=0;i<maxTables;i++){
1132                        sqlParser.sqltext = "CREATE TABLE "+ tableName+i+"(\n" +
1133                                        "    person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,\n" +
1134                                        "    first_name VARCHAR2(50) NOT NULL,\n" +
1135                                        "    last_name VARCHAR2(50) NOT NULL,\n" +
1136                                        "    PRIMARY KEY(person_id)\n" +
1137                                        ");";
1138                        sqlParser.parse();
1139                        if (i%1000 == 0) System.out.printf("\r%d",i) ;
1140                }
1141
1142                System.out.println();
1143                sqlParser.sqltext = declareSQL;
1144                sqlParser.parse();
1145
1146                System.out.println("Number of tables in SQL Env: "+sqlParser.getSqlEnv().getNumberOfTables());
1147        }
1148
1149        public static String extractSQL(String filePath) throws IOException {
1150                if (null == filePath || "".equals(filePath)) {
1151                        throw new RuntimeException("文件地址不能为空");
1152                }
1153
1154                File file = new File(filePath);
1155                if (!file.exists()) {
1156                        throw new RuntimeException("文件不存在");
1157                }
1158
1159                //read
1160                BufferedReader reader = new BufferedReader(new FileReader(file));
1161                StringBuilder sql = new StringBuilder();
1162                StringBuilder sqls = new StringBuilder();
1163                String temp;
1164                boolean flag = false;
1165                while ((temp = reader.readLine()) != null) {
1166                        String line = new String(temp.getBytes(), StandardCharsets.UTF_8);
1167                        if (line.contains("LOG")) {
1168                                if (flag) {
1169                                        String sqlStr = sql.toString().trim();
1170                                        if ("".equals(sqlStr) || sqlStr.startsWith("fetch")) {
1171                                                continue;
1172                                        }
1173                                        String[] sqlStrs = sqlStr.split("\n");
1174                                        String endSql = sqlStrs[sqlStrs.length - 1];
1175
1176                                        String[] vars = endSql.split("--");
1177                                        if (vars.length > 1) {
1178                                                String var1 = vars[0];
1179                                                String trim = var1.trim();
1180                                                if (!trim.endsWith("\"") && !trim.endsWith(";")) {
1181                                                        if (sqlStrs.length > 1) {
1182                                                                if (!sqlStrs[sqlStrs.length - 2].trim().endsWith(";")) {
1183                                                                        sqlStr += "\n;\n";
1184                                                                }
1185                                                        } else {
1186                                                                sqlStr += "\n;\n";
1187                                                        }
1188                                                }
1189                                        } else if (!sqlStr.endsWith(";")) {
1190                                                sqlStr += ";";
1191                                        }
1192                                        sqls.append(sqlStr).append("\n").append("\n");
1193                                        sql = new StringBuilder();
1194                                        flag = false;
1195                                }
1196                                String[] logs = line.split("LOG:");
1197                                if (logs.length > 1 && !logs[1].trim().startsWith("fetch")) {
1198                                        sql.append(logs[1]).append("\n");
1199                                        flag = true;
1200                                }
1201                        } else if (flag && !line.trim().startsWith("fetch")) {
1202                                sql.append(line).append("\n");
1203                        }
1204                }
1205                reader.close();
1206
1207                //write
1208                String fileName = file.getName();
1209                String resultFilePath;
1210                if (fileName.contains(".")) {
1211                        resultFilePath = file.getPath().split(fileName)[0] + fileName.substring(0, fileName.lastIndexOf(".")) + "_sql.sql";
1212                } else {
1213                        resultFilePath = file.getPath() + "_sql.sql";
1214                }
1215                BufferedWriter writer = new BufferedWriter(new FileWriter(resultFilePath));
1216                writer.write(sqls.toString());
1217                writer.flush();
1218                writer.close();
1219
1220                return resultFilePath;
1221        }
1222
1223        // static public void testTraceColumn(){
1224        // String sqltext = "SELECT a.deptno \"Department\", \n" +
1225        // " a.num_emp/b.total_count \"Employees\", \n" +
1226        // " a.sal_sum/b.total_sal \"Salary\"\n" +
1227        // " FROM\n" +
1228        // "(SELECT deptno, COUNT(*) num_emp, SUM(SAL) sal_sum\n" +
1229        // " FROM scott.emp\n" +
1230        // " GROUP BY deptno) a,\n" +
1231        // "(SELECT COUNT(*) total_count, SUM(sal) total_sal\n" +
1232        // " FROM scott.emp) b";
1233        //
1234        // //System.out.println(sqltext);
1235        // TTraceColumn traceColumn = new TTraceColumn(EDbVendor.dbvoracle);
1236        // traceColumn.runText(sqltext);
1237        // //System.out.print(traceColumn.getInfos().toString().trim());
1238        // String actualStr = traceColumn.getInfos().toString().trim();
1239        // }
1240
1241        static public void testRemoveTableList() {
1242                TGSqlParser parser = new TGSqlParser(EDbVendor.dbvoracle);
1243                parser.sqltext = "select f1,f2,f3\n" + "from table1 pal, table2 pualr, table3 pu\n"
1244                                + "WHERE  pal.application_location_id in (1,2,3,4)";
1245                int ret = parser.parse();
1246
1247                TSelectSqlStatement selectSqlStatement = (TSelectSqlStatement) parser.sqlstatements.get(0);
1248                selectSqlStatement.getResultColumnList().removeItem(0);
1249                selectSqlStatement.getJoins().removeItem(2);
1250                selectSqlStatement.getJoins().removeItem(0);
1251                selectSqlStatement.getWhereClause().getCondition().getRightOperand().getExprList().removeItem(1);
1252                System.out.println(selectSqlStatement.toString());
1253
1254        }
1255
1256        static public void testRenameTable() {
1257                TGSqlParser lcparser = new TGSqlParser(EDbVendor.dbvnetezza);
1258                lcparser.sqltext = "select * from \"emp\"";
1259                lcparser.parse();
1260                TSelectSqlStatement select = (TSelectSqlStatement) lcparser.sqlstatements.get(0);
1261                TTable table = select.tables.getTable(0);
1262                table.getTableName().setString(table.getTableName().toString().substring(1, 4));
1263                System.out.println(select.toString());
1264        }
1265
1266        static public void testModifyExpr() {
1267                TGSqlParser parser = new TGSqlParser(EDbVendor.dbvoracle);
1268                parser.sqltext = "SELECT SUM (d.amt) \n" + "FROM   summit.cntrb_detail d \n"
1269                                + "WHERE d.cntrb_date1 >= '$From_Date$' \n" + "AND d.cntrb_date2 <= '$Thru_Date$' \n"
1270                                + "GROUP  BY d.id;";
1271                parser.parse();
1272
1273                TSelectSqlStatement select = (TSelectSqlStatement) parser.sqlstatements.get(0);
1274                TExpression expression = select.getWhereClause().getCondition();
1275                // expression.getLeftOperand().remove2();
1276                // expression.getRightOperand().remove2();
1277                // System.out.println(expression.toString());
1278                // System.out.println(select.getWhereClause().toString());
1279                TExpression expr_From_Date = expression.getLeftOperand().getRightOperand();
1280                TExpression expr_cntrb_date1 = expression.getLeftOperand().getLeftOperand();
1281                TExpression expr_Thru_Date = expression.getRightOperand().getRightOperand();
1282                TExpression expr_cntrb_date2 = expression.getRightOperand().getLeftOperand();
1283                // System.out.println("From_Date:"+expr_From_Date);
1284                // System.out.println("cntrb_date1:"+expr_cntrb_date1);
1285                // System.out.println("Thru_Date:"+expr_Thru_Date);
1286                // System.out.println("cntrb_date2:"+expr_cntrb_date2);
1287
1288                // printNodeEndWithThisToken(expression.getLeftOperand().getEndToken());
1289
1290                expr_cntrb_date1.removeMe();
1291                expr_From_Date.removeMe();
1292                expr_cntrb_date2.removeMe();
1293                expr_Thru_Date.removeMe();
1294                // removeExprFromParent(expr_cntrb_date1);
1295                // removeExprFromParent(expr_From_Date);
1296                // removeExprFromParent(expr_cntrb_date2);
1297                // removeExprFromParent(expr_Thru_Date);
1298
1299                // removeExprFromParent(expr_cntrb_date2);
1300                // removeExprFromParent(expr_Thru_Date);
1301                // removeExprFromParent(expr_cntrb_date1);
1302                // removeExprFromParent(expr_From_Date);
1303
1304                // System.out.println(expr_cntrb_date1.toString());
1305                // System.out.println(expression.getLeftOperand().toString());
1306                // System.out.println(expression.getLeftOperand().getEndToken().toString());
1307
1308                // System.out.println("\n"+expression.toString());
1309                if (select.getWhereClause().getCondition().getNodeStatus() == ENodeStatus.nsRemoved) {
1310                        select.setWhereClause(null);
1311                }
1312                System.out.println("\n" + select.toString());
1313        }
1314
1315        static void testModifyExpr3() {
1316                String sql = "SELECT SUM (d.amt)\n" + "FROM summit.cntrb_detail d\n"
1317                                + "WHERE ((d.fund_coll_attrb IN ( '$Institute$' )\n" + "AND d.fund_acct IN ( '$Fund$' )\n"
1318                                + "AND d.cntrb_date >= '$From_Date$'\n" + "AND d.cntrb_date <= '$Thru_Date$'))\n" + "GROUP BY d.id;";
1319                TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmssql);
1320                sqlparser.setSqltext(sql);
1321                sqlparser.parse();
1322                TSelectSqlStatement stmt = (TSelectSqlStatement) sqlparser.getSqlstatements().get(0);
1323                TExpression whereExpression = stmt.getWhereClause().getCondition();
1324
1325                whereExpression.postOrderTraverse(new IExpressionVisitor() {
1326                        public boolean exprVisit(TParseTreeNode pnode, boolean pIsLeafNode) {
1327                                TExpression expression = (TExpression) pnode;
1328                                if (expression.getNodeStatus() != ENodeStatus.nsRemoved && expression != null
1329                                                && expression.getLeftOperand() == null && expression.getRightOperand() == null
1330                                                && expression.toString().indexOf("$") != -1) {
1331                                        // System.out.println(expression.toString());
1332                                        expression.removeMe();
1333                                } else {
1334                                        if (expression.getExpressionType() == EExpressionType.simple_comparison_t
1335                                                        || expression.getExpressionType() == EExpressionType.in_t) {
1336                                                if (expression.getRightOperand() == null && expression.getLeftOperand() != null) {
1337                                                        expression.getLeftOperand().removeMe();
1338                                                }
1339                                                if (expression.getRightOperand() != null && expression.getLeftOperand() == null) {
1340                                                        expression.getRightOperand().removeMe();
1341                                                }
1342                                                if (expression.getLeftOperand() == null && expression.getRightOperand() == null) {
1343                                                        expression.removeMe();
1344                                                }
1345                                        } else if (expression.getExpressionType() == EExpressionType.logical_and_t
1346                                                        || expression.getExpressionType() == EExpressionType.logical_or_t) {
1347                                                if (expression.getLeftOperand() == null && expression.getRightOperand() == null) {
1348                                                        expression.removeMe();
1349                                                }
1350                                        }
1351                                }
1352                                return true;
1353                        }
1354
1355                });
1356
1357                if (stmt.getWhereClause().getCondition().getNodeStatus() == ENodeStatus.nsRemoved) {
1358                        stmt.setWhereClause(null);
1359                }
1360
1361                System.out.println("stmt:\n" + stmt.toString() + "\nend");
1362
1363        }
1364
1365        static void testModifyExpr2() {
1366                String sql = "SELECT SUM (d.amt)\r\n" + "FROM summit.cntrb_detail d\r\n"
1367                                + "WHERE d.fund_coll_attrb IN ( '$Institute$' )\r\n" + "AND d.fund_acct IN ( '$Fund$' )\r\n"
1368                                + "AND d.cntrb_date >= '$From_Date$'\r\n" + "AND d.cntrb_date <= '$Thru_Date$'\r\n" + "GROUP BY d.id;";
1369                TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmssql);
1370                sqlparser.setSqltext(sql);
1371                sqlparser.parse();
1372                TSelectSqlStatement stmt = (TSelectSqlStatement) sqlparser.getSqlstatements().get(0);
1373                TExpression whereExpression = stmt.getWhereClause().getCondition();
1374
1375                whereExpression.postOrderTraverse(new IExpressionVisitor() {
1376                        public boolean exprVisit(TParseTreeNode pnode, boolean pIsLeafNode) {
1377                                TExpression expression = (TExpression) pnode;
1378                                if (expression.getNodeStatus() != ENodeStatus.nsRemoved && expression != null
1379                                                && expression.getLeftOperand() == null && expression.getRightOperand() == null
1380                                                && expression.toString().indexOf("$") != -1) {
1381                                        // System.out.println(expression.toString());
1382                                        removeExpression(expression);
1383                                } else {
1384                                        if (expression.getExpressionType() == EExpressionType.simple_comparison_t
1385                                                        || expression.getExpressionType() == EExpressionType.in_t) {
1386                                                if (expression.getRightOperand() == null && expression.getLeftOperand() != null) {
1387                                                        removeExpression(expression.getLeftOperand());
1388                                                }
1389                                                if (expression.getRightOperand() != null && expression.getLeftOperand() == null) {
1390                                                        removeExpression(expression.getRightOperand());
1391                                                }
1392                                                if (expression.getLeftOperand() == null && expression.getRightOperand() == null) {
1393                                                        removeExpression(expression);
1394                                                }
1395                                        } else if (expression.getExpressionType() == EExpressionType.logical_and_t
1396                                                        || expression.getExpressionType() == EExpressionType.logical_or_t) {
1397                                                if (expression.getLeftOperand() == null && expression.getRightOperand() == null) {
1398                                                        removeExpression(expression);
1399                                                }
1400                                        }
1401                                }
1402                                return true;
1403                        }
1404
1405                        private void removeExpression(TExpression expression) {
1406                                if (expression.getParentExpr() != null) {
1407                                        TExpression parentExpr = expression.getParentExpr();
1408                                        if (parentExpr.getLeftOperand() == expression) {
1409                                                parentExpr.setLeftOperand(null);
1410                                        }
1411                                        if (parentExpr.getRightOperand() == expression) {
1412                                                parentExpr.setRightOperand(null);
1413                                        }
1414                                }
1415                        }
1416                });
1417
1418                if (stmt.getWhereClause().getCondition().getNodeStatus() == ENodeStatus.nsRemoved) {
1419                        stmt.setWhereClause(null);
1420                }
1421
1422                System.out.println(stmt.toString().trim());
1423        }
1424
1425        static public void printNodeStartWithThisToken(TSourceToken st) {
1426                System.out.println("\nNode start from this token: " + st.toString());
1427                for (int i = 0; i < st.getNodesStartFromThisToken().size(); i++) {
1428                        TParseTreeNode node = st.getNodesStartFromThisToken().get(i);
1429                        System.out.println(i + ": Node type:" + node.getClass().getName() + ", \tNode text:" + node.toString());
1430                }
1431        }
1432
1433        static public void printNodeEndWithThisToken(TSourceToken st) {
1434                System.out.println("\nNode end with this token: " + st.toString());
1435                for (int i = 0; i < st.getNodesEndWithThisToken().size(); i++) {
1436                        TParseTreeNode node = st.getNodesEndWithThisToken().get(i);
1437                        System.out.println(i + ": Node type:" + node.getClass().getName() + ", \tNode text:" + node.toString());
1438                }
1439        }
1440
1441        static public void showNodeOfToken() {
1442                TGSqlParser parser = new TGSqlParser(EDbVendor.dbvoracle);
1443
1444                parser.sqltext = "SELECT emp_id,salary+100 FROM emp";
1445                parser.parse();
1446                while (parser.sourcetokenlist.hasNext()) {
1447                        TSourceToken st = parser.sourcetokenlist.next();
1448                        if (st.toString().equalsIgnoreCase("emp")) {
1449                                printNodeStartWithThisToken(st);
1450                                printNodeEndWithThisToken(st);
1451                        }
1452                }
1453        }
1454
1455        static public void testModifySQL() {
1456                String sql = "SELECT * FROM TABLE_X";
1457
1458                TGSqlParser parser = new TGSqlParser(EDbVendor.dbvoracle);
1459                parser.sqltext = sql;
1460                parser.parse();
1461                TSelectSqlStatement select = (TSelectSqlStatement) parser.sqlstatements.get(0);
1462
1463                TWhereClause whereClause = new TWhereClause("where f > 0");
1464                // whereClause.setText("where f > 0");
1465                select.setAnchorNode(select.joins);
1466                select.setWhereClause(whereClause);
1467
1468                System.out.println(select.toString());
1469                // assertTrue(select.toString().equalsIgnoreCase("SELECT * FROM TABLE_X
1470                // order by b asc,c desc"));
1471
1472        }
1473
1474        static public void testSetNodeText() {
1475                // TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvimpala);
1476                // sqlparser.sqltext = "create table if not exists campaign_1 ( id int,
1477                // name string )";
1478                // int ret = sqlparser.parse();
1479                // TCustomSqlStatement stmt = sqlparser.sqlstatements.get(0);
1480                // TTable table = stmt.tables.getTable(0);
1481                // table.setString("prefix_." + table.toString() + " " +
1482                // table.getAliasName());
1483                // System.out.println(table.toString());
1484
1485                TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmssql);
1486                sqlparser.sqltext = "SELECT *\n" + "FROM scott.employee\n" + "WHERE fx(e.job_id) = 1";
1487                sqlparser.parse();
1488                TSelectSqlStatement select = (TSelectSqlStatement) sqlparser.sqlstatements.get(0);
1489                // Iterator<TSourceToken> iterator = select.iterator();
1490                while (select.hasNext()) {
1491                        System.out.print(select.next().toString());
1492                }
1493                System.out.println("\n");
1494                TWhereClause whereClause = select.getWhereClause();
1495                TExpression condition = whereClause.getCondition();
1496                TFunctionCall f = condition.getLeftOperand().getFunctionCall();
1497                // for(int
1498                // i=0;i<f.getStartToken().getNodesStartFromThisToken().size();i++){
1499                // TParseTreeNode node =
1500                // f.getStartToken().getNodesStartFromThisToken().getElement(i);
1501                // System.out.println(node.toString()+", "+node.getClass().getName());
1502                // if (node == f){
1503                // System.out.println("\t this is me");
1504                // }
1505                // }
1506                // f.setString("gx(e.job)");
1507                // System.out.println(f.toString());
1508                // System.out.println(condition.toString());
1509                whereClause.getCondition().setString("e.salary > 1000");
1510                // whereClause.setString("where a+b>c");
1511                System.out.println(select.toString());
1512        }
1513
1514        static public void parseJsonFile(EDbVendor db, String jsonfile) {
1515                // int ret = 0;
1516                // TGSqlParser sqlparser = new TGSqlParser(db);
1517                // TSQLServerEnv tsqlServerEnv = new TSQLServerEnv();
1518                // // tsqlServerEnv.setEnableGetMetadataFromDDL(false);
1519                // sqlparser.setSqlEnv(tsqlServerEnv);
1520                // //sqlparser.sqlfilename = file;
1521                // String targetDir = "c:\\prg\\tmp\\sql\\";
1522                //
1523                // String json = SQLUtil.getFileContent(jsonfile);
1524                //
1525                // if (json != null && json.trim().startsWith("{")) {
1526                // JSONObject queryObject = JSON.parseObject(json);
1527                // JSONArray querys = queryObject.getJSONArray("queries");
1528                // if (querys != null) {
1529                // for (int i = 0; i < querys.size(); i++) {
1530                // String database = querys.getJSONObject(i).getString("database");
1531                // String schema = querys.getJSONObject(i).getString("schema");
1532                // tsqlServerEnv.setDefaultCatalogName(database);
1533                // tsqlServerEnv.setDefaultSchemaName(schema);
1534                // String sql = querys.getJSONObject(i).getString("sourceCode");
1535                // sqlparser.sqltext = sql;
1536                // sqlparser.parse();
1537                // SQLUtil.writeFileContent(new File(targetDir, (i + 1) + ".sql"), sql);
1538                // }
1539                // }
1540                // } else {
1541                // System.out.println(jsonfile + " is not a valid json file.");
1542                // }
1543                //
1544                // System.out.println(tsqlServerEnv.toString());
1545        }
1546
1547        static public String qualifySchemaObjectName(String schemaObjectName) {
1548                String lcResult = schemaObjectName;
1549                String[] names = schemaObjectName.split("[.]");
1550                if (names.length == 1) {
1551                        lcResult = ".." + names[0];
1552                } else if (names.length == 2) {
1553                        lcResult = "." + names[0] + "." + names[1];
1554                } else if (names.length == 3) {
1555                        lcResult = names[0] + "." + names[1] + "." + names[2];
1556                }
1557                return lcResult;
1558        }
1559
1560        static boolean compareIdentifier(EDbVendor dbVendor, String source, String target) {
1561                return compareIdentifier(dbVendor, EDbObjectType.table, source, target);
1562        }
1563
1564        static boolean compareIdentifier(EDbVendor dbVendor, EDbObjectType objectType, String source, String target) {
1565                boolean ret = false;
1566                String normalTarget, normalSource;
1567
1568                switch (dbVendor) {
1569                case dbvbigquery:
1570                        if (target.indexOf('`') >= 0) {
1571                                normalTarget = target.replaceAll("[`]", "");
1572                        } else {
1573                                if (objectType == EDbObjectType.table) { // table name is case
1574                                                                                                                        // sensitive
1575                                        normalTarget = target;
1576                                } else {
1577                                        normalTarget = target.toUpperCase();
1578                                }
1579                        }
1580
1581                        if (source.indexOf('`') >= 0) {
1582                                normalSource = source.replaceAll("[`]", "");
1583                        } else {
1584                                if (objectType == EDbObjectType.table) {
1585                                        normalSource = source;
1586                                } else {
1587                                        normalSource = source.toUpperCase();
1588                                }
1589                        }
1590
1591                        ret = normalTarget.compareTo(normalSource) == 0;
1592                        break;
1593                case dbvcouchbase:
1594                case dbvhive:
1595                case dbvimpala:
1596                        if (target.indexOf('`') >= 0) {
1597                                normalTarget = target.replaceAll("[`]", "");
1598                        } else {
1599                                normalTarget = target;
1600                        }
1601
1602                        if (source.indexOf('`') >= 0) {
1603                                normalSource = source.replaceAll("[`]", "");
1604                        } else {
1605                                normalSource = source;
1606                        }
1607
1608                        ret = normalTarget.equalsIgnoreCase(normalSource);
1609                        break;
1610                case dbvmysql:
1611                        if (target.indexOf('`') >= 0) {
1612                                normalTarget = target.replaceAll("[`]", "");
1613                        } else {
1614                                normalTarget = target;
1615                        }
1616
1617                        if (source.indexOf('`') >= 0) {
1618                                normalSource = source.replaceAll("[`]", "");
1619                        } else {
1620                                normalSource = source;
1621                        }
1622
1623                        ret = normalTarget.equalsIgnoreCase(normalSource);
1624                        break;
1625                case dbvdax:
1626                        if (target.indexOf('\'') >= 0) {
1627                                normalTarget = target.replaceAll("[']", "");
1628                        } else {
1629                                normalTarget = target;
1630                        }
1631
1632                        if (source.indexOf('\'') >= 0) {
1633                                normalSource = source.replaceAll("[']", "");
1634                        } else {
1635                                normalSource = source;
1636                        }
1637
1638                        ret = normalTarget.equalsIgnoreCase(normalSource);
1639                        break;
1640                case dbvdb2:
1641                case dbvhana:
1642                case dbvinformix:
1643                case dbvnetezza:
1644                case dbvoracle:
1645                case dbvredshift:
1646                case dbvsnowflake:
1647                case dbvsybase:
1648                case dbvteradata:
1649                case dbvvertica:
1650                        if (target.indexOf('"') >= 0) {
1651                                normalTarget = target.replaceAll("\"", "");
1652                        } else {
1653                                normalTarget = target.toUpperCase();
1654                        }
1655
1656                        if (source.indexOf('"') >= 0) {
1657                                normalSource = source.replaceAll("\"", "");
1658                        } else {
1659                                normalSource = source.toUpperCase();
1660                        }
1661                        ret = normalTarget.compareTo(normalSource) == 0;
1662
1663                        break;
1664                case dbvpostgresql:
1665                        if (target.indexOf('"') >= 0) {
1666                                normalTarget = target.replaceAll("\"", "");
1667                        } else {
1668                                normalTarget = target.toLowerCase();
1669                        }
1670
1671                        if (source.indexOf('"') >= 0) {
1672                                normalSource = source.replaceAll("\"", "");
1673                        } else {
1674                                normalSource = source.toLowerCase();
1675                        }
1676                        ret = normalTarget.compareTo(normalSource) == 0;
1677
1678                        break;
1679                case dbvmssql:
1680                        if (target.indexOf('"') >= 0) {
1681                                normalTarget = target.replaceAll("\"", "");
1682                        } else if (target.indexOf("[") >= 0) {
1683                                normalTarget = target.replaceAll("\\[", "").replaceAll("]", "");
1684                        } else {
1685                                normalTarget = target;
1686                        }
1687
1688                        if (source.indexOf('"') >= 0) {
1689                                normalSource = source.replaceAll("\"", "");
1690                        } else if (source.indexOf("[") >= 0) {
1691                                normalSource = source.replaceAll("\\[", "").replaceAll("]", "");
1692                        } else {
1693                                normalSource = source;
1694                        }
1695
1696                        // depends on the sql server case sensitive setting, need to add an
1697                        // option to control the comparision
1698                        ret = normalTarget.equalsIgnoreCase(normalSource);
1699
1700                        break;
1701                default:
1702                        if (target.indexOf('"') >= 0) {
1703                                normalTarget = target.replaceAll("\"", "");
1704                        } else {
1705                                normalTarget = target.toUpperCase();
1706                        }
1707
1708                        if (source.indexOf('"') >= 0) {
1709                                normalSource = source.replaceAll("\"", "");
1710                        } else {
1711                                normalSource = source.toUpperCase();
1712                        }
1713                        ret = normalTarget.compareTo(normalSource) == 0;
1714
1715                        break;
1716                }
1717
1718                return ret;
1719        }
1720
1721        static void testUseFile(String sqlfilename) {
1722                ProcessFile processFile = new ProcessFile(sqlfilename);
1723                processFile.openIt();
1724                processFile.closeIt();
1725                // FileInputStream streamFromSqlFile = null;
1726                // try{
1727                //
1728                // streamFromSqlFile = new FileInputStream(sqlfilename);
1729                // InputStreamReader isr = new
1730                // InputStreamReader(streamFromSqlFile,Charset.defaultCharset().name());
1731                //
1732                // BufferedReader finputstream = new BufferedReader(isr);
1733                //
1734                // String thisLine;
1735                // while ((thisLine = finputstream.readLine()) != null) {
1736                // System.out.println(thisLine);
1737                // }
1738                // // streamFromSqlFile.close();
1739                // }catch (Exception e){
1740                // System.out.println(e.toString());
1741                // }finally {
1742                // }
1743                //
1744                // System.out.println("Process: "+sqlfilename);
1745
1746        }
1747
1748        static void testReplace() {
1749                String s = "DECLARE inString alias for $1; begin return ''bob''; end;";
1750                System.out.print(s.replaceAll("''", "'"));
1751        }
1752
1753        static void testSQLPlus() {
1754                System.out.println(TSqlplusCmdStatement.searchCmd("rem"));
1755                System.out.println(TSqlplusCmdStatement.searchCmd("rem", null));
1756        }
1757
1758        static void printMemoryUsage() {
1759                Runtime runtime = Runtime.getRuntime();
1760
1761                NumberFormat format = NumberFormat.getInstance();
1762
1763                StringBuilder sb = new StringBuilder();
1764                long maxMemory = runtime.maxMemory();
1765                long allocatedMemory = runtime.totalMemory();
1766                long freeMemory = runtime.freeMemory();
1767
1768                sb.append("free memory: " + format.format(freeMemory / (1024 * 1024)) + "\n");
1769                sb.append("allocated memory: " + format.format(allocatedMemory / (1024 * 1024)) + "\n");
1770                sb.append("used memory: " + format.format((allocatedMemory - freeMemory) / (1024 * 1024)) + "\n");
1771                sb.append("max memory: " + format.format(maxMemory / (1024 * 1024)) + "\n");
1772                sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / (1024 * 1024))
1773                                + "\n");
1774                System.out.println(sb.toString());
1775        }
1776
1777        static void example1() {
1778                String query = "CREATE TABLE \"QATEST\".\"BANK_TRANSACTION4\"\n" +
1779
1780                                "   (    \"BANK_TRANSACTION_ID\" NUMBER(11,0) NOT NULL ENABLE NOVALIDATE,\n" +
1781
1782                                "        \"TRANSACTION_ID\" VARCHAR2(800),\n" +
1783
1784                                "        \"TRANSACTION_AMOUNT\" NUMBER(15,4),"
1785
1786                                + "CONSTRAINT \"BANK_TRANS_PK3\" PRIMARY KEY (\"BANK_TRANSACTION_ID\"))";
1787
1788                TGSqlParser sqlparser;
1789
1790                sqlparser = new TGSqlParser(EDbVendor.dbvoracle);
1791
1792                sqlparser.sqltext = query;
1793                System.out.println(query);
1794
1795                if (sqlparser.parse() == 0)
1796
1797                {
1798
1799                        System.out.println("parsing successfull");
1800
1801                        TCustomSqlStatement stmt = sqlparser.sqlstatements.get(0);
1802
1803                        TCreateTableSqlStatement createTable = (TCreateTableSqlStatement) stmt;
1804
1805                        System.out.println(createTable.getTableConstraints().getConstraint(0)); // prints
1806                                                                                                                                                                        // CONSTRAINT
1807                                                                                                                                                                        // "BANK_TRANS_PK3"
1808                                                                                                                                                                        // PRIMARY
1809                                                                                                                                                                        // KEY
1810                                                                                                                                                                        // ("BANK_TRANSACTION_ID")
1811
1812                        TConstraint constraint = createTable.getTableConstraints().getConstraint(0);
1813
1814                        System.out.println(constraint.getConstraint_type()); // prints
1815                                                                                                                                        // primary_key
1816
1817                        TPTNodeList<TColumnWithSortOrder> constrColList = constraint.getColumnList(); // returns
1818                                                                                                                                                                                        // null
1819                                                                                                                                                                                        // but
1820                                                                                                                                                                                        // expected
1821                                                                                                                                                                                        // is
1822                                                                                                                                                                                        // "BANK_TRANSACTION_ID"
1823
1824                        for (int constrColIndex = 0; constrColIndex < constrColList.size(); constrColIndex++)
1825
1826                        {
1827
1828                                String colName = constrColList.getElement(constrColIndex).getColumnName().toString();
1829
1830                                System.out.println(colName); // prints null but expected is
1831                                                                                                // "BANK_TRANSACTION_ID"
1832
1833                        }
1834
1835                }
1836        }
1837
1838//      static void listSupportedSQLs(EDbVendor dbVendor, boolean html) {
1839//              TSqlCmds sqlCmds = new TSqlCmds();
1840//              TSqlCmds.TSqlCmdList cmdList = sqlCmds.getSqlCmdList(dbVendor);
1841//              TGSqlParser sqlParser = new TGSqlParser(dbVendor);
1842//              boolean isSupported = false;
1843//              int supportSqlNum = 0, skippedNum = 0, processedNum = 0, errorNum = 0;
1844//              ArrayList<ESqlStatementType> sqltypes = new ArrayList<ESqlStatementType>();
1845//
1846//              String summaryStr = "<p>Level 1 statements: %d, Level 2 statements: %d, generated by %s</p>\n";
1847//
1848//              String rowStr = " <tr height=21 style='height:15.75pt'>\n"
1849//                              + "  <td height=21 class=xl2427189 style='height:15.75pt;border-top:none'>%s</td>\n"
1850//                              + "  <td class=xl2427189 style='border-top:none;border-left:none'>%s</td>\n"
1851//                              + "  <td class=xl2527189 style='border-top:none;border-left:none'>%s</td>\n" + " </tr>";
1852//
1853//              StringBuilder sb = new StringBuilder();
1854//
1855//              for (int i = 0; i < cmdList.size(); i++) {
1856//                      isSupported = false;
1857//                      TSqlCmds.TSqlCmd sqlCmd = (TSqlCmds.TSqlCmd) cmdList.get(i);
1858//                      if (sqltypes.contains(sqlCmd.sqlstatementtype)) {
1859//                              skippedNum++;
1860//                              continue;
1861//                      }
1862//                      processedNum++;
1863//                      sqltypes.add(sqlCmd.sqlstatementtype);
1864//                      if (sqlCmd.toString().length() > 0) {
1865//                              sqlParser.sqltext = sqlCmd.toString();
1866//                              sqlParser.tokenizeSqltext();
1867//                              TCustomSqlStatement stmt = sqlCmds.issql(sqlParser.getSourcetokenlist().get(0), dbVendor,
1868//                                              EFindSqlStateType.stnormal, null);
1869//                              if (stmt != null) {
1870//                                      isSupported = !((stmt instanceof TUnknownSqlStatement) || (stmt instanceof TTeradataNotImplement));
1871//                              }
1872//                              if (isSupported)
1873//                                      supportSqlNum++;
1874//                      }
1875//                      if (!html) {
1876//                              System.out.println(processedNum + "\t" + isSupported + "\t" + sqlCmd.toString());
1877//                      }
1878//
1879//                      if (sqlCmd.toString().contains("*"))
1880//                              errorNum++;
1881//
1882//                      // System.out.println(String.format(rowStr,sqlCmd.toString(),"Y",isSupported?"Y":"
1883//                      // "));
1884//                      sb.append(String.format(rowStr, sqlCmd.toString(), "Y", isSupported ? "Y" : " "));
1885//              }
1886//
1887//              sb.insert(0, String.format(summaryStr, processedNum, supportSqlNum,
1888//                              TBaseType.version + ',' + new SimpleDateFormat("yyyy/MM/dd").format(Calendar.getInstance().getTime())));
1889//              if (html)
1890//                      System.out.println(sb.toString());
1891//              System.out.println("total:" + cmdList.size() + ",processed:" + processedNum + ",skipped:" + skippedNum
1892//                              + ",error:" + errorNum + ",supported:" + supportSqlNum);
1893//
1894//      }
1895
1896        static void perfTest(TGSqlParser sqlparser, String filename, int iterateNum) {
1897                sqlparser.sqlfilename = filename;
1898                for (int i = 0; i < iterateNum; i++) {
1899                        sqlparser.parse();
1900                }
1901        }
1902
1903        static void mssqlTest() {
1904                TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmssql);
1905                sqlparser.sqltext = "CREATE PROCEDURE [HumanResources].[uspUpdateEmployeeHireInfo]\n"
1906                                + "@BusinessEntityID [int]," + "@JobTitle [nvarchar](50)," + "@HireDate [datetime],"
1907                                + "@RateChangeDate [datetime]," + "@Rate [money], " + "@PayFrequency [tinyint],"
1908                                + "@CurrentFlag [dbo].[Flag]" + "WITH EXECUTE AS CALLER\n" + "AS\n" + "\n" + "BEGIN\n" + "\n" +
1909                                /*
1910                                 * "INSERT INTO PRODUCT_DESCRIPTIONS VALUES ( PROD_ID , LANGID,  TR_NAME,   TR_DESC   );\n"
1911                                 * + "SELECT ename, empno FROM emp;\n"+ "COMMIT;\n"+
1912                                 */
1913                                "SET NOCOUNT ON;\n" + "BEGIN TRY\n" + "BEGIN TRANSACTION;\n" + "UPDATE [HumanResources].[Employee] \n"
1914                                + "SET [JobTitle] = @JobTitle\n" + ",[HireDate] = @HireDate\n" + ",[CurrentFlag] = @CurrentFlag\n"
1915                                + "WHERE [BusinessEntityID] = @BusinessEntityID;\n"
1916                                + "INSERT INTO [HumanResources].[EmployeePayHistory] \n" + "([BusinessEntityID]" + ",[RateChangeDate]"
1917                                + ",[Rate]" + ",[PayFrequency])\n"
1918                                + "VALUES (@BusinessEntityID, @RateChangeDate, @Rate, @PayFrequency);\n" + "COMMIT TRANSACTION;\n"
1919                                + "END TRY\n" + "BEGIN CATCH\n" + "-- Rollback any active or uncommittable transactions before\n"
1920                                + "-- inserting information in the ErrorLog\n" + "IF @@TRANCOUNT > 0\n" + "BEGIN\n"
1921                                + "ROLLBACK TRANSACTION;\n" + "END\n" + "EXECUTE [dbo].[uspLogError];\n" + "END CATCH;\n" + "END;";
1922
1923                int ret = sqlparser.parse();
1924                if (ret != 0) {
1925                        System.out.println(sqlparser.getErrormessage());
1926                        return;
1927                }
1928
1929                TCustomSqlStatement sql = sqlparser.sqlstatements.get(0);
1930                System.out.println("SQL Statement: " + sql.sqlstatementtype);
1931
1932                TMssqlCreateProcedure procedure = (TMssqlCreateProcedure) sql;
1933
1934                // TPlsqlCreateProcedure procedure = (TPlsqlCreateProcedure)sql;
1935                System.out.println("Procedure name: " + procedure.getProcedureName().toString());
1936                if (procedure.getParameterDeclarations() != null) {
1937                        System.out.println("Parameters:" + procedure.getParameterDeclarations());
1938
1939                        TParameterDeclaration param = null;
1940                        for (int i = 0; i < procedure.getParameterDeclarations().size(); i++) {
1941                                param = procedure.getParameterDeclarations().getParameterDeclarationItem(i);
1942                                System.out.println("\tName:" + param.getParameterName().toString());
1943                                System.out.println("\tDatatype:" + param.getDataType().toString());
1944                                System.out.println("\tIN/OUT:" + param.getMode());
1945                        }
1946                }
1947
1948                // Aniket
1949                if (procedure.getDeclareStatements().size() != 0) {
1950                        TStatementList list = procedure.getDeclareStatements();
1951                        System.out.println("List : " + list);
1952                        System.out.println("List: " + list.size());
1953                        /*
1954                         * for(int k=0; k<iList.size();k++){
1955                         *
1956                         * }
1957                         */
1958                        for (int k = 0; k < list.size(); k++) {
1959                                // Written by Aniket to parse the cursor and usage of various
1960                                // methods of it
1961                                if (list.get(k).toString().toUpperCase().contains("CURSOR")) {
1962                                        TCursorDeclStmt cur = (TCursorDeclStmt) list.get(k);
1963                                        System.out.println("Cursor Type : " + cur.sqlstatementtype);
1964                                        System.out.println("Cursor name is : " + cur.getCursorName());
1965                                        System.out.println("Cursor Subquery : " + cur.getSubquery());
1966                                        //
1967                                        /*
1968                                         * cursorName=list.get(k).toString();
1969                                         * System.out.println("Cursor Name: "+cursorName);
1970                                         */
1971                                }
1972                        }
1973
1974                        TStatementList declareStatements = procedure.getDeclareStatements();
1975                        System.out.println("declare statements: " + declareStatements.size());
1976                        TCustomSqlStatement declareStatement = null;
1977                        TVarDeclStmt variableDelcare = null;
1978                        for (int i = 0; i < declareStatements.size(); i++) {
1979                                declareStatement = declareStatements.get(i);
1980                                System.out.println("SQL Statement: " + declareStatement.sqlstatementtype);
1981                                if (declareStatement.toString().toLowerCase().contains("cursor")) {
1982                                        TCursorDeclStmt cur = (TCursorDeclStmt) declareStatement;
1983                                        System.out.println("Cursor Name:" + cur.getCursorName());
1984                                } else {
1985                                        variableDelcare = (TVarDeclStmt) declareStatement;
1986
1987                                        switch (variableDelcare.getWhatDeclared()) {
1988                                        case TVarDeclStmt.whatDeclared_variable:
1989                                                System.out.println("\tVariable Name:" + variableDelcare.getElementName().toString());
1990                                                System.out.println("\tVariable Datatype:" + variableDelcare.getDataType().toString());
1991                                                break;
1992                                        case TVarDeclStmt.whatDeclared_constant:
1993                                                break;
1994                                        case TVarDeclStmt.whatDeclared_exception:
1995                                                System.out.println("\tException:" + variableDelcare.getElementName().toString());
1996                                                break;
1997                                        case TVarDeclStmt.whatDeclared_subtype:
1998                                                break;
1999                                        case TVarDeclStmt.whatDeclared_pragma_autonomous_transaction:
2000                                                break;
2001                                        case TVarDeclStmt.whatDeclared_pragma_exception_init:
2002                                                break;
2003                                        case TVarDeclStmt.whatDeclared_pragma_serially_reusable:
2004                                                break;
2005                                        case TVarDeclStmt.whatDeclared_pragma_restrict_references:
2006                                                break;
2007                                        case TVarDeclStmt.whatDeclared_pragma_timestamp:
2008                                                break;
2009                                        }
2010                                }
2011                        }
2012                }
2013
2014                TStatementList bodyStatements1 = procedure.getBodyStatements();
2015                // TUpdateSqlStatement tUpdate =(TUpdateSqlStatement)
2016                // bodyStatements1.get(0);
2017                for (int j = 0; j <= bodyStatements1.size(); j++) {
2018                        System.out.println("SQL Body Statement" + bodyStatements1.getNodeType());
2019                }
2020                System.out.println("body statements: " + bodyStatements1.size());
2021                System.out.println("body statements: " + bodyStatements1);
2022                if (procedure.getBodyStatements().size() != 0) {
2023                        TStatementList bodyStatements = procedure.getBodyStatements();//
2024                        System.out.println("body statements: " + bodyStatements.size());
2025                        TCustomSqlStatement bodyStatement = null;
2026                        for (int i = 0; i < bodyStatements.size(); i++) {
2027                                bodyStatement = bodyStatements.get(i);
2028                                System.out.println("SQL Statement: " + bodyStatement.sqlstatementtype);
2029                                System.out.println("Body Statement : " + bodyStatement);
2030                                switch (bodyStatement.sqlstatementtype) {
2031                                case sstmssqlblock:
2032                                        TMssqlBlock block = (TMssqlBlock) bodyStatement;
2033                                        processBlock(block, 0);
2034                                        break;
2035                                case sst_assignstmt:
2036                                        TAssignStmt assign = (TAssignStmt) bodyStatement;
2037                                        System.out.println("left: " + assign.getLeft().toString());
2038                                        System.out.println("right: " + assign.getExpression().toString());
2039                                        break;
2040                                case sst_ifstmt:
2041                                        TIfStmt ifstmt = (TIfStmt) bodyStatement;
2042                                        System.out.println("condition: " + ifstmt.getCondition().toString());
2043
2044                                        if (ifstmt.getThenStatements().size() > 0) {
2045                                                System.out.println("then statement:");
2046                                                for (int j = 0; j < ifstmt.getThenStatements().size(); j++) {
2047                                                        System.out
2048                                                                        .println("\tStatement type: " + ifstmt.getThenStatements().get(j).sqlstatementtype);
2049                                                        System.out.println("\tStatement text: " + ifstmt.getThenStatements().get(j).toString());
2050                                                }
2051                                        }
2052
2053                                        if (ifstmt.getElseifStatements().size() > 0) {
2054                                                System.out.println("else if statement:");
2055                                                for (int j = 0; j < ifstmt.getElseifStatements().size(); j++) {
2056                                                        System.out.println(
2057                                                                        "\tStatement type: " + ifstmt.getElseifStatements().get(j).sqlstatementtype);
2058                                                        System.out.println("\tStatement text: " + ifstmt.getElseifStatements().get(j).toString());
2059                                                }
2060                                        }
2061
2062                                        if (ifstmt.getElseStatements().size() > 0) {
2063                                                System.out.println("else statement:");
2064                                                for (int j = 0; j < ifstmt.getElseStatements().size(); j++) {
2065                                                        System.out
2066                                                                        .println("\tStatement type: " + ifstmt.getElseStatements().get(j).sqlstatementtype);
2067                                                        System.out.println("\tStatement text: " + ifstmt.getElseStatements().get(j).toString());
2068                                                }
2069                                        }
2070
2071                                        break;
2072                                default:
2073                                        break;
2074                                }
2075                        }
2076                }
2077
2078        }
2079
2080        static void processBlock(TMssqlBlock block, int level) {
2081                for (int k = 0; k < block.getBodyStatements().size(); k++) {
2082                        for (int i = 0; i < level; i++)
2083                                System.out.print("\t");
2084                        System.out.println("Inside block: " + block.getBodyStatements().get(k).sqlstatementtype);
2085                        if (block.getBodyStatements().get(k).sqlstatementtype == ESqlStatementType.sstmssqlblock) {
2086                                processBlock((TMssqlBlock) block.getBodyStatements().get(k), ++level);
2087                        }
2088                }
2089        }
2090
2091        static void iterateStatements(EDbVendor db, String file) {
2092                TGSqlParser parser = new TGSqlParser(db);
2093                parser.sqlfilename = file;
2094                int iret = parser.parse();
2095                if (iret != 0) {
2096                        System.out.println(parser.getErrormessage());
2097                        return;
2098                }
2099
2100                TStatementList stmtList = parser.sqlstatements;
2101                System.out.println(stmtList.size());
2102                System.out.println(stmtList.hasNext());
2103                // TCustomSqlStatement topLevelStmt = stmtList.next();
2104                Iterator<TCustomSqlStatement> iterator = stmtList.iterator();
2105                while (iterator.hasNext()) {
2106                        System.out.println(iterator.next().toString());
2107                }
2108
2109                // System.out.println(topLevelStmt.toString());
2110                //
2111                // for (int i = 0; i < parser.sqlstatements.size(); i++) {
2112                // TCustomSqlStatement s = parser.sqlstatements.get(i);
2113                // //System.out.println(s.toString());
2114                // }
2115        }
2116
2117        static void parseSQLInputStream(EDbVendor db, String file) {
2118                TGSqlParser sqlparser = new TGSqlParser(db);
2119
2120                // sqlparser.sqlfilename = file;
2121                String fullSql = "select * from foo";
2122
2123                try {
2124                        FileInputStream inputStream = new FileInputStream(file);
2125
2126                        sqlparser.setSqlInputStream(inputStream);
2127
2128                        int ret = sqlparser.parse();
2129
2130                        if (ret == 0) {
2131                                System.out.println("parse ok, statements:" + sqlparser.sqlstatements.size());
2132                        } else {
2133                                System.out.println("error:" + sqlparser.getErrormessage());
2134                        }
2135
2136                } catch (FileNotFoundException e) {
2137                        e.printStackTrace(); // To change body of catch statement use File |
2138                                                                        // Settings | File Templates.
2139                }
2140
2141        }
2142
2143        static void mysqlPerformanceText() {
2144                int num = 1000;
2145                long t;
2146                t = System.currentTimeMillis();
2147
2148                for (int i = 0; i < num; i++) {
2149                        TGSqlParser sqlParser = new TGSqlParser(EDbVendor.dbvmysql);
2150                        sqlParser.sqltext = "select * from foo" + i;
2151                        int ret = sqlParser.parse();
2152                }
2153
2154                System.out.println("Time Escaped: " + (System.currentTimeMillis() - t) + " for " + num);
2155
2156        }
2157
2158        static void teradataTest() {
2159                TGSqlParser sqlParser = new TGSqlParser(EDbVendor.dbvteradata);
2160
2161                String sql = "select TIMESTAMP '1999-07-01 15:00:00-08:00'\n" + "from dual;";
2162
2163                sqlParser.sqltext = sql;
2164
2165                int ret = sqlParser.parse();
2166                if (ret != 0) {
2167                        System.out.println(sqlParser.getErrormessage());
2168                        return;
2169                }
2170
2171                TSelectSqlStatement select = (TSelectSqlStatement) sqlParser.sqlstatements.get(0);
2172                TResultColumnList columnList = select.getResultColumnList();
2173                TResultColumn column = null;
2174                for (int i = 0; i < columnList.size(); i++) {
2175                        column = columnList.getResultColumn(i);
2176
2177                        System.out.println(column.toString());
2178                }
2179
2180        }
2181
2182        static void selecttoString() {
2183                TGSqlParser sqlParser = new TGSqlParser(EDbVendor.dbvoracle);
2184
2185                String sql = "SELECT R.* FROM REGIONS R";
2186
2187                sqlParser.sqltext = sql;
2188
2189                sqlParser.parse();
2190
2191                TSelectSqlStatement select = (TSelectSqlStatement) sqlParser.sqlstatements.get(0);
2192                System.out.println(select.toString());
2193
2194        }
2195
2196        static void tokenizeSqltext(EDbVendor db, String filename) {
2197                TGSqlParser sqlparser = new TGSqlParser(db);
2198                sqlparser.setSqlCharset("UTF-8");
2199                sqlparser.sqlfilename = filename;
2200                sqlparser.tokenizeSqltext();
2201
2202                for (int i = 0; i < sqlparser.sourcetokenlist.size(); i++) {
2203                        TSourceToken st = sqlparser.sourcetokenlist.get(i);
2204//                      if (st.lineNo < 3704) continue;
2205//                      if (st.lineNo > 3704+200) break;
2206                        System.out.printf("line:%d,Column:%d,%s,type:%s,code:%d, pos in list:%d\n", st.lineNo, st.columnNo,
2207                                        st.tokentype == ETokenType.ttreturn ? "linebreak" : st.toString()
2208                                        // , st.tokentype == ETokenType.ttreturn ? "linebreak" :
2209                                        // TBaseType.toHex(st.toString(),"UTF-8")
2210                                        , st.tokentype, st.tokencode, st.posinlist);
2211                }
2212
2213        }
2214
2215        static void textIterator(EDbVendor db, String filename) {
2216                TGSqlParser sqlparser = new TGSqlParser(db);
2217                sqlparser.sqlfilename = filename;
2218                int ret = sqlparser.parse();
2219                if (ret == 0) {
2220                        for (TCustomSqlStatement sqlStatement : sqlparser.sqlstatements) {
2221                                System.out.println(sqlStatement.sqlstatementtype);
2222                                // while(sqlStatement.hasNext()){
2223                                // //System.out.println(sqlStatement.next().toString());
2224                                // }
2225                                if (sqlStatement.sqlstatementtype == ESqlStatementType.sstselect) {
2226                                        TSelectSqlStatement selectSqlStatement = (TSelectSqlStatement) sqlStatement;
2227                                        for (TJoin join : sqlStatement.joins) {
2228                                                // System.out.println(join.getKind());
2229                                        }
2230                                        for (TTable table : sqlStatement.tables) {
2231                                                System.out.println(table.getTableType());
2232                                        }
2233                                        while (sqlStatement.tables.hasNext()) {
2234                                                System.out.println(sqlStatement.tables.next().toString());
2235                                        }
2236                                }
2237                        }
2238                } else {
2239                        System.out.println(sqlparser.getErrormessage());
2240                }
2241
2242        }
2243
2244        static void textVisitor(EDbVendor db, String filename) {
2245                TGSqlParser sqlparser = new TGSqlParser(db);
2246                sqlparser.sqlfilename = filename;
2247                int ret = sqlparser.parse();
2248                if (ret == 0) {
2249                        TtextVisitor tv = new TtextVisitor();
2250                        for (int i = 0; i < sqlparser.sqlstatements.size(); i++) {
2251                                sqlparser.sqlstatements.get(i).accept(tv);
2252                        }
2253                } else {
2254                        System.out.println(sqlparser.getErrormessage());
2255                }
2256
2257        }
2258
2259        static void modifySql(String sqlfile) {
2260                TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvoracle);
2261                sqlparser.sqlfilename = sqlfile;
2262                int ret = sqlparser.parse();
2263                if (ret == 0) {
2264                        TCustomSqlStatement s = sqlparser.sqlstatements.get(0);
2265                        TTable t;
2266                        for (int i = 0; i < s.tables.size(); i++) {
2267                                t = s.tables.getTable(i);
2268                                if (t.toString().compareToIgnoreCase("table2") == 0) {
2269                                        for (int j = 0; j < t.getObjectNameReferences().size(); j++) {
2270                                                System.out.println(t.getObjectNameReferences().getObjectName(j).toString());
2271                                        }
2272                                        t.setString("(tableX join tableY using (id)) as table2");
2273                                }
2274                        }
2275                        System.out.println(s.toString());
2276                } else {
2277                        System.out.println(sqlparser.getErrormessage());
2278                }
2279        }
2280
2281        static void parsetext(EDbVendor db, String sql) {
2282                TGSqlParser sqlparser = new TGSqlParser(db);
2283                sqlparser.sqltext = sql;
2284                int ret = sqlparser.parse();
2285                if (ret == 0) {
2286                        System.out.println("Successfully check syntax!");
2287                        /*
2288                         * for(int j=0;j<sqlparser.sourcetokenlist.size();j++){ TSourceToken
2289                         * st = sqlparser.sourcetokenlist.get(j);
2290                         * System.out.println(st.tokentype+" "+st.astext); } for(int i=0;
2291                         * i<sqlparser.sqlstatements.size();i++){ TCustomSqlStatement stmt =
2292                         * sqlparser.sqlstatements.get(i);
2293                         * System.out.println(stmt.sqlstatementtype.toString()); for(int
2294                         * j=0;j<stmt.sourcetokenlist.size();j++){ TSourceToken st =
2295                         * stmt.sourcetokenlist.get(j); System.out.println(st.tokentype); }
2296                         * }
2297                         */
2298                } else {
2299                        System.out.println(sqlparser.getErrormessage());
2300                }
2301
2302        }
2303
2304        static void parseallfiles() {
2305                // parsefiles(EDbVendor.dbvaccess,
2306                // "D:/prg/gsqlparser/Test/TestCases/access");
2307                // parsefiles(EDbVendor.dbvdb2, "D:/prg/gsqlparser/Test/TestCases/db2");
2308                // parsefiles(EDbVendor.dbvmysql,
2309                // "D:/prg/gsqlparser/Test/TestCases/mysql");
2310                // parsefiles(EDbVendor.dbvmssql, "f:\\tmp\\1021\\sql\\");
2311                // parsefiles(EDbVendor.dbvoracle,
2312                // "D:/prg/gsqlparser/Test/TestCases/oracle");
2313        }
2314
2315        // static void toScript2(EDbVendor db, String file) {
2316        // int ret = 0;
2317        // TScriptGenerator scriptGenerator = new TScriptGenerator();
2318        // TGSqlParser sqlparser = new TGSqlParser(db);
2319        //
2320        // System.out.println("Parsing with " + db + " ...");
2321        // sqlparser.sqlfilename = file;
2322        // ret = sqlparser.parse();
2323        //
2324        // for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2325        // System.out.println("sql type: " +
2326        // sqlparser.sqlstatements.get(j).sqlstatementtype + "(" +
2327        // sqlparser.sqlstatements.get(j).getClass().toString() + ")" + ", " +
2328        // sqlparser.sqlstatements.get(j).getStartToken().toString() + "(" +
2329        // sqlparser.sqlstatements.get(j).getStartToken().lineNo + "," +
2330        // sqlparser.sqlstatements.get(j).getStartToken().columnNo + ")");
2331        // System.out.println(
2332        // scriptGenerator.generateScript(sqlparser.sqlstatements.get(j)));
2333        // //System.out.println(sqlparser.sqlstatements.get(j).toScript());
2334        // }
2335        //
2336        // if (ret == 0) {
2337        // System.out.println("sqls: " + sqlparser.sqlstatements.size());
2338        // } else {
2339        // System.out.println("error: " + sqlparser.getErrormessage());
2340        // }
2341        //
2342        // }
2343
2344        static void toScript(EDbVendor db, String file) {
2345                int ret = 0;
2346                TGSqlParser sqlparser = new TGSqlParser(db);
2347                sqlparser.setSqlCharset("UTF-8");
2348
2349                System.out.println("Parsing with " + db + " ...");
2350                sqlparser.sqlfilename = file;
2351                ret = sqlparser.parse();
2352
2353                for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2354                        System.out.println("sql type: " + sqlparser.sqlstatements.get(j).sqlstatementtype + "("
2355                                        + sqlparser.sqlstatements.get(j).getClass().toString() + ")" + ", "
2356                                        + sqlparser.sqlstatements.get(j).getStartToken().toString() + "("
2357                                        + sqlparser.sqlstatements.get(j).getStartToken().lineNo + ","
2358                                        + sqlparser.sqlstatements.get(j).getStartToken().columnNo + ")");
2359
2360                        if (TBaseType.verifyScript(sqlparser.getDbVendor(),sqlparser.sqlstatements.get(j).toString(),sqlparser.sqlstatements.get(j).toScript(),true)){
2361                                System.out.println("toScript() is verified successfully for stmt: "+j);
2362                        }else{
2363                                System.out.println("=========== Below is the result of: toString() ==============");
2364                                System.out.println(sqlparser.sqlstatements.get(j).toString());
2365
2366                                System.out.println("=========== Below is the result of: toScript() ==============");
2367                                System.out.println(sqlparser.sqlstatements.get(j).toScript());
2368
2369                        }
2370
2371                }
2372
2373                if (ret == 0) {
2374                        System.out.println("sqls: " + sqlparser.sqlstatements.size());
2375                } else {
2376                        System.out.println("error: " + sqlparser.getErrormessage());
2377                }
2378
2379        }
2380
2381        static void evaluate(EDbVendor db, String file) {
2382                int ret = 0;
2383                TGSqlParser sqlparser = new TGSqlParser(db);
2384                sqlparser.sqlfilename = file;
2385                ret = sqlparser.parse();
2386
2387                if (ret != 0) {
2388                        System.out.println("error: " + sqlparser.getErrormessage());
2389                        System.out.println("syntax arrays: "+sqlparser.getSyntaxErrors().size());
2390                        return ;
2391                } else {
2392                        System.out.println("sqls: " + sqlparser.sqlstatements.size());
2393                }
2394
2395                TSimpleEvaluationContext context = new TSimpleEvaluationContext();
2396                TAnnotatedTree annotatedTree = new TAnnotatedTree();
2397                annotatedTree.setAst(sqlparser.sqlstatements);
2398
2399                TTypeAndScopeScanner scopeScanner = new TTypeAndScopeScanner(context,annotatedTree);
2400                sqlparser.sqlstatements.acceptChildren(scopeScanner);
2401
2402//              TSqlStringEvaluator evaluator = new TSqlStringEvaluator(context,annotatedTree);
2403//              sqlparser.sqlstatements.acceptChildren(evaluator);
2404
2405                System.out.println(annotatedTree.getScopeTreeString());
2406        }
2407
2408        static TStatementList parse1(EDbVendor db, String file) {
2409                int ret = 0;
2410                TGSqlParser sqlparser = new TGSqlParser(db);
2411                System.out.println("Parsing with " + db + " ...");
2412                sqlparser.sqlfilename = file;
2413                ret = sqlparser.parse();
2414
2415                int totalError = 0;
2416                for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2417
2418                        String syntaxSign = "Success\t";
2419                        if (sqlparser.sqlstatements.get(j).getSyntaxErrors().size() > 0){
2420                                syntaxSign = "Failed\t";
2421                                totalError++;
2422                        }
2423
2424                        System.out.print(syntaxSign+"sql type: " + sqlparser.sqlstatements.get(j).sqlstatementtype + "("
2425                                        + sqlparser.sqlstatements.get(j).getClass().toString() + ")" + ", "
2426                                        + sqlparser.sqlstatements.get(j).getStartToken().toString() + "("
2427                                        + sqlparser.sqlstatements.get(j).getStartToken().lineNo + ","
2428                                        + sqlparser.sqlstatements.get(j).getStartToken().columnNo + ")");
2429
2430
2431                        System.out.print("\n");
2432                        for(int i=0;i<sqlparser.sqlstatements.get(j).getSyntaxHints().size();i++){
2433                                System.out.println( String.format("syntax hint:%s(%d,%d)"
2434                                                ,sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).tokentext
2435                                                ,sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).lineNo
2436                                                ,sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).columnNo)
2437                                                +sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).hint);
2438                        }
2439                }
2440
2441
2442                if (ret == 0) {
2443                        System.out.println("sqls: " + sqlparser.sqlstatements.size());
2444                        return sqlparser.sqlstatements;
2445                } else {
2446                        System.out.println("error: " + sqlparser.getErrormessage());
2447                        System.out.println("syntax arrays: "+sqlparser.getSyntaxErrors().size());
2448                        System.out.println("total errors: "+totalError+"/"+sqlparser.sqlstatements.size());
2449                        return  null;
2450                }
2451
2452        }
2453
2454        static void asCanonical (EDbVendor db, String file) {
2455                int ret = 0;
2456                TGSqlParser sqlparser = new TGSqlParser(db);
2457
2458                System.out.println("Parsing with " + db + " ...");
2459                sqlparser.sqlfilename = file;
2460                TBaseType.as_canonical_f_decrypt_replace_password = true;
2461                ret = sqlparser.parse();
2462
2463
2464                int totalError = 0;
2465                for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2466                        System.out.println(sqlparser.sqlstatements.get(j).asCanonical());
2467                }
2468
2469
2470                if (ret == 0) {
2471                        System.out.println("sqls: " + sqlparser.sqlstatements.size());
2472                        return ;
2473                } else {
2474                        System.out.println("error: " + sqlparser.getErrormessage());
2475                        System.out.println("syntax arrays: "+sqlparser.getSyntaxErrors().size());
2476                        System.out.println("total errors: "+totalError+"/"+sqlparser.sqlstatements.size());
2477                        return ;
2478                }
2479
2480        }
2481
2482        static TStatementList parse(EDbVendor db, String file, boolean showTokens) {
2483                int ret = 0;
2484                TLog.clearLogs();
2485
2486                TGSqlParser sqlparser = new TGSqlParser(db);
2487                sqlparser.setEnableTimeLogging(true);
2488
2489//              sqlparser.setTokenListHandle(new myTokenListHandle());
2490                //sqlparser.setSqlCharset("UTF-8");
2491//              TBaseType.bigquery_legacysql_compatible = true;
2492                //sqlparser.setSqlCharset("GB18030");
2493//              tsqlServerEnv.setEnableGetMetadataFromDDL(true);
2494//              TSQLServerEnv tsqlServerEnv = new TSQLServerEnv();
2495                //sqlparser.setSqlEnv(new THiveEnv());
2496
2497                System.out.println("Parsing with " + db + " ...");
2498                // sqlparser.sqlfilename =
2499                // "D:\\prg\\gsqlparser\\Test\\TestCases\\oracle\\substituation.sql";
2500                // sqlparser.sqlfilename = "D:\\tmp\\addextent.sql";
2501                sqlparser.sqlfilename = file;
2502                ret = sqlparser.parse();
2503
2504//              System.out.println(sqlparser.getTimeStatistics());
2505//              return sqlparser.sqlstatements;
2506
2507
2508                if (showTokens){
2509                        for(int i=0;i<sqlparser.sourcetokenlist.size();i++){
2510                                TSourceToken st = sqlparser.sourcetokenlist.get(i);
2511                                System.out.println(st.tokentype.toString()+
2512                                                +st.tokencode+"("+st.lineNo+","+st.columnNo+ ")"+st.toString()
2513                                                +", type:"+st.tokentype
2514                                                +", status:"+st.tokenstatus
2515                                                +", hashcode:"+st.hashCode());
2516                        }
2517                }
2518
2519
2520                int totalError = 0;
2521                StringBuilder sb = new StringBuilder();
2522                String logInfo;
2523                System.out.println("Total");
2524
2525                for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2526                        TCustomSqlStatement sqlStatement = sqlparser.sqlstatements.get(j);
2527
2528                        String syntaxSign = "Success\t";
2529                        if (sqlStatement.getSyntaxErrors().size() > 0){
2530                                syntaxSign = "Failed\t";
2531                                totalError++;
2532                        }
2533
2534                        logInfo = //String.format(
2535                                        "["+j+"] "+syntaxSign+"sql type: " + sqlStatement.sqlstatementtype + "("
2536                                        + sqlStatement.getClass().toString() + ")" + ", "
2537                                        + sqlStatement.getStartToken().toString() + "("
2538                                        + sqlStatement.getStartToken().lineNo + ","
2539                                        + sqlStatement.getStartToken().columnNo + ")";
2540                                //);
2541
2542                        sb.append(logInfo);
2543
2544                        System.out.println(logInfo);
2545
2546                        System.out.print("\n");
2547                        for(int i=0;i<sqlparser.sqlstatements.get(j).getSyntaxHints().size();i++){
2548
2549                                System.out.println( String.format("syntax hint:%s(%d,%d)"
2550                                                ,sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).tokentext
2551                                                ,sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).lineNo
2552                                                ,sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).columnNo)
2553                                                +sqlparser.sqlstatements.get(j).getSyntaxHints().get(i).hint);
2554                        }
2555
2556                        if (sqlparser.sqlstatements.get(j).getCommentBeforeNode() != null){
2557                        }else{
2558                        }
2559
2560                        // print out all tokens in this statement
2561
2562                }
2563
2564
2565                if (ret == 0) {
2566                        System.out.println("sqls: " + sqlparser.sqlstatements.size());
2567
2568
2569                } else {
2570                        System.out.println("error: " + sqlparser.getErrormessage());
2571                        System.out.println("syntax arrays: "+sqlparser.getSyntaxErrors().size());
2572                        System.out.println("total errors/total sql num: "+totalError+"/"+sqlparser.sqlstatements.size());
2573                        return  null;
2574                }
2575
2576                //TBaseType.dumpLogs();
2577
2578                System.out.println(sqlparser.getTimeStatistics());
2579                return sqlparser.sqlstatements;
2580
2581        }
2582
2583
2584
2585        static void parseAndFetch(EDbVendor db, String file) {
2586                TGSqlParser sqlparser = new TGSqlParser(db);
2587
2588                sqlparser.sqlfilename = file;
2589
2590                int ret = sqlparser.parse(); // ; getrawsqlstatements()
2591
2592                for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2593                        System.out.println("sql type: " + sqlparser.sqlstatements.get(j).sqlstatementtype);
2594                        TCustomSqlStatement st = sqlparser.sqlstatements.get(j);
2595                        analyzeStmt(st, 1);
2596                        // System.out.println("last tokentext:
2597                        // "+sqlparser.sqlstatements.get(2).sourcetokenlist.get(sqlparser.sqlstatements.get(2).sourcetokenlist.size()-7));
2598                }
2599
2600                if (ret == 0) {
2601                        System.out.println("sqls: " + sqlparser.sqlstatements.size());
2602                } else {
2603                        System.out.println("error: " + sqlparser.getErrormessage());
2604                }
2605
2606        }
2607
2608        private static void analyzeStmt(TCustomSqlStatement st, int level) {
2609
2610                System.out.println("/----------------- " + level + " ----------------- ");
2611                System.out.println(st.getClass());
2612                System.out.println(st.toString());
2613                System.out.println("result columns:" + st.getResultColumnList().size());
2614                for (int i = 0; i < st.getResultColumnList().size(); i++) {
2615                        System.out.println("Column:" + st.getResultColumnList().getResultColumn(i).toString());
2616                }
2617                System.out.println("join tables:" + st.joins.size());
2618                for (int i = 0; i < st.joins.size(); i++) {
2619                        System.out.println("Table:" + st.joins.getJoin(i).toString());
2620                }
2621                for (int i = 0; i < st.getStatements().size(); i++) {
2622                        TCustomSqlStatement st1 = st.getStatements().get(i);
2623                        analyzeStmt(st1, level + 1);
2624                }
2625                System.out.println("----------------- " + level + " ----------------- /");
2626
2627        }
2628
2629        static void getrawsqlstatements(EDbVendor db, String file, boolean listToken) {
2630                TGSqlParser sqlparser = new TGSqlParser(db);
2631                sqlparser.setSqlCharset("UTF-8");
2632                sqlparser.sqlfilename = file;
2633
2634                int ret = -1;
2635                ret = sqlparser.getrawsqlstatements(); // ;
2636
2637                System.out.println("Last line no: " + sqlparser.getLastLineNoOfLastStatementBeenValidated());
2638
2639                // sqlparser.tokenizeSqltext();
2640
2641                if (listToken){
2642                        for(int i=0;i<sqlparser.sourcetokenlist.size();i++){
2643                                TSourceToken st = sqlparser.sourcetokenlist.get(i);
2644                                System.out.println(st.tokentype.toString()+" "+st.tokencode+" "+st.toString());
2645                        }
2646                }
2647
2648                if (ret == 0) {
2649//                      for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2650//                              TCustomSqlStatement stmt = sqlparser.sqlstatements.get(j);
2651//                              System.out.printf("sql type: %d: %s, %s(%d,%d) to %s(%d,%d)\n", j,stmt.sqlstatementtype,
2652//                                              stmt.getStartToken().toString(), stmt.getStartToken().lineNo, stmt.getStartToken().columnNo,
2653//                                              stmt.getEndToken().tokentype == ETokenType.ttreturn ? "linebreak"
2654//                                                              : stmt.getEndToken().toString(),
2655//                                              stmt.getEndToken().lineNo, stmt.getEndToken().columnNo);
2656//                      }
2657                } else {
2658                        System.out.println("error: " + sqlparser.getErrormessage());
2659                }
2660
2661//              StringBuilder sb = new StringBuilder();
2662//              String sqlInfo;
2663//              for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
2664//                      TCustomSqlStatement stmt = sqlparser.sqlstatements.get(j);
2665//                      sqlInfo = String.format("sql type: %d: %s, %s(%d,%d) to %s(%d,%d)\n", j,stmt.sqlstatementtype,
2666//                                      stmt.getStartToken().toString(), stmt.getStartToken().lineNo, stmt.getStartToken().columnNo,
2667//                                      stmt.getEndToken().tokentype == ETokenType.ttreturn ? "linebreak"
2668//                                                      : stmt.getEndToken().toString(),
2669//                                      stmt.getEndToken().lineNo, stmt.getEndToken().columnNo);
2670//                      sb.append(sqlInfo);
2671//              }
2672
2673                System.out.println("Total sqls:"+sqlparser.sqlstatements.size());
2674
2675        }
2676
2677        static public boolean moveFile(String sourcePath, String targetPath) {
2678
2679                File fileToMove = new File(sourcePath);
2680
2681                return fileToMove.renameTo(new File(targetPath));
2682        }
2683
2684        static void extractSQLFromDir(String dir) {
2685                SqlFileList sqlfiles = new SqlFileList(dir, true,true);
2686                for (int k = 0; k < sqlfiles.sqlfiles.size(); k++) {
2687                         System.out.println(sqlfiles.sqlfiles.get(k).toString());
2688                        try {
2689                                extractSQL(sqlfiles.sqlfiles.get(k).toString());
2690                        } catch (IOException e) {
2691                                e.printStackTrace();
2692                        }
2693                }
2694
2695        }
2696        static void parsefiles(EDbVendor db, String dir) {
2697
2698                int i, e = 0, m = 0;
2699                TGSqlParser sqlparser = new TGSqlParser(db);
2700                SqlFileList sqlfiles = new SqlFileList(dir, true);
2701                for (int k = 0; k < sqlfiles.sqlfiles.size(); k++) {
2702                        sqlparser.sqlfilename = sqlfiles.sqlfiles.get(k).toString();
2703                        // System.out.println(sqlfiles.sqlfiles.get(k));
2704                        long t = System.currentTimeMillis();
2705                        i = sqlparser.parse();// parse();
2706                        System.out.println("Time Escaped: " + (System.currentTimeMillis() - t));
2707
2708                        //java.lang.System.gc();
2709
2710                        if (i == 0) {
2711                                // System.out.println(sqlfiles.sqlfiles.get(k));
2712                                // remove this file
2713                                // File f = new File(sqlfiles.sqlfiles.get(k));
2714                                // String destFile =
2715                                // "c:\\prg\\gsqlparser\\Test\\TestCases\\java\\dag\\teradata\\"
2716                                // + f.getName();
2717                                // System.out.println(destFile);
2718
2719                                // if (moveFile(sqlfiles.sqlfiles.get(k),destFile)) m++;
2720
2721                                // File file = new File(sqlfiles.sqlfiles.get(k));
2722                                //
2723                                // // renaming the file and moving it to a new location
2724                                // if (file.renameTo
2725                                // (new File(destFile))) {
2726                                // // if file copied successfully then delete the original file
2727                                // file.delete();
2728                                // System.out.println("File moved successfully:" +
2729                                // file.getName());
2730                                // } else {
2731                                // System.out.println("Failed to move the file");
2732                                // }
2733                        } else {
2734                                e++;
2735                                System.out.println("syntax error: " + sqlfiles.sqlfiles.get(k));
2736                        }
2737                }
2738
2739                System.out.println(db.toString() + " total sql files: " + sqlfiles.sqlfiles.size() + ", error files: " + e);
2740
2741        }
2742
2743        static public void generateKeywordList(String keywordFile, String outFile) throws IOException {
2744
2745                BufferedReader reader = null, reader2 = null;
2746                PrintWriter outputStream = null;
2747                ArrayList<String> rows = new ArrayList<String>();
2748                ArrayList<String> oldkeys = new ArrayList<String>();
2749
2750                try {
2751                        reader = new BufferedReader(new FileReader("c:\\prg\\tmp\\demo.sql"));
2752                        reader2 = new BufferedReader(new FileReader(keywordFile));
2753                        outputStream = new PrintWriter(new FileWriter(outFile));
2754
2755                        String file;
2756
2757                        while ((file = reader2.readLine()) != null) {
2758                                oldkeys.add(file);
2759                                // String[] words = file.split("RW_");
2760                                // for(String str : words){
2761                                // if (str.trim().length() == 0) continue;
2762                                // oldkeys.add(str);
2763                                // }
2764                        }
2765                        Collections.sort(oldkeys);
2766
2767                        String[] strArr = oldkeys.toArray(new String[0]);
2768                        for (String cur : strArr) {
2769                                outputStream.printf("addkeyword('%s',\tRW_%s,\tttkeyword);\n", cur.trim(), cur.trim());
2770                        }
2771
2772                } finally {
2773                        if (reader != null) {
2774                                reader.close();
2775                        }
2776                        if (reader2 != null) {
2777                                reader2.close();
2778                        }
2779                        if (outputStream != null) {
2780                                outputStream.close();
2781                        }
2782                }
2783        }
2784
2785        /**
2786         * Configuration options for resolver comparison.
2787         * Set these options in one place to ensure both resolvers use the same settings.
2788         */
2789        private static class ResolverComparisonOptions {
2790                boolean showTableEffect = false;
2791                boolean showColumnLocation = false;
2792                boolean listStarColumn = true;
2793                boolean showDatatype = false;
2794                boolean linkOrphanColumnToFirstTable = false;
2795                boolean showCTE = false;
2796                boolean showColumnsOfCTE = false;
2797        }
2798
2799        /**
2800         * Compare table and column resolution results between RESOLVER and RESOLVER2.
2801         * This method parses the same SQL file using both resolver types and compares the outputs.
2802         *
2803         * @param dbVendor The database vendor (e.g., EDbVendor.dbvoracle, EDbVendor.dbvmssql)
2804         * @param sqlFilePath The path to the input SQL file
2805         */
2806        public static void compareResolvers(EDbVendor dbVendor, String sqlFilePath) {
2807                System.out.println(repeatChar('=', 80));
2808                System.out.println("Comparing RESOLVER vs RESOLVER2");
2809                System.out.println("Database Vendor: " + dbVendor);
2810                System.out.println("SQL File: " + sqlFilePath);
2811                System.out.println(repeatChar('=', 80));
2812                System.out.println();
2813
2814                // Read SQL file content
2815                File sqlFile = new File(sqlFilePath);
2816                if (!sqlFile.exists()) {
2817                        System.out.println("ERROR: SQL file does not exist: " + sqlFilePath);
2818                        return;
2819                }
2820
2821                String sqlContent;
2822                try {
2823                        sqlContent = new String(java.nio.file.Files.readAllBytes(
2824                                java.nio.file.Paths.get(sqlFilePath)), StandardCharsets.UTF_8);
2825                } catch (IOException e) {
2826                        System.out.println("ERROR: Failed to read SQL file: " + e.getMessage());
2827                        return;
2828                }
2829
2830                System.out.println("Input SQL:");
2831                System.out.println(repeatChar('-', 40));
2832                System.out.println(sqlContent);
2833                System.out.println(repeatChar('-', 40));
2834                System.out.println();
2835
2836                // Create shared options for both resolvers
2837                ResolverComparisonOptions options = new ResolverComparisonOptions();
2838
2839                // ========== RESOLVER (old) using TGetTableColumn ==========
2840                String resolver1Result = getResolver1Result(dbVendor, sqlContent, options);
2841
2842                // ========== RESOLVER2 (new) using TSQLResolver2ResultFormatter ==========
2843                String resolver2Result = getResolver2Result(dbVendor, sqlContent, options);
2844
2845                // ========== Compare results ==========
2846                System.out.println(repeatChar('=', 80));
2847                System.out.println("COMPARISON RESULT");
2848                System.out.println(repeatChar('=', 80));
2849                System.out.println();
2850
2851                if (resolver1Result.trim().equalsIgnoreCase(resolver2Result.trim())) {
2852                        System.out.println("* RESULTS ARE THE SAME");
2853                        System.out.println();
2854                        System.out.println("Result:");
2855                        System.out.println(repeatChar('-', 40));
2856                        System.out.println(resolver1Result);
2857                } else {
2858                        System.out.println("X RESULTS ARE DIFFERENT");
2859                        System.out.println();
2860
2861                        // Show differences
2862                        showDifferences(resolver1Result, resolver2Result);
2863
2864                        System.out.println();
2865                        System.out.println("RESOLVER (TGetTableColumn) output:");
2866                        System.out.println(repeatChar('-', 40));
2867                        System.out.println(resolver1Result);
2868                        System.out.println();
2869                        System.out.println("RESOLVER2 (TSQLResolver2ResultFormatter) output:");
2870                        System.out.println(repeatChar('-', 40));
2871                        System.out.println(resolver2Result);
2872                }
2873                System.out.println();
2874        }
2875
2876        /**
2877         * Get table/column result using RESOLVER (old) with TGetTableColumn.
2878         */
2879        private static String getResolver1Result(EDbVendor dbVendor, String sqlContent, ResolverComparisonOptions options) {
2880                System.out.println("Running RESOLVER (TGetTableColumn)...");
2881
2882                gudusoft.gsqlparser.util.TGetTableColumn getTableColumn =
2883                        new gudusoft.gsqlparser.util.TGetTableColumn(dbVendor);
2884                getTableColumn.setResolverType(EResolverType.RESOLVER);
2885                getTableColumn.isConsole = false;
2886                getTableColumn.showDetail = false;
2887                getTableColumn.showSummary = true;
2888
2889                // Apply shared options
2890                getTableColumn.showTableEffect = options.showTableEffect;
2891                getTableColumn.showColumnLocation = options.showColumnLocation;
2892                getTableColumn.listStarColumn = options.listStarColumn;
2893                getTableColumn.showDatatype = options.showDatatype;
2894                getTableColumn.linkOrphanColumnToFirstTable = options.linkOrphanColumnToFirstTable;
2895                getTableColumn.showCTE = options.showCTE;
2896                getTableColumn.showColumnsOfCTE = options.showColumnsOfCTE;
2897
2898                getTableColumn.runText(sqlContent);
2899                String result = getTableColumn.outList.toString();
2900
2901                System.out.println("RESOLVER completed.");
2902                System.out.println();
2903                return result.trim();
2904        }
2905
2906        /**
2907         * Get table/column result using RESOLVER2 (new) with TSQLResolver2ResultFormatter.
2908         */
2909        private static String getResolver2Result(EDbVendor dbVendor, String sqlContent, ResolverComparisonOptions options) {
2910                System.out.println("Running RESOLVER2 (TSQLResolver2ResultFormatter)...");
2911
2912                TGSqlParser parser = new TGSqlParser(dbVendor);
2913                parser.setResolverType(EResolverType.RESOLVER2);
2914                parser.sqltext = sqlContent;
2915
2916                int ret = parser.parse();
2917                if (ret != 0) {
2918                        System.out.println("ERROR: Parse failed: " + parser.getErrormessage());
2919                        return "Parse error: " + parser.getErrormessage();
2920                }
2921
2922                // Get resolver2 and format results
2923                gudusoft.gsqlparser.resolver2.TSQLResolver2 resolver = parser.getResolver2();
2924                if (resolver == null) {
2925                        System.out.println("ERROR: Resolver2 not available after parsing");
2926                        return "Resolver2 not available";
2927                }
2928
2929                gudusoft.gsqlparser.resolver2.TSQLResolver2ResultFormatter formatter =
2930                        new gudusoft.gsqlparser.resolver2.TSQLResolver2ResultFormatter(resolver);
2931
2932                // Apply shared options
2933                formatter.setShowTableEffect(options.showTableEffect);
2934                formatter.setShowColumnLocation(options.showColumnLocation);
2935                formatter.setListStarColumn(options.listStarColumn);
2936                formatter.setShowDatatype(options.showDatatype);
2937                formatter.setLinkOrphanColumnToFirstTable(options.linkOrphanColumnToFirstTable);
2938                formatter.setShowCTE(options.showCTE);
2939                formatter.setShowColumnsOfCTE(options.showColumnsOfCTE);
2940                formatter.setDisplayNameMode(DisplayNameMode.SQL_RENDER);
2941
2942                String result = formatter.format();
2943
2944                System.out.println("RESOLVER2 completed.");
2945                System.out.println();
2946                return result.trim();
2947        }
2948
2949        /**
2950         * Helper method to repeat a character (Java 8 compatible).
2951         */
2952        private static String repeatChar(char c, int count) {
2953                StringBuilder sb = new StringBuilder(count);
2954                for (int i = 0; i < count; i++) {
2955                        sb.append(c);
2956                }
2957                return sb.toString();
2958        }
2959
2960        /**
2961         * Show detailed differences between two results.
2962         */
2963        private static void showDifferences(String result1, String result2) {
2964                System.out.println("Differences:");
2965                System.out.println(repeatChar('-', 40));
2966
2967                // Parse both results into tables and fields
2968                Set<String> tables1 = extractSection(result1, "Tables:");
2969                Set<String> tables2 = extractSection(result2, "Tables:");
2970                Set<String> fields1 = extractSection(result1, "Fields:");
2971                Set<String> fields2 = extractSection(result2, "Fields:");
2972
2973                // Compare tables
2974                Set<String> tablesOnlyIn1 = new java.util.TreeSet<>(String.CASE_INSENSITIVE_ORDER);
2975                tablesOnlyIn1.addAll(tables1);
2976                tablesOnlyIn1.removeAll(tables2);
2977
2978                Set<String> tablesOnlyIn2 = new java.util.TreeSet<>(String.CASE_INSENSITIVE_ORDER);
2979                tablesOnlyIn2.addAll(tables2);
2980                tablesOnlyIn2.removeAll(tables1);
2981
2982                if (!tablesOnlyIn1.isEmpty()) {
2983                        System.out.println("Tables only in RESOLVER: " + tablesOnlyIn1);
2984                }
2985                if (!tablesOnlyIn2.isEmpty()) {
2986                        System.out.println("Tables only in RESOLVER2: " + tablesOnlyIn2);
2987                }
2988
2989                // Compare fields
2990                Set<String> fieldsOnlyIn1 = new java.util.TreeSet<>(String.CASE_INSENSITIVE_ORDER);
2991                fieldsOnlyIn1.addAll(fields1);
2992                fieldsOnlyIn1.removeAll(fields2);
2993
2994                Set<String> fieldsOnlyIn2 = new java.util.TreeSet<>(String.CASE_INSENSITIVE_ORDER);
2995                fieldsOnlyIn2.addAll(fields2);
2996                fieldsOnlyIn2.removeAll(fields1);
2997
2998                if (!fieldsOnlyIn1.isEmpty()) {
2999                        System.out.println("Fields only in RESOLVER: " + fieldsOnlyIn1);
3000                }
3001                if (!fieldsOnlyIn2.isEmpty()) {
3002                        System.out.println("Fields only in RESOLVER2: " + fieldsOnlyIn2);
3003                }
3004
3005                // Show common items
3006                Set<String> commonTables = new java.util.TreeSet<>(String.CASE_INSENSITIVE_ORDER);
3007                commonTables.addAll(tables1);
3008                commonTables.retainAll(tables2);
3009
3010                Set<String> commonFields = new java.util.TreeSet<>(String.CASE_INSENSITIVE_ORDER);
3011                commonFields.addAll(fields1);
3012                commonFields.retainAll(fields2);
3013
3014                if (!commonTables.isEmpty() || !commonFields.isEmpty()) {
3015                        System.out.println();
3016                        System.out.println("Common items:");
3017                        if (!commonTables.isEmpty()) {
3018                                System.out.println("  Tables: " + commonTables);
3019                        }
3020                        if (!commonFields.isEmpty()) {
3021                                System.out.println("  Fields: " + commonFields);
3022                        }
3023                }
3024        }
3025
3026        /**
3027         * Extract a section (Tables: or Fields:) from the result string.
3028         */
3029        private static Set<String> extractSection(String result, String sectionName) {
3030                Set<String> items = new java.util.TreeSet<>(String.CASE_INSENSITIVE_ORDER);
3031                String[] lines = result.split("\n");
3032                boolean inSection = false;
3033
3034                for (String line : lines) {
3035                        line = line.trim();
3036                        if (line.isEmpty()) continue;
3037
3038                        if (line.equalsIgnoreCase(sectionName.trim().replace(":", ""))) {
3039                                inSection = true;
3040                                continue;
3041                        }
3042                        if (line.toLowerCase().startsWith("tables:")) {
3043                                inSection = sectionName.toLowerCase().contains("tables");
3044                                continue;
3045                        }
3046                        if (line.toLowerCase().startsWith("fields:")) {
3047                                inSection = sectionName.toLowerCase().contains("fields");
3048                                continue;
3049                        }
3050                        if (line.toLowerCase().startsWith("ctes:")) {
3051                                inSection = false;
3052                                continue;
3053                        }
3054
3055                        if (inSection && !line.isEmpty()) {
3056                                items.add(line);
3057                        }
3058                }
3059
3060                return items;
3061        }
3062
3063
3064        /**
3065         * Main entry point for comparing resolvers from command line.
3066         * Usage: java demo compareResolvers <dbvendor> <sqlfile>
3067         * Example: java demo compareResolvers oracle /path/to/query.sql
3068         */
3069        public static void runCompareResolvers(String[] args) {
3070                if (args.length < 2) {
3071                        System.out.println("Usage: compareResolvers <dbvendor> <sqlfile>");
3072                        System.out.println("Available vendors: oracle, mssql, mysql, postgresql, bigquery, snowflake, teradata, etc.");
3073                        return;
3074                }
3075
3076                String vendorName = args[0].toLowerCase();
3077                String sqlFilePath = args[1];
3078
3079                EDbVendor dbVendor = getDbVendorFromName(vendorName);
3080                if (dbVendor == null) {
3081                        System.out.println("Unknown database vendor: " + vendorName);
3082                        System.out.println("Available vendors: oracle, mssql, mysql, postgresql, bigquery, snowflake, teradata, db2, sybase, greenplum, netezza, hive, sparksql");
3083                        return;
3084                }
3085
3086                compareResolvers(dbVendor, sqlFilePath);
3087        }
3088
3089        /**
3090         * Convert vendor name string to EDbVendor enum.
3091         */
3092        private static EDbVendor getDbVendorFromName(String vendorName) {
3093                switch (vendorName.toLowerCase()) {
3094                        case "oracle": return EDbVendor.dbvoracle;
3095                        case "mssql":
3096                        case "sqlserver": return EDbVendor.dbvmssql;
3097                        case "mysql": return EDbVendor.dbvmysql;
3098                        case "postgresql":
3099                        case "postgres": return EDbVendor.dbvpostgresql;
3100                        case "bigquery": return EDbVendor.dbvbigquery;
3101                        case "snowflake": return EDbVendor.dbvsnowflake;
3102                        case "teradata": return EDbVendor.dbvteradata;
3103                        case "db2": return EDbVendor.dbvdb2;
3104                        case "sybase": return EDbVendor.dbvsybase;
3105                        case "greenplum": return EDbVendor.dbvgreenplum;
3106                        case "netezza": return EDbVendor.dbvnetezza;
3107                        case "hive": return EDbVendor.dbvhive;
3108                        case "sparksql":
3109                        case "spark": return EDbVendor.dbvsparksql;
3110                        case "redshift": return EDbVendor.dbvredshift;
3111                        case "athena": return EDbVendor.dbvathena;
3112                        default: return null;
3113                }
3114        }
3115
3116}
3117
3118class TSQLServerEnv extends TSQLEnv {
3119
3120        public TSQLServerEnv() {
3121                super(EDbVendor.dbvmssql);
3122                initSQLEnv();
3123        }
3124
3125        @Override
3126        public void initSQLEnv() {
3127
3128        }
3129}
3130
3131class THiveEnv extends TSQLEnv{
3132
3133        public THiveEnv(){
3134                super(EDbVendor.dbvhive);
3135                initSQLEnv();
3136        }
3137
3138        @Override
3139        public void initSQLEnv() {
3140
3141                // add a new database: default database
3142                TSQLCatalog sqlCatalog = createSQLCatalog("pharos_business_vault");
3143                // hive don't have schema, we use database as a schema
3144                TSQLSchema sqlSchema = sqlCatalog.createSchema("default");
3145
3146                //add a new table: cTab
3147                TSQLTable ExecutionLogStorage = sqlSchema.createTable("b_content_datamart_bv");
3148                ExecutionLogStorage.addColumn("a_beginn_pe");
3149                ExecutionLogStorage.addColumn("a_perspektive_verbrauch");
3150        }
3151}
3152
3153class TOracleEnvStarColumn1 extends TSQLEnv {
3154
3155        public TOracleEnvStarColumn1(){
3156                super(EDbVendor.dbvoracle);
3157                initSQLEnv();
3158        }
3159
3160        @Override
3161        public void initSQLEnv() {
3162                TSQLCatalog sqlCatalog = createSQLCatalog("default");
3163                TSQLSchema sqlSchema = sqlCatalog.createSchema("default");
3164                TSQLTable aTab = sqlSchema.createTable("some_table");
3165                aTab.addColumn("c123");
3166                TSQLTable bTab = sqlSchema.createTable("other_table");
3167                bTab.addColumn("c1");
3168        }
3169}
3170
3171class SQLUtil {
3172
3173        public static String getFileContent(File file) {
3174                String charset = null;
3175                String sqlfilename = file.getAbsolutePath();
3176                int read = 0;
3177                try {
3178                        FileInputStream fr = new FileInputStream(sqlfilename);
3179                        byte[] bom = new byte[4];
3180                        fr.read(bom, 0, bom.length);
3181
3182                        if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE)
3183                                        && (bom[3] == (byte) 0xFF)) {
3184                                charset = "UTF-32BE";
3185                                read = 4;
3186                        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00)
3187                                        && (bom[3] == (byte) 0x00)) {
3188                                charset = "UTF-32LE";
3189                                read = 4;
3190                        } else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
3191                                charset = "UTF-8";
3192                                read = 3;
3193                        } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
3194                                charset = "UTF-16BE";
3195                                read = 2;
3196                        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
3197                                charset = "UTF-16LE";
3198                                read = 2;
3199                        } else {
3200                                charset = Charset.defaultCharset().name();
3201                                read = 0;
3202                        }
3203
3204                        fr.close();
3205                } catch (IOException e) {
3206                        e.printStackTrace();
3207                }
3208
3209                Long filelength = file.length();
3210                byte[] filecontent = new byte[filelength.intValue()];
3211                try {
3212                        InputStream in = new BufferedInputStream(new FileInputStream(sqlfilename));
3213                        in.read(filecontent);
3214                        in.close();
3215                } catch (IOException e) {
3216                        e.printStackTrace();
3217                }
3218
3219                byte[] content = new byte[filelength.intValue() - read];
3220                System.arraycopy(filecontent, read, content, 0, content.length);
3221
3222                try {
3223                        String fileContent = new String(content, charset == null ? Charset.defaultCharset().name() : charset)
3224                                        .trim();
3225                        return fileContent;
3226                } catch (UnsupportedEncodingException e) {
3227                        System.err
3228                                        .println("The OS does not support " + charset == null ? Charset.defaultCharset().name() : charset);
3229                        return null;
3230                }
3231        }
3232
3233        public static String getInputStreamContent(InputStream is, boolean close) {
3234                try {
3235                        ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
3236                        byte[] tmp = new byte[4096];
3237                        while (true) {
3238                                int r = is.read(tmp);
3239                                if (r == -1)
3240                                        break;
3241                                out.write(tmp, 0, r);
3242                        }
3243                        byte[] bytes = out.toByteArray();
3244                        if (close) {
3245                                is.close();
3246                        }
3247                        out.close();
3248                        String content = new String(bytes);
3249                        return content.trim();
3250                } catch (IOException e) {
3251                        e.printStackTrace();
3252                }
3253                return null;
3254        }
3255
3256        public static String getFileContent(String filePath) {
3257                if (filePath == null)
3258                        return "";
3259                File file = new File(filePath);
3260                if (!file.exists() || file.isDirectory())
3261                        return "";
3262                return getFileContent(file);
3263        }
3264
3265        /**
3266         * @param file
3267         *            the filePath
3268         *
3269         *            the default encoding
3270         * @return the UTFFileHandler.UnicodeInputStream
3271         * @throws Exception
3272         */
3273        public static InputStream getInputStreamWithoutBom(String file) throws IOException {
3274                UnicodeInputStream stream = null;
3275                FileInputStream fis = new FileInputStream(file);
3276                stream = new UnicodeInputStream(fis, null);
3277                return stream;
3278        }
3279
3280        /**
3281         * This inputstream will recognize unicode BOM marks and will skip bytes if
3282         * getEncoding() method is called before any of the read(...) methods.
3283         * <p>
3284         * Usage pattern: String enc = "ISO-8859-1"; // or NULL to use systemdefault
3285         * FileInputStream fis = new FileInputStream(file); UnicodeInputStream uin =
3286         * new UnicodeInputStream(fis, enc); enc = uin.getEncoding(); // check and
3287         * skip possible BOM bytes InputStreamReader in; if (enc == null) in = new
3288         * InputStreamReader(uin); else in = new InputStreamReader(uin, enc);
3289         */
3290        public static class UnicodeInputStream extends InputStream {
3291                PushbackInputStream internalIn;
3292                boolean isInited = false;
3293                String defaultEnc;
3294                String encoding;
3295
3296                private static final int BOM_SIZE = 4;
3297
3298                public UnicodeInputStream(InputStream in, String defaultEnc) {
3299                        internalIn = new PushbackInputStream(in, BOM_SIZE);
3300                        this.defaultEnc = defaultEnc;
3301                }
3302
3303                public String getDefaultEncoding() {
3304                        return defaultEnc;
3305                }
3306
3307                public String getEncoding() {
3308                        if (!isInited) {
3309                                try {
3310                                        init();
3311                                } catch (IOException ex) {
3312                                        IllegalStateException ise = new IllegalStateException("Init method failed.");
3313                                        ise.initCause(ise);
3314                                        throw ise;
3315                                }
3316                        }
3317                        return encoding;
3318                }
3319
3320                /**
3321                 * Read-ahead four bytes and check for BOM marks. Extra bytes are unread
3322                 * back to the stream, only BOM bytes are skipped.
3323                 */
3324                protected void init() throws IOException {
3325                        if (isInited)
3326                                return;
3327
3328                        byte bom[] = new byte[BOM_SIZE];
3329                        int n, unread;
3330                        n = internalIn.read(bom, 0, bom.length);
3331
3332                        if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE)
3333                                        && (bom[3] == (byte) 0xFF)) {
3334                                encoding = "UTF-32BE";
3335                                unread = n - 4;
3336                        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00)
3337                                        && (bom[3] == (byte) 0x00)) {
3338                                encoding = "UTF-32LE";
3339                                unread = n - 4;
3340                        } else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
3341                                encoding = "UTF-8";
3342                                unread = n - 3;
3343                        } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
3344                                encoding = "UTF-16BE";
3345                                unread = n - 2;
3346                        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
3347                                encoding = "UTF-16LE";
3348                                unread = n - 2;
3349                        } else {
3350                                encoding = defaultEnc;
3351                                unread = n;
3352                        }
3353
3354                        if (unread > 0)
3355                                internalIn.unread(bom, (n - unread), unread);
3356
3357                        isInited = true;
3358                }
3359
3360                public void close() throws IOException {
3361                        internalIn.close();
3362                }
3363
3364                public int read() throws IOException {
3365                        return internalIn.read();
3366                }
3367        }
3368
3369        public static void writeFileContent(File file, String sql, String charset) {
3370                PrintWriter pw = null;
3371                try {
3372                        //charset  = "UTF-8";
3373                        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset)));
3374                        pw.write(sql);
3375                } catch (Exception e) {
3376                        e.printStackTrace();
3377                } finally {
3378                        if (pw != null) {
3379                                pw.close();
3380                        }
3381                }
3382
3383        }
3384
3385}
3386
3387class myTokenListHandle implements ITokenListHandle {
3388        // 把 ${tx_date_yyyymm} 合并为一个token,token code为 TBasetype.ident
3389        public boolean processTokenList(TSourceTokenList sourceTokenList){
3390                int startIndex = -1;
3391                int endIndex = -1;
3392
3393                for(int i=0;i< sourceTokenList.size();i++) {
3394                        TSourceToken token = sourceTokenList.get(i);
3395
3396                        // Check for '$' followed immediately by '{'
3397                        if (token.tokencode == 36) { // Check for '$'
3398                                if (i + 1 < sourceTokenList.size() && sourceTokenList.get(i + 1).tokencode == 123) { // Check for '{' immediately after '$'
3399                                        startIndex = i;
3400                                }
3401                        } else if (token.tokencode == 125 && startIndex != -1) { // Check for '}'
3402                                endIndex = i;
3403
3404                        }
3405
3406
3407                        if (startIndex != -1 && endIndex != -1) {
3408                                TSourceToken firstToken = sourceTokenList.get(startIndex);
3409                                firstToken.tokencode = TBaseType.ident;
3410                                for (int j = startIndex + 1; j <= endIndex; j++) {
3411                                        TSourceToken st = sourceTokenList.get(j);
3412                                        st.tokenstatus = ETokenStatus.tsdeleted;
3413                                        firstToken.setString(firstToken.getAstext() + st.getAstext());
3414                                }
3415
3416                                //System.out.println("Found variable token: " + firstToken.toStringDebug());
3417
3418                                startIndex = -1;
3419                                endIndex = -1;
3420                        }
3421                }
3422                return true;
3423        }
3424}
3425
3426// static void teradataCmds(){
3427// TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvteradata);
3428// sqlparser.teradataCmds();
3429// }