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