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// }