|
9 | 9 | import java.text.ParseException;
|
10 | 10 | import java.util.*;
|
11 | 11 | import org.mariadb.jdbc.client.DataType;
|
| 12 | +import org.mariadb.jdbc.client.ServerVersion; |
12 | 13 | import org.mariadb.jdbc.client.result.CompleteResult;
|
13 | 14 | import org.mariadb.jdbc.client.result.Result;
|
14 | 15 | import org.mariadb.jdbc.util.VersionFactory;
|
@@ -823,43 +824,60 @@ public ResultSet getColumns(
|
823 | 824 | String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
|
824 | 825 | throws SQLException {
|
825 | 826 |
|
826 |
| - StringBuilder sb = |
827 |
| - new StringBuilder( |
828 |
| - "SELECT TABLE_SCHEMA TABLE_CAT, NULL TABLE_SCHEM, TABLE_NAME, COLUMN_NAME," |
829 |
| - + dataTypeClause("COLUMN_TYPE") |
830 |
| - + " DATA_TYPE," |
831 |
| - + DataTypeClause(conf) |
832 |
| - + " TYPE_NAME, " |
833 |
| - + " CASE DATA_TYPE" |
834 |
| - + " WHEN 'time' THEN " |
835 |
| - + "IF(DATETIME_PRECISION = 0, 10, CAST(11 + DATETIME_PRECISION as signed integer))" |
836 |
| - + " WHEN 'date' THEN 10" |
837 |
| - + " WHEN 'datetime' THEN " |
838 |
| - + "IF(DATETIME_PRECISION = 0, 19, CAST(20 + DATETIME_PRECISION as signed integer))" |
839 |
| - + " WHEN 'timestamp' THEN " |
840 |
| - + "IF(DATETIME_PRECISION = 0, 19, CAST(20 + DATETIME_PRECISION as signed integer))" |
841 |
| - + (conf.yearIsDateType() ? "" : " WHEN 'year' THEN 5") |
842 |
| - + " ELSE " |
843 |
| - + " IF(NUMERIC_PRECISION IS NULL, LEAST(CHARACTER_MAXIMUM_LENGTH," |
844 |
| - + Integer.MAX_VALUE |
845 |
| - + "), NUMERIC_PRECISION) " |
846 |
| - + " END" |
847 |
| - + " COLUMN_SIZE, 65535 BUFFER_LENGTH, " |
848 |
| - + " CONVERT (CASE DATA_TYPE" |
849 |
| - + " WHEN 'year' THEN " |
850 |
| - + (conf.yearIsDateType() ? "NUMERIC_SCALE" : "0") |
851 |
| - + " WHEN 'tinyint' THEN " |
852 |
| - + (conf.tinyInt1isBit() ? "0" : "NUMERIC_SCALE") |
853 |
| - + " ELSE NUMERIC_SCALE END, UNSIGNED INTEGER) DECIMAL_DIGITS," |
854 |
| - + " 10 NUM_PREC_RADIX, IF(IS_NULLABLE = 'yes',1,0) NULLABLE,COLUMN_COMMENT REMARKS," |
855 |
| - + " COLUMN_DEFAULT COLUMN_DEF, 0 SQL_DATA_TYPE, 0 SQL_DATETIME_SUB, " |
856 |
| - + " LEAST(CHARACTER_OCTET_LENGTH," |
857 |
| - + Integer.MAX_VALUE |
858 |
| - + ") CHAR_OCTET_LENGTH," |
859 |
| - + " ORDINAL_POSITION, IS_NULLABLE, NULL SCOPE_CATALOG, NULL SCOPE_SCHEMA, NULL SCOPE_TABLE, NULL SOURCE_DATA_TYPE," |
860 |
| - + " IF(EXTRA = 'auto_increment','YES','NO') IS_AUTOINCREMENT, " |
861 |
| - + " IF(EXTRA in ('VIRTUAL', 'PERSISTENT', 'VIRTUAL GENERATED', 'STORED GENERATED') ,'YES','NO') IS_GENERATEDCOLUMN " |
862 |
| - + " FROM INFORMATION_SCHEMA.COLUMNS"); |
| 827 | + ServerVersion version = connection.getContext().getVersion(); |
| 828 | + boolean supportsFractionalSeconds = |
| 829 | + version.isMariaDBServer() |
| 830 | + /* "In MariaDB 5.3 and later, the TIME, DATETIME, and TIMESTAMP types, along with the temporal |
| 831 | + functions, CAST and dynamic columns, now support microseconds." |
| 832 | + https://web.archive.org/web/20130928042640/https://mariadb.com/kb/en/microseconds-in-mariadb/ |
| 833 | + */ |
| 834 | + ? version.versionGreaterOrEqual(5, 3, 0) |
| 835 | + // See https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-4.html |
| 836 | + : version.versionGreaterOrEqual(5, 6, 4); |
| 837 | + StringBuilder sb = new StringBuilder(); |
| 838 | + sb.append( |
| 839 | + "SELECT TABLE_SCHEMA TABLE_CAT, NULL TABLE_SCHEM, TABLE_NAME, COLUMN_NAME," |
| 840 | + + dataTypeClause("COLUMN_TYPE") |
| 841 | + + " DATA_TYPE," |
| 842 | + + DataTypeClause(conf) |
| 843 | + + " TYPE_NAME, " |
| 844 | + + " CASE DATA_TYPE" |
| 845 | + + " WHEN 'date' THEN 10"); |
| 846 | + if (supportsFractionalSeconds) { |
| 847 | + sb.append( |
| 848 | + " WHEN 'time' THEN " |
| 849 | + + "IF(DATETIME_PRECISION = 0, 10, CAST(11 + DATETIME_PRECISION as signed integer))" |
| 850 | + + " WHEN 'datetime' THEN " |
| 851 | + + "IF(DATETIME_PRECISION = 0, 19, CAST(20 + DATETIME_PRECISION as signed integer))" |
| 852 | + + " WHEN 'timestamp' THEN " |
| 853 | + + "IF(DATETIME_PRECISION = 0, 19, CAST(20 + DATETIME_PRECISION as signed integer))"); |
| 854 | + } else { |
| 855 | + // Older versions do not include the DATETIME_PRECISION column in INFORMATION_SCHEMA.COLUMNS. |
| 856 | + sb.append(" WHEN 'time' THEN 10 WHEN 'datetime' THEN 19 WHEN 'timestamp' THEN 19"); |
| 857 | + } |
| 858 | + sb.append( |
| 859 | + (conf.yearIsDateType() ? "" : " WHEN 'year' THEN 5") |
| 860 | + + " ELSE " |
| 861 | + + " IF(NUMERIC_PRECISION IS NULL, LEAST(CHARACTER_MAXIMUM_LENGTH," |
| 862 | + + Integer.MAX_VALUE |
| 863 | + + "), NUMERIC_PRECISION) " |
| 864 | + + " END" |
| 865 | + + " COLUMN_SIZE, 65535 BUFFER_LENGTH, " |
| 866 | + + " CONVERT (CASE DATA_TYPE" |
| 867 | + + " WHEN 'year' THEN " |
| 868 | + + (conf.yearIsDateType() ? "NUMERIC_SCALE" : "0") |
| 869 | + + " WHEN 'tinyint' THEN " |
| 870 | + + (conf.tinyInt1isBit() ? "0" : "NUMERIC_SCALE") |
| 871 | + + " ELSE NUMERIC_SCALE END, UNSIGNED INTEGER) DECIMAL_DIGITS," |
| 872 | + + " 10 NUM_PREC_RADIX, IF(IS_NULLABLE = 'yes',1,0) NULLABLE,COLUMN_COMMENT REMARKS," |
| 873 | + + " COLUMN_DEFAULT COLUMN_DEF, 0 SQL_DATA_TYPE, 0 SQL_DATETIME_SUB, " |
| 874 | + + " LEAST(CHARACTER_OCTET_LENGTH," |
| 875 | + + Integer.MAX_VALUE |
| 876 | + + ") CHAR_OCTET_LENGTH," |
| 877 | + + " ORDINAL_POSITION, IS_NULLABLE, NULL SCOPE_CATALOG, NULL SCOPE_SCHEMA, NULL SCOPE_TABLE, NULL SOURCE_DATA_TYPE," |
| 878 | + + " IF(EXTRA = 'auto_increment','YES','NO') IS_AUTOINCREMENT, " |
| 879 | + + " IF(EXTRA in ('VIRTUAL', 'PERSISTENT', 'VIRTUAL GENERATED', 'STORED GENERATED') ,'YES','NO') IS_GENERATEDCOLUMN " |
| 880 | + + " FROM INFORMATION_SCHEMA.COLUMNS"); |
863 | 881 | boolean firstCondition = catalogCond(true, sb, "TABLE_SCHEMA", catalog);
|
864 | 882 | firstCondition = patternCond(firstCondition, sb, "TABLE_NAME", tableNamePattern);
|
865 | 883 | firstCondition = patternCond(firstCondition, sb, "COLUMN_NAME", columnNamePattern);
|
|
0 commit comments