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