|
13 | 13 | import com.clickhouse.jdbc.internal.JdbcUtils; |
14 | 14 | import com.clickhouse.logging.Logger; |
15 | 15 | import com.clickhouse.logging.LoggerFactory; |
| 16 | +import com.google.common.collect.ImmutableMap; |
16 | 17 |
|
17 | 18 | import java.sql.Connection; |
18 | 19 | import java.sql.JDBCType; |
@@ -1344,9 +1345,129 @@ public ResultSet getTypeInfo() throws SQLException { |
1344 | 1345 | row.put("DATA_TYPE", type.getVendorTypeNumber()); |
1345 | 1346 | }; |
1346 | 1347 |
|
| 1348 | + private static class TypeLiteralInfo { |
| 1349 | + private final String prefix; |
| 1350 | + private final String suffix; |
| 1351 | + TypeLiteralInfo(String prefix, String suffix){ |
| 1352 | + this.prefix = prefix; |
| 1353 | + this.suffix = suffix; |
| 1354 | + } |
| 1355 | + |
| 1356 | + public String getPrefix() { |
| 1357 | + return prefix; |
| 1358 | + } |
| 1359 | + |
| 1360 | + public String getSuffix() { |
| 1361 | + return suffix; |
| 1362 | + } |
| 1363 | + } |
| 1364 | + |
| 1365 | + private static final Map<String, TypeLiteralInfo> TYPE_LITERAL_INFO_MAP; |
| 1366 | + static { |
| 1367 | + ImmutableMap.Builder<String, TypeLiteralInfo> mBuilder = ImmutableMap.builder(); |
| 1368 | + // --------------------------------------------------------- |
| 1369 | + // Core String, Text & Binary Types |
| 1370 | + // --------------------------------------------------------- |
| 1371 | + mBuilder.put("String", new TypeLiteralInfo("'", "'")); |
| 1372 | + mBuilder.put("FixedString", new TypeLiteralInfo("'", "'")); |
| 1373 | + mBuilder.put("UUID", new TypeLiteralInfo("'", "'")); |
| 1374 | + |
| 1375 | + // Aliased String/Binary Types from your list |
| 1376 | + mBuilder.put("BINARY", new TypeLiteralInfo("'", "'")); |
| 1377 | + mBuilder.put("NATIONAL CHAR VARYING", new TypeLiteralInfo("'", "'")); |
| 1378 | + mBuilder.put("BINARY VARYING", new TypeLiteralInfo("'", "'")); |
| 1379 | + mBuilder.put("NCHAR LARGE OBJECT", new TypeLiteralInfo("'", "'")); |
| 1380 | + mBuilder.put("NATIONAL CHARACTER VARYING", new TypeLiteralInfo("'", "'")); |
| 1381 | + mBuilder.put("NATIONAL CHARACTER LARGE OBJECT", new TypeLiteralInfo("'", "'")); |
| 1382 | + mBuilder.put("NATIONAL CHAR", new TypeLiteralInfo("'", "'")); |
| 1383 | + mBuilder.put("CHAR LARGE OBJECT", new TypeLiteralInfo("'", "'")); |
| 1384 | + mBuilder.put("CHARACTER VARYING", new TypeLiteralInfo("'", "'")); |
| 1385 | + mBuilder.put("NATIONAL CHARACTER", new TypeLiteralInfo("'", "'")); |
| 1386 | + mBuilder.put("LONGBLOB", new TypeLiteralInfo("'", "'")); |
| 1387 | + mBuilder.put("CHAR VARYING", new TypeLiteralInfo("'", "'")); |
| 1388 | + mBuilder.put("MEDIUMBLOB", new TypeLiteralInfo("'", "'")); |
| 1389 | + mBuilder.put("CLOB", new TypeLiteralInfo("'", "'")); |
| 1390 | + mBuilder.put("LONGTEXT", new TypeLiteralInfo("'", "'")); |
| 1391 | + mBuilder.put("MEDIUMTEXT", new TypeLiteralInfo("'", "'")); |
| 1392 | + mBuilder.put("TINYTEXT", new TypeLiteralInfo("'", "'")); |
| 1393 | + mBuilder.put("NVARCHAR", new TypeLiteralInfo("'", "'")); |
| 1394 | + mBuilder.put("TINYBLOB", new TypeLiteralInfo("'", "'")); |
| 1395 | + mBuilder.put("CHARACTER", new TypeLiteralInfo("'", "'")); |
| 1396 | + mBuilder.put("CHAR", new TypeLiteralInfo("'", "'")); |
| 1397 | + mBuilder.put("BLOB", new TypeLiteralInfo("'", "'")); |
| 1398 | + mBuilder.put("VARCHAR2", new TypeLiteralInfo("'", "'")); |
| 1399 | + mBuilder.put("TEXT", new TypeLiteralInfo("'", "'")); |
| 1400 | + mBuilder.put("NCHAR", new TypeLiteralInfo("'", "'")); |
| 1401 | + mBuilder.put("NCHAR VARYING", new TypeLiteralInfo("'", "'")); |
| 1402 | + mBuilder.put("BINARY LARGE OBJECT", new TypeLiteralInfo("'", "'")); |
| 1403 | + mBuilder.put("VARBINARY", new TypeLiteralInfo("'", "'")); |
| 1404 | + mBuilder.put("BYTEA", new TypeLiteralInfo("'", "'")); |
| 1405 | + mBuilder.put("VARCHAR", new TypeLiteralInfo("'", "'")); |
| 1406 | + |
| 1407 | + // --------------------------------------------------------- |
| 1408 | + // Date & Time Types (including aliases) |
| 1409 | + // --------------------------------------------------------- |
| 1410 | + mBuilder.put("DateTime", new TypeLiteralInfo("'", "'")); |
| 1411 | + mBuilder.put("DateTime32", new TypeLiteralInfo("'", "'")); |
| 1412 | + mBuilder.put("DateTime64", new TypeLiteralInfo("'", "'")); |
| 1413 | + mBuilder.put("Date", new TypeLiteralInfo("'", "'")); |
| 1414 | + mBuilder.put("Date32", new TypeLiteralInfo("'", "'")); |
| 1415 | + mBuilder.put("Time", new TypeLiteralInfo("'", "'")); |
| 1416 | + mBuilder.put("Time64", new TypeLiteralInfo("'", "'")); |
| 1417 | + mBuilder.put("TIMESTAMP", new TypeLiteralInfo("'", "'")); |
| 1418 | + |
| 1419 | + // --------------------------------------------------------- |
| 1420 | + // Network Types (including aliases) |
| 1421 | + // --------------------------------------------------------- |
| 1422 | + mBuilder.put("IPv4", new TypeLiteralInfo("'", "'")); |
| 1423 | + mBuilder.put("IPv6", new TypeLiteralInfo("'", "'")); |
| 1424 | + mBuilder.put("INET4", new TypeLiteralInfo("'", "'")); |
| 1425 | + mBuilder.put("INET6", new TypeLiteralInfo("'", "'")); |
| 1426 | + |
| 1427 | + // --------------------------------------------------------- |
| 1428 | + // Enum Types (including aliases) |
| 1429 | + // --------------------------------------------------------- |
| 1430 | + mBuilder.put("Enum", new TypeLiteralInfo("'", "'")); |
| 1431 | + mBuilder.put("Enum8", new TypeLiteralInfo("'", "'")); |
| 1432 | + mBuilder.put("Enum16", new TypeLiteralInfo("'", "'")); |
| 1433 | + mBuilder.put("ENUM", new TypeLiteralInfo("'", "'")); |
| 1434 | + |
| 1435 | + // --------------------------------------------------------- |
| 1436 | + // Complex / Collection Types |
| 1437 | + // --------------------------------------------------------- |
| 1438 | + mBuilder.put("Array", new TypeLiteralInfo("[", "]")); |
| 1439 | + mBuilder.put("Map", new TypeLiteralInfo("{", "}")); |
| 1440 | + mBuilder.put("Tuple", new TypeLiteralInfo("(", ")")); |
| 1441 | + mBuilder.put("AggregateFunction", new TypeLiteralInfo("(", ")")); |
| 1442 | + mBuilder.put("SimpleAggregateFunction", new TypeLiteralInfo("(", ")")); |
| 1443 | + |
| 1444 | + // --------------------------------------------------------- |
| 1445 | + // Geo Types |
| 1446 | + // --------------------------------------------------------- |
| 1447 | + mBuilder.put("Point", new TypeLiteralInfo("(", ")")); |
| 1448 | + mBuilder.put("Ring", new TypeLiteralInfo("[", "]")); |
| 1449 | + mBuilder.put("Polygon", new TypeLiteralInfo("[", "]")); |
| 1450 | + mBuilder.put("MultiPolygon", new TypeLiteralInfo("[", "]")); |
| 1451 | + mBuilder.put("LineString", new TypeLiteralInfo("[", "]")); |
| 1452 | + mBuilder.put("MultiLineString", new TypeLiteralInfo("[", "]")); |
| 1453 | + |
| 1454 | + TYPE_LITERAL_INFO_MAP = mBuilder.buildOrThrow(); |
| 1455 | + } |
| 1456 | + |
| 1457 | + private static final Consumer<Map<String, Object>> TYPE_INFO_LITERAL_FUNCTION = row -> { |
| 1458 | + String typeName = (String) row.get("TYPE_NAME"); |
| 1459 | + |
| 1460 | + TypeLiteralInfo literalInfo = TYPE_LITERAL_INFO_MAP.get(typeName); |
| 1461 | + if (literalInfo != null) { |
| 1462 | + row.put("LITERAL_PREFIX", literalInfo.getPrefix()); |
| 1463 | + row.put("LITERAL_SUFFIX", literalInfo.getSuffix()); |
| 1464 | + } |
| 1465 | + }; |
| 1466 | + |
1347 | 1467 | private static final List<Consumer<Map<String, Object>>> GET_TYPE_INFO_MUTATORS = Arrays.asList( |
1348 | 1468 | TYPE_INFO_VALUE_FUNCTION, |
1349 | | - NULLABILITY_VALUE_FUNCTION |
| 1469 | + NULLABILITY_VALUE_FUNCTION, |
| 1470 | + TYPE_INFO_LITERAL_FUNCTION |
1350 | 1471 | ); |
1351 | 1472 |
|
1352 | 1473 | private static final String DATA_TYPE_INFO_SQL = getDataTypeInfoSql(); |
|
0 commit comments