1 21 22 package org.apache.derbyTesting.functionTests.tests.jdbcapi; 23 24 import java.sql.Connection ; 25 import java.sql.DriverManager ; 26 import java.sql.DatabaseMetaData ; 27 import java.sql.ResultSetMetaData ; 28 import java.sql.Statement ; 29 import java.sql.CallableStatement ; 30 import java.sql.ResultSet ; 31 import java.sql.SQLException ; 32 import java.sql.Types ; 33 import java.sql.Timestamp ; 34 import java.sql.Time ; 35 import java.sql.Date ; 36 import java.math.BigDecimal ; 37 38 import java.util.Properties ; 39 40 import org.apache.derby.tools.ij; 41 import org.apache.derbyTesting.functionTests.util.TestUtil; 42 43 69 70 public class odbc_metadata extends metadata_test { 71 72 95 private static String [][] odbcComplianceTargets = 96 new String [15][25]; 97 98 104 public odbc_metadata(String [] args) { 105 106 try { 107 108 ij.getPropertyArg(args); 109 con = ij.startJBMS(); 110 s = con.createStatement(); 111 112 verifyODBC3Compliance(); 116 117 } catch (SQLException e) { 118 dumpSQLExceptions(e); 119 } 120 catch (Throwable e) { 121 System.out.println("FAIL -- unexpected exception:"); 122 e.printStackTrace(System.out); 123 } 124 125 } 126 127 132 public static void main(String [] args) { 133 134 new odbc_metadata(args).runTest(); 135 136 } 137 138 142 protected ResultSet getMetaDataRS(DatabaseMetaData dmd, int procId, 143 String [] sArgs, String [] argArray, int [] iArgs, boolean [] bArgs) 144 throws SQLException 145 { 146 147 switch (procId) { 148 149 case GET_PROCEDURES: 150 151 s.execute("CALL SYSIBM.SQLPROCEDURES (" + 152 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 153 ", " + addQuotes(sArgs[2]) + ", 'DATATYPE=''ODBC''')"); 154 return s.getResultSet(); 155 156 case GET_PROCEDURE_COLUMNS: 157 158 s.execute("CALL SYSIBM.SQLPROCEDURECOLS (" + 159 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 160 ", " + addQuotes(sArgs[2]) + ", " + addQuotes(sArgs[3]) + 161 ", 'DATATYPE=''ODBC''')"); 162 return s.getResultSet(); 163 164 case GET_TABLES: 165 166 int count = (argArray == null) ? 0 : argArray.length; 167 StringBuffer tableTypes = new StringBuffer (); 168 for (int i = 0; i < count; i++) { 169 if (i > 0) 170 tableTypes.append(","); 171 tableTypes.append(argArray[i]); 172 } 173 174 s.execute("CALL SYSIBM.SQLTABLES (" + 175 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 176 ", " + addQuotes(sArgs[2]) + ", " + 177 ((argArray == null) ? "null" : addQuotes(tableTypes.toString())) + 178 ", 'DATATYPE=''ODBC''')"); 179 180 return s.getResultSet(); 181 182 case GET_COLUMNS: 183 184 s.execute("CALL SYSIBM.SQLCOLUMNS (" + 185 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 186 ", " + addQuotes(sArgs[2]) + ", " + addQuotes(sArgs[3]) + 187 ", 'DATATYPE=''ODBC''')"); 188 return s.getResultSet(); 189 190 case GET_COLUMN_PRIVILEGES: 191 192 s.execute("CALL SYSIBM.SQLCOLPRIVILEGES (" + 193 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 194 ", " + addQuotes(sArgs[2]) + ", " + addQuotes(sArgs[3]) + 195 ", 'DATATYPE=''ODBC''')"); 196 return s.getResultSet(); 197 198 case GET_TABLE_PRIVILEGES: 199 200 s.execute("CALL SYSIBM.SQLTABLEPRIVILEGES (" + 201 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 202 ", " + addQuotes(sArgs[2]) + ", 'DATATYPE=''ODBC''')"); 203 return s.getResultSet(); 204 205 case GET_BEST_ROW_IDENTIFIER: 206 207 s.execute("CALL SYSIBM.SQLSPECIALCOLUMNS (1, " + 208 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 209 ", " + addQuotes(sArgs[2]) + ", " + iArgs[0] + ", " + 210 (bArgs[0] ? "1, " : "0, ") + "'DATATYPE=''ODBC''')"); 211 return s.getResultSet(); 212 213 case GET_VERSION_COLUMNS: 214 215 s.execute("CALL SYSIBM.SQLSPECIALCOLUMNS (2, " + 216 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 217 ", " + addQuotes(sArgs[2]) + ", 1, 1, 'DATATYPE=''ODBC''')"); 218 return s.getResultSet(); 219 220 case GET_PRIMARY_KEYS: 221 222 s.execute("CALL SYSIBM.SQLPRIMARYKEYS (" + 223 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 224 ", " + addQuotes(sArgs[2]) + ", 'DATATYPE=''ODBC''')"); 225 return s.getResultSet(); 226 227 case GET_IMPORTED_KEYS: 228 229 s.execute("CALL SYSIBM.SQLFOREIGNKEYS (null, null, null, " + 230 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 231 ", " + addQuotes(sArgs[2]) + ", 'IMPORTEDKEY=1;DATATYPE=''ODBC''')"); 232 return s.getResultSet(); 233 234 case GET_EXPORTED_KEYS: 235 236 s.execute("CALL SYSIBM.SQLFOREIGNKEYS (" + 237 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 238 ", " + addQuotes(sArgs[2]) + ", null, null, null, " + 239 "'EXPORTEDKEY=1;DATATYPE=''ODBC''')"); 240 return s.getResultSet(); 241 242 case GET_CROSS_REFERENCE: 243 244 s.execute("CALL SYSIBM.SQLFOREIGNKEYS (" + 245 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 246 ", " + addQuotes(sArgs[2]) + ", " + addQuotes(sArgs[3]) + 247 ", " + addQuotes(sArgs[4]) + ", " + addQuotes(sArgs[5]) + 248 ", 'DATATYPE=''ODBC''')"); 249 return s.getResultSet(); 250 251 case GET_TYPE_INFO: 252 253 s.execute("CALL SYSIBM.SQLGETTYPEINFO (0, 'DATATYPE=''ODBC''')"); 254 return s.getResultSet(); 255 256 case GET_INDEX_INFO: 257 258 s.execute("CALL SYSIBM.SQLSTATISTICS (" + 259 addQuotes(sArgs[0]) + ", " + addQuotes(sArgs[1]) + 260 ", " + addQuotes(sArgs[2]) + (bArgs[0] ? ", 0, " : ", 1, ") + 261 (bArgs[1] ? "1, " : "0, ") + "'DATATYPE=''ODBC''')"); 262 return s.getResultSet(); 263 264 default: 265 267 System.out.println("*** UNEXPECTED PROCEDURE ID ENCOUNTERED: " + procId + "."); 268 return null; 269 270 } 271 272 } 273 274 279 protected void dumpRS(int procId, ResultSet s) throws SQLException { 280 281 ResultSetMetaData rsmd = s.getMetaData (); 282 283 int numCols = rsmd.getColumnCount (); 285 String [] headers = new String [numCols]; 286 if (numCols <= 0) { 287 System.out.println("(no columns!)"); 288 return; 289 } 290 291 for (int i=1; i<=numCols; i++) { 294 if (i > 1) System.out.print(","); 295 headers[i-1] = rsmd.getColumnLabel(i); 296 System.out.print(headers[i-1]); 297 System.out.print("[" + rsmd.getColumnTypeName(i) + "]"); 298 299 } 300 System.out.println(); 301 302 StringBuffer errorColumns; 304 while (s.next()) { 305 errorColumns = new StringBuffer (); 308 String value; 309 for (int i=1; i<=numCols; i++) { 310 if (i > 1) System.out.print(","); 311 value = s.getString(i); 312 if (headers[i-1].equals("DATA_TYPE")) 313 { 314 if (((TestUtil.getJDBCMajorVersion(s.getStatement().getConnection()) >= 3) && 315 (Integer.valueOf(value).intValue() == 16)) || 316 (Integer.valueOf(value).intValue() == -7)) 317 System.out.print("**BOOLEAN_TYPE for VM**"); 318 else 319 System.out.print(value); 320 } 321 else 322 System.out.print(value); 323 324 if ((procId != IGNORE_PROC_ID) && 326 badNullability(procId, headers[i-1], i, s.wasNull())) 327 { 328 errorColumns.append(headers[i-1]); 329 } 330 331 } 332 333 if (errorColumns.length() > 0) { 334 System.out.println( 335 "\n--> ODBC COMPLIANCE FAILED: Column was NULL in " + 336 "the preceding row when it is specified as NOT NULL: " + 337 errorColumns.toString() + "."); 338 } 339 340 System.out.println(); 341 } 342 s.close(); 343 } 344 345 358 protected void verifyODBC3Compliance() 359 throws Exception 360 { 361 362 System.out.println( 363 "\n=============== Begin ODBC 3.0 Compliance Tests =================\n"); 364 365 loadODBCTargets(); 368 369 System.out.println("SQLProcedures:"); 370 s.execute( 371 "call sysibm.sqlprocedures (null, '%', 'GETPCTEST%', 'DATATYPE=''ODBC''')"); 372 checkODBCNamesAndTypes(s.getResultSet(), GET_PROCEDURES); 373 374 System.out.println("SQLProcedureColumns:"); 375 s.execute( 376 "call sysibm.sqlprocedurecols(null, '%', 'GETPCTEST%', '%', 'DATATYPE=''ODBC''')"); 377 checkODBCNamesAndTypes(s.getResultSet(), GET_PROCEDURE_COLUMNS); 378 379 System.out.println("SQLTables:"); 380 s.execute( 381 "call sysibm.sqltables (null, null, null, 'SYSTEM TABLE', 'DATATYPE=''ODBC''')"); 382 checkODBCNamesAndTypes(s.getResultSet(), GET_TABLES); 383 384 System.out.println("SQLColumns:"); 385 s.execute( 386 "call sysibm.sqlcolumns ('', null, '', '', 'DATATYPE=''ODBC''')"); 387 checkODBCNamesAndTypes(s.getResultSet(), GET_COLUMNS); 388 389 System.out.println("SQLColumnPrivileges:"); 390 s.execute( 391 "call sysibm.sqlcolprivileges ('Huey', 'Dewey', 'Louie', 'Frooey', 'DATATYPE=''ODBC''')"); 392 checkODBCNamesAndTypes(s.getResultSet(), GET_COLUMN_PRIVILEGES); 393 394 System.out.println("SQLTablePrivileges:"); 395 s.execute( 396 "call sysibm.sqltableprivileges ('Huey', 'Dewey', 'Louie', 'DATATYPE=''ODBC''')"); 397 checkODBCNamesAndTypes(s.getResultSet(), GET_TABLE_PRIVILEGES); 398 399 System.out.println("SQLSpecialColumns: getBestRowIdentifier"); 400 s.execute( 401 "call sysibm.sqlspecialcolumns (1, '', null, 'LOUIE', 1, 1, 'DATATYPE=''ODBC''')"); 402 checkODBCNamesAndTypes(s.getResultSet(), GET_BEST_ROW_IDENTIFIER); 403 404 System.out.println("SQLSpecialColumns: getVersionColumns"); 405 s.execute( 406 "call sysibm.sqlspecialcolumns (2, 'Huey', 'Dewey', 'Louie', 1, 1, 'DATATYPE=''ODBC''')"); 407 checkODBCNamesAndTypes(s.getResultSet(), GET_VERSION_COLUMNS); 408 409 System.out.println("SQLPrimaryKeys:"); 410 s.execute( 411 "call sysibm.sqlprimarykeys ('', '%', 'LOUIE', 'DATATYPE=''ODBC''')"); 412 checkODBCNamesAndTypes(s.getResultSet(), GET_PRIMARY_KEYS); 413 414 System.out.println("SQLForeignKeys: getImportedKeys"); 415 s.execute( 416 "call sysibm.sqlforeignkeys (null, null, null, null, null, null, " + 417 "'IMPORTEDKEY=1;DATATYPE=''ODBC''')"); 418 checkODBCNamesAndTypes(s.getResultSet(), GET_IMPORTED_KEYS); 419 420 System.out.println("SQLForeignKeys: getExportedKeys"); 421 s.execute( 422 "call sysibm.sqlforeignkeys (null, null, null, null, null, null, " + 423 "'EXPORTEDKEY=1;DATATYPE=''ODBC''')"); 424 checkODBCNamesAndTypes(s.getResultSet(), GET_EXPORTED_KEYS); 425 426 System.out.println("SQLForeignKeys: getCrossReference"); 427 s.execute( 428 "call sysibm.sqlforeignkeys ('', null, 'LOUIE', '', null, 'REFTAB', 'DATATYPE=''ODBC''')"); 429 checkODBCNamesAndTypes(s.getResultSet(), GET_CROSS_REFERENCE); 430 431 System.out.println("SQLGetTypeInfo"); 432 s.execute( 433 "call sysibm.sqlgettypeinfo (0, 'DATATYPE=''ODBC''')"); 434 checkODBCNamesAndTypes(s.getResultSet(), GET_TYPE_INFO); 435 436 System.out.println("SQLStatistics:"); 437 s.execute( 438 "call sysibm.sqlstatistics ('', 'SYS', 'SYSCOLUMNS', 1, 0, 'DATATYPE=''ODBC''')"); 439 checkODBCNamesAndTypes(s.getResultSet(), GET_INDEX_INFO); 440 441 System.out.println( 442 "\n=============== End ODBC 3.0 Compliance Tests =================\n"); 443 444 } 445 446 468 protected void loadODBCTargets() { 469 470 odbcComplianceTargets[GET_PROCEDURES] = new String [] { 471 472 "PROCEDURE_CAT", "VARCHAR", null, 473 "PROCEDURE_SCHEM", "VARCHAR", null, 474 "PROCEDURE_NAME", "VARCHAR", "NOT NULL", 475 "NUM_INPUT_PARAMS", "INTEGER", null, 476 "NUM_OUTPUT_PARAMS", "INTEGER", null, 477 "NUM_RESULT_SETS", "INTEGER", null, 478 "REMARKS", "VARCHAR", null, 479 "PROCEDURE_TYPE", "SMALLINT", null 480 481 }; 482 483 odbcComplianceTargets[GET_PROCEDURE_COLUMNS] = new String [] { 484 485 "PROCEDURE_CAT", "VARCHAR", null, 486 "PROCEDURE_SCHEM", "VARCHAR", null, 487 "PROCEDURE_NAME", "VARCHAR", "NOT NULL", 488 "COLUMN_NAME", "VARCHAR", "NOT NULL", 489 "COLUMN_TYPE", "SMALLINT", "NOT NULL", 490 "DATA_TYPE", "SMALLINT", "NOT NULL", 491 "TYPE_NAME", "VARCHAR", "NOT NULL", 492 "COLUMN_SIZE", "INTEGER", null, 493 "BUFFER_LENGTH", "INTEGER", null, 494 "DECIMAL_DIGITS", "SMALLINT", null, 495 "NUM_PREC_RADIX", "SMALLINT", null, 496 "NULLABLE", "SMALLINT", "NOT NULL", 497 "REMARKS", "VARCHAR", null, 498 "COLUMN_DEF", "VARCHAR", null, 499 "SQL_DATA_TYPE", "SMALLINT", "NOT NULL", 500 "SQL_DATETIME_SUB", "SMALLINT", null, 501 "CHAR_OCTET_LENGTH", "INTEGER", null, 502 "ORDINAL_POSITION", "INTEGER", "NOT NULL", 503 "IS_NULLABLE", "VARCHAR", null 504 505 }; 506 507 odbcComplianceTargets[GET_TABLES] = new String [] { 508 509 "TABLE_CAT", "VARCHAR", null, 510 "TABLE_SCHEM", "VARCHAR", null, 511 "TABLE_NAME", "VARCHAR", null, 512 "TABLE_TYPE", "VARCHAR", null, 513 "REMARKS", "VARCHAR", null, 514 "TYPE_CAT", "VARCHAR", null, 516 "TYPE_SCHEM", "VARCHAR", null, 517 "TYPE_NAME", "VARCHAR", null, 518 "SELF_REFERENCING_COL_NAME", "VARCHAR", null, 519 "REF_GENERATION", "VARCHAR", null, 520 521 }; 522 523 odbcComplianceTargets[GET_COLUMNS] = new String [] { 524 525 "TABLE_CAT", "VARCHAR", null, 526 "TABLE_SCHEM", "VARCHAR", null, 527 "TABLE_NAME", "VARCHAR", "NOT NULL", 528 "COLUMN_NAME", "VARCHAR", "NOT NULL", 529 "DATA_TYPE", "SMALLINT", "NOT NULL", 530 "TYPE_NAME", "VARCHAR", "NOT NULL", 531 "COLUMN_SIZE", "INTEGER", null, 532 "BUFFER_LENGTH", "INTEGER", null, 533 "DECIMAL_DIGITS", "SMALLINT", null, 534 "NUM_PREC_RADIX", "SMALLINT", null, 535 "NULLABLE", "SMALLINT", "NOT NULL", 536 "REMARKS", "VARCHAR", null, 537 "COLUMN_DEF", "VARCHAR", null, 538 "SQL_DATA_TYPE", "SMALLINT", "NOT NULL", 539 "SQL_DATETIME_SUB", "SMALLINT", null, 540 "CHAR_OCTET_LENGTH", "INTEGER", null, 541 "ORDINAL_POSITION", "INTEGER", "NOT NULL", 542 "IS_NULLABLE", "VARCHAR", null, 543 "SCOPE_CATLOG", "VARCHAR", null, 545 "SCOPE_SCHEMA", "VARCHAR", null, 546 "SCOPE_TABLE", "VARCHAR", null, 547 "SOURCE_DATA_TYPE", "SMALLINT", null, 548 "IS_AUTOINCREMENT", "VARCHAR", "NOT NULL", 549 550 }; 551 552 odbcComplianceTargets[GET_COLUMN_PRIVILEGES] = new String [] { 553 554 "TABLE_CAT", "VARCHAR", null, 555 "TABLE_SCHEM", "VARCHAR", null, 556 "TABLE_NAME", "VARCHAR", "NOT NULL", 557 "COLUMN_NAME", "VARCHAR", "NOT NULL", 558 "GRANTOR", "VARCHAR", null, 559 "GRANTEE", "VARCHAR", "NOT NULL", 560 "PRIVILEGE", "VARCHAR", "NOT NULL", 561 "IS_GRANTABLE", "VARCHAR", null 562 563 }; 564 565 odbcComplianceTargets[GET_TABLE_PRIVILEGES] = new String [] { 566 567 "TABLE_CAT", "VARCHAR", null, 568 "TABLE_SCHEM", "VARCHAR", null, 569 "TABLE_NAME", "VARCHAR", "NOT NULL", 570 "GRANTOR", "VARCHAR", null, 571 "GRANTEE", "VARCHAR", "NOT NULL", 572 "PRIVILEGE", "VARCHAR", "NOT NULL", 573 "IS_GRANTABLE", "VARCHAR", null 574 575 }; 576 577 579 odbcComplianceTargets[GET_BEST_ROW_IDENTIFIER] = new String [] { 580 581 "SCOPE", "SMALLINT", null, 582 "COLUMN_NAME", "VARCHAR", "NOT NULL", 583 "DATA_TYPE", "SMALLINT", "NOT NULL", 584 "TYPE_NAME", "VARCHAR", "NOT NULL", 585 "COLUMN_SIZE", "INTEGER", null, 586 "BUFFER_LENGTH", "INTEGER", null, 587 "DECIMAL_DIGITS", "SMALLINT", null, 588 "PSEUDO_COLUMN", "SMALLINT", null 589 590 }; 591 592 odbcComplianceTargets[GET_VERSION_COLUMNS] = 593 odbcComplianceTargets[GET_BEST_ROW_IDENTIFIER]; 594 595 odbcComplianceTargets[GET_PRIMARY_KEYS] = new String [] { 596 597 "TABLE_CAT", "VARCHAR", null, 598 "TABLE_SCHEM", "VARCHAR", null, 599 "TABLE_NAME", "VARCHAR", "NOT NULL", 600 "COLUMN_NAME", "VARCHAR", "NOT NULL", 601 "KEY_SEQ", "SMALLINT", "NOT NULL", 602 "PK_NAME", "VARCHAR", null 603 604 }; 605 606 608 odbcComplianceTargets[GET_IMPORTED_KEYS] = new String [] { 609 610 "PKTABLE_CAT", "VARCHAR", null, 611 "PKTABLE_SCHEM", "VARCHAR", null, 612 "PKTABLE_NAME", "VARCHAR", "NOT NULL", 613 "PKCOLUMN_NAME", "VARCHAR", "NOT NULL", 614 "FKTABLE_CAT", "VARCHAR", null, 615 "FKTABLE_SCHEM", "VARCHAR", null, 616 "FKTABLE_NAME", "VARCHAR", "NOT NULL", 617 "FKCOLUMN_NAME", "VARCHAR", "NOT NULL", 618 "KEY_SEQ", "SMALLINT", "NOT NULL", 619 "UPDATE_RULE", "SMALLINT", null, 620 "DELETE_RULE", "SMALLINT", null, 621 "FK_NAME", "VARCHAR", null, 622 "PK_NAME", "VARCHAR", null, 623 "DEFERRABILITY", "SMALLINT", null 624 625 }; 626 627 odbcComplianceTargets[GET_EXPORTED_KEYS] = 628 odbcComplianceTargets[GET_IMPORTED_KEYS]; 629 630 odbcComplianceTargets[GET_CROSS_REFERENCE] = 631 odbcComplianceTargets[GET_IMPORTED_KEYS]; 632 633 odbcComplianceTargets[GET_TYPE_INFO] = new String [] { 634 635 "TYPE_NAME", "VARCHAR", "NOT NULL", 636 "DATA_TYPE", "SMALLINT", "NOT NULL", 637 "COLUMN_SIZE", "INTEGER", null, 638 "LITERAL_PREFIX", "VARCHAR", null, 639 "LITERAL_SUFFIX", "VARCHAR", null, 640 "CREATE_PARAMS", "VARCHAR", null, 641 "NULLABLE", "SMALLINT", "NOT NULL", 642 "CASE_SENSITIVE", "SMALLINT", "NOT NULL", 643 "SEARCHABLE", "SMALLINT", "NOT NULL", 644 "UNSIGNED_ATTRIBUTE", "SMALLINT", null, 645 "FIXED_PREC_SCALE", "SMALLINT", "NOT NULL", 646 "AUTO_UNIQUE_VAL", "SMALLINT", null, 647 "LOCAL_TYPE_NAME", "VARCHAR", null, 648 "MINIMUM_SCALE", "SMALLINT", null, 649 "MAXIMUM_SCALE", "SMALLINT", null, 650 "SQL_DATA_TYPE", "SMALLINT", "NOT NULL", 651 "SQL_DATETIME_SUB", "SMALLINT", null, 652 "NUM_PREC_RADIX", "INTEGER", null, 653 "INTERVAL_PRECISION", "SMALLINT", null 654 655 }; 656 657 odbcComplianceTargets[GET_INDEX_INFO] = new String [] { 659 660 "TABLE_CAT", "VARCHAR", null, 661 "TABLE_SCHEM", "VARCHAR", null, 662 "TABLE_NAME", "VARCHAR", "NOT NULL", 663 "NON_UNIQUE", "SMALLINT", null, 664 "INDEX_QUALIFIER", "VARCHAR", null, 665 "INDEX_NAME", "VARCHAR", null, 666 "TYPE", "SMALLINT", "NOT NULL", 667 "ORDINAL_POSITION", "SMALLINT", null, 668 "COLUMN_NAME", "VARCHAR", null, 669 "ASC_OR_DESC", "CHAR", null, 670 "CARDINALITY", "INTEGER", null, 671 "PAGES", "INTEGER", null, 672 "FILTER_CONDITION", "VARCHAR", null 673 674 }; 675 676 } 677 678 683 protected void checkODBCNamesAndTypes(ResultSet rs, int procId) 684 throws SQLException 685 { 686 687 ResultSetMetaData rsmd = rs.getMetaData(); 688 689 int numCols = rsmd.getColumnCount(); 690 int targetCols = odbcComplianceTargets[procId].length / 3; 691 if (numCols < targetCols) { 692 System.out.println( 695 " --> ODBC COMPLIANCE FAILED: Result set was missing columns."); 696 return; 697 } 698 699 for (int i = 1; i <= targetCols; i++) { 701 702 int offset = 3 * (i - 1); 703 if (!rsmd.getColumnLabel(i).equals(odbcComplianceTargets[procId][offset])) { 704 System.out.println( 705 "--> ODBC COMPLIANCE FAILED: Column name '" + rsmd.getColumnLabel(i) + 706 "' does not match expected name '" + 707 odbcComplianceTargets[procId][offset] + "'."); 708 } 709 if (!rsmd.getColumnTypeName(i).equals(odbcComplianceTargets[procId][offset + 1])) { 710 System.out.println( 711 "--> ODBC COMPLIANCE FAILED: Column type '" + rsmd.getColumnTypeName(i) + 712 "' does not match expected type '" + 713 odbcComplianceTargets[procId][offset + 1] + "' for column '" + 714 rsmd.getColumnLabel(i) + "'."); 715 } 716 717 } 718 719 System.out.println("==> ODBC type/name checking done."); 720 721 } 722 723 728 protected boolean badNullability(int odbcProc, String colName, 729 int colNum, boolean wasNull) 730 { 731 732 return (wasNull && 733 odbcComplianceTargets[odbcProc][3 * (colNum-1) + 2] != null); 734 735 } 736 737 private static String addQuotes(String str) { 738 739 if (str == null) 740 return "null"; 741 742 if (str.length() == 0) 743 return "''"; 744 745 if ((str.charAt(0) == '\'') && (str.charAt(str.length()-1) == '\'')) 746 return str; 748 749 return "'" + str + "'"; 750 751 } 752 753 } 754 755 | Popular Tags |