|
2 | 2 |
|
3 | 3 | import static java.lang.System.lineSeparator; |
4 | 4 |
|
5 | | -import java.sql.Connection; |
6 | | -import java.sql.DatabaseMetaData; |
7 | | -import java.sql.PreparedStatement; |
8 | | -import java.sql.ResultSet; |
9 | | -import java.sql.RowIdLifetime; |
10 | | -import java.sql.SQLException; |
11 | | -import java.sql.SQLFeatureNotSupportedException; |
12 | | -import java.sql.Statement; |
13 | | -import java.sql.Types; |
| 5 | +import java.sql.*; |
14 | 6 | import java.util.Arrays; |
| 7 | +import java.util.List; |
15 | 8 | import java.util.Map; |
16 | 9 | import java.util.stream.Collectors; |
17 | 10 |
|
@@ -1109,7 +1102,62 @@ public ResultSet getCrossReference(String parentCatalog, String parentSchema, St |
1109 | 1102 |
|
1110 | 1103 | @Override |
1111 | 1104 | public ResultSet getTypeInfo() throws SQLException { |
1112 | | - throw new SQLFeatureNotSupportedException("getTypeInfo"); |
| 1105 | + List<TypeInfoEntry> entries = Arrays.asList(new TypeInfoEntry("BOOLEAN", Types.BIT, typePredBasic), |
| 1106 | + new TypeInfoEntry("TINYINT", Types.TINYINT, typePredBasic), |
| 1107 | + new TypeInfoEntry("SMALLINT", Types.SMALLINT, typePredBasic), |
| 1108 | + new TypeInfoEntry("INTEGER", Types.INTEGER, typePredBasic), |
| 1109 | + new TypeInfoEntry("BIGINT", Types.BIGINT, typePredBasic), |
| 1110 | + new TypeInfoEntry("BIGINT", Types.BIGINT, typePredBasic), |
| 1111 | + new TypeInfoEntry("FLOAT", Types.FLOAT, typePredBasic), |
| 1112 | + new TypeInfoEntry("REAL", Types.REAL, typePredBasic), |
| 1113 | + new TypeInfoEntry("DOUBLE", Types.DOUBLE, typePredBasic), |
| 1114 | + new TypeInfoEntry("DECIMAL", Types.NUMERIC, typePredBasic, 0, 38), |
| 1115 | + new TypeInfoEntry("DECIMAL", Types.DECIMAL, typePredBasic, 0, 38), |
| 1116 | + new TypeInfoEntry("VARCHAR", Types.CHAR, typePredChar), |
| 1117 | + new TypeInfoEntry("VARCHAR", Types.VARCHAR, typePredChar), |
| 1118 | + new TypeInfoEntry("VARCHAR", Types.LONGVARCHAR, typePredChar), |
| 1119 | + new TypeInfoEntry("DATE", Types.DATE, typePredBasic), |
| 1120 | + new TypeInfoEntry("TIME", Types.TIME, typePredBasic), |
| 1121 | + new TypeInfoEntry("TIMESTAMP", Types.TIMESTAMP, typePredBasic), |
| 1122 | + new TypeInfoEntry("BLOB", Types.BINARY, typePredChar), |
| 1123 | + new TypeInfoEntry("BLOB", Types.VARBINARY, typePredChar), |
| 1124 | + new TypeInfoEntry("BLOB", Types.LONGVARBINARY, typePredChar), |
| 1125 | + new TypeInfoEntry("NULL", Types.LONGVARBINARY, typePredBasic)); |
| 1126 | + |
| 1127 | + StringBuilder sb = new StringBuilder(QUERY_SB_DEFAULT_CAPACITY); |
| 1128 | + boolean first = true; |
| 1129 | + for (TypeInfoEntry en : entries) { |
| 1130 | + if (first) { |
| 1131 | + sb.append("SELECT").append(lineSeparator()); |
| 1132 | + first = false; |
| 1133 | + } else { |
| 1134 | + sb.append("UNION ALL SELECT").append(lineSeparator()); |
| 1135 | + } |
| 1136 | + sb.append(" '" + en.name + "'::VARCHAR AS TYPE_NAME").append(TRAILING_COMMA).append(lineSeparator()); |
| 1137 | + sb.append(" " + en.sqlType + "::INTEGER AS DATA_TYPE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1138 | + sb.append(" 0::INTEGER AS PRECISION").append(TRAILING_COMMA).append(lineSeparator()); |
| 1139 | + sb.append(" NULL::VARCHAR AS LITERAL_PREFIX").append(TRAILING_COMMA).append(lineSeparator()); |
| 1140 | + sb.append(" NULL::VARCHAR AS LITERAL_SUFFIX").append(TRAILING_COMMA).append(lineSeparator()); |
| 1141 | + sb.append(" NULL::VARCHAR AS CREATE_PARAMS").append(TRAILING_COMMA).append(lineSeparator()); |
| 1142 | + sb.append(" " + typeNullableUnknown + "::SMALLINT AS NULLABLE") |
| 1143 | + .append(TRAILING_COMMA) |
| 1144 | + .append(lineSeparator()); |
| 1145 | + sb.append(" TRUE::BOOL AS CASE_SENSITIVE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1146 | + sb.append(" " + en.searchable + "::SMALLINT AS SEARCHABLE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1147 | + sb.append(" FALSE::BOOL AS UNSIGNED_ATTRIBUTE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1148 | + sb.append(" FALSE::BOOL AS FIXED_PREC_SCALE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1149 | + sb.append(" FALSE::BOOL AS AUTO_INCREMENT").append(TRAILING_COMMA).append(lineSeparator()); |
| 1150 | + sb.append(" NULL::VARCHAR AS LOCAL_TYPE_NAME").append(TRAILING_COMMA).append(lineSeparator()); |
| 1151 | + sb.append(" 0::SMALLINT AS MINIMUM_SCALE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1152 | + sb.append(" 0::SMALLINT AS MAXIMUM_SCALE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1153 | + sb.append(" 0::INTEGER AS SQL_DATA_TYPE").append(TRAILING_COMMA).append(lineSeparator()); |
| 1154 | + sb.append(" 0::INTEGER AS SQL_DATETIME_SUB").append(TRAILING_COMMA).append(lineSeparator()); |
| 1155 | + sb.append(" 10::INTEGER AS NUM_PREC_RADIX").append(TRAILING_COMMA).append(lineSeparator()); |
| 1156 | + } |
| 1157 | + |
| 1158 | + PreparedStatement ps = conn.prepareStatement(sb.toString()); |
| 1159 | + ps.closeOnCompletion(); |
| 1160 | + return ps.executeQuery(); |
1113 | 1161 | } |
1114 | 1162 |
|
1115 | 1163 | @Override |
@@ -1492,4 +1540,28 @@ private static String nullPatternToWildcard(String pattern) { |
1492 | 1540 | } |
1493 | 1541 | return pattern; |
1494 | 1542 | } |
| 1543 | + |
| 1544 | + private static class TypeInfoEntry { |
| 1545 | + final String name; |
| 1546 | + final int sqlType; |
| 1547 | + final int searchable; |
| 1548 | + final int precision; |
| 1549 | + final int scale; |
| 1550 | + |
| 1551 | + private TypeInfoEntry(String name, int sqlType, int searchable) { |
| 1552 | + this.name = name; |
| 1553 | + this.sqlType = sqlType; |
| 1554 | + this.searchable = searchable; |
| 1555 | + this.precision = 0; |
| 1556 | + this.scale = 0; |
| 1557 | + } |
| 1558 | + |
| 1559 | + public TypeInfoEntry(String name, int sqlType, int searchable, int precision, int scale) { |
| 1560 | + this.name = name; |
| 1561 | + this.sqlType = sqlType; |
| 1562 | + this.searchable = searchable; |
| 1563 | + this.precision = precision; |
| 1564 | + this.scale = scale; |
| 1565 | + } |
| 1566 | + } |
1495 | 1567 | } |
0 commit comments