Skip to content

Commit ae4f8a3

Browse files
committed
WL#10544, Update MySQL 8.0 keywords list.
1 parent ed73654 commit ae4f8a3

File tree

7 files changed

+260
-41
lines changed

7 files changed

+260
-41
lines changed

CHANGES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
Version 8.0.12
55

6+
- WL#10544, Update MySQL 8.0 keywords list.
7+
68
- WL#11858, DevAPI: Core API v1 alignment.
79

810
- Fix for Bug#27652379, NPE FROM GETSESSION(PROPERTIES) WHEN HOST PARAMETER IS GIVEN IN SMALL LETTER.

src/main/core-api/java/com/mysql/cj/ServerVersion.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,30 @@ public String toString() {
7575
return String.format("%d.%d.%d", this.major, this.minor, this.subminor);
7676
}
7777

78+
@Override
79+
public boolean equals(Object obj) {
80+
if (this == obj) {
81+
return true;
82+
}
83+
if (obj == null || !ServerVersion.class.isAssignableFrom(obj.getClass())) {
84+
return false;
85+
}
86+
ServerVersion another = (ServerVersion) obj;
87+
if (this.getMajor() != another.getMajor() || this.getMinor() != another.getMinor() || this.getSubminor() != another.getSubminor()) {
88+
return false;
89+
}
90+
return true;
91+
}
92+
93+
@Override
94+
public int hashCode() {
95+
int hash = 23;
96+
hash += 19 * hash + this.major;
97+
hash += 19 * hash + this.minor;
98+
hash += 19 * hash + this.subminor;
99+
return hash;
100+
}
101+
78102
public int compareTo(ServerVersion other) {
79103
int c;
80104
if ((c = this.major.compareTo(other.getMajor())) != 0) {

src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaData.java

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -655,29 +655,31 @@ protected enum ProcedureType {
655655
// MySQL reserved words (all versions superset)
656656
private static final String[] MYSQL_KEYWORDS = new String[] { "ACCESSIBLE", "ADD", "ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "ASENSITIVE", "BEFORE",
657657
"BETWEEN", "BIGINT", "BINARY", "BLOB", "BOTH", "BY", "CALL", "CASCADE", "CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK", "COLLATE", "COLUMN",
658-
"CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT", "CREATE", "CROSS", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR",
659-
"DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE", "DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELAYED", "DELETE",
660-
"DESC", "DESCRIBE", "DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV", "DOUBLE", "DROP", "DUAL", "EACH", "ELSE", "ELSEIF", "ENCLOSED", "ESCAPED",
661-
"EXISTS", "EXIT", "EXPLAIN", "FALSE", "FETCH", "FLOAT", "FLOAT4", "FLOAT8", "FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "GENERATED", "GET",
662-
"GRANT", "GROUP", "HAVING", "HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IF", "IGNORE", "IN", "INDEX", "INFILE", "INNER",
663-
"INOUT", "INSENSITIVE", "INSERT", "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO", "IO_AFTER_GTIDS", "IO_BEFORE_GTIDS",
664-
"IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT", "LIKE", "LIMIT", "LINEAR", "LINES", "LOAD", "LOCALTIME",
665-
"LOCALTIMESTAMP", "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MASTER_BIND", "MASTER_SSL_VERIFY_SERVER_CERT", "MATCH",
666-
"MAXVALUE", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND", "MOD", "MODIFIES", "NATURAL", "NOT",
667-
"NO_WRITE_TO_BINLOG", "NULL", "NUMERIC", "ON", "OPTIMIZE", "OPTIMIZER_COSTS", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER", "OUTFILE",
668-
"PARTITION", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "RANGE", "READ", "READS", "READ_WRITE", "REAL", "REFERENCES", "REGEXP", "RELEASE",
669-
"RENAME", "REPEAT", "REPLACE", "REQUIRE", "RESIGNAL", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND",
670-
"SELECT", "SENSITIVE", "SEPARATOR", "SET", "SHOW", "SIGNAL", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE", "SQLWARNING",
671-
"SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT", "SSL", "STARTING", "STORED", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN",
658+
"CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT", "CREATE", "CROSS", "CUBE", "CUME_DIST", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP",
659+
"CURRENT_USER", "CURSOR", "DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE", "DAY_SECOND", "DEC", "DECIMAL", "DECLARE",
660+
"DEFAULT", "DELAYED", "DELETE", "DENSE_RANK", "DESC", "DESCRIBE", "DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV", "DOUBLE", "DROP", "DUAL",
661+
"EACH", "ELSE", "ELSEIF", "EMPTY", "ENCLOSED", "ESCAPED", "EXCEPT", "EXISTS", "EXIT", "EXPLAIN", "FALSE", "FETCH", "FIRST_VALUE", "FLOAT", "FLOAT4",
662+
"FLOAT8", "FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "FUNCTION", "GENERATED", "GET", "GRANT", "GROUP", "GROUPING", "GROUPS", "HAVING",
663+
"HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IF", "IGNORE", "IN", "INDEX", "INFILE", "INNER", "INOUT", "INSENSITIVE",
664+
"INSERT", "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO", "IO_AFTER_GTIDS", "IO_BEFORE_GTIDS", "IS", "ITERATE",
665+
"JOIN", "JSON_TABLE", "KEY", "KEYS", "KILL", "LAG", "LAST_VALUE", "LEAD", "LEADING", "LEAVE", "LEFT", "LIKE", "LIMIT", "LINEAR", "LINES", "LOAD",
666+
"LOCALTIME", "LOCALTIMESTAMP", "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MASTER_BIND", "MASTER_SSL_VERIFY_SERVER_CERT",
667+
"MATCH", "MAXVALUE", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND", "MOD", "MODIFIES", "NATURAL",
668+
"NOT", "NO_WRITE_TO_BINLOG", "NTH_VALUE", "NTILE", "NULL", "NUMERIC", "OF", "ON", "OPTIMIZE", "OPTIMIZER_COSTS", "OPTION", "OPTIONALLY", "OR",
669+
"ORDER", "OUT", "OUTER", "OUTFILE", "OVER", "PARTITION", "PERCENT_RANK", "PERSIST", "PERSIST_ONLY", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE",
670+
"RANGE", "RANK", "READ", "READS", "READ_WRITE", "REAL", "RECURSIVE", "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT", "REPLACE", "REQUIRE",
671+
"RESIGNAL", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE", "ROW", "ROWS", "ROW_NUMBER", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT",
672+
"SENSITIVE", "SEPARATOR", "SET", "SHOW", "SIGNAL", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE", "SQLWARNING",
673+
"SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT", "SSL", "STARTING", "STORED", "STRAIGHT_JOIN", "SYSTEM", "TABLE", "TERMINATED", "THEN",
672674
"TINYBLOB", "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION", "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE",
673675
"USING", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER", "VARYING", "VIRTUAL", "WHEN", "WHERE", "WHILE",
674-
"WITH", "WRITE", "XOR", "YEAR_MONTH", "ZEROFILL" };
676+
"WINDOW", "WITH", "WRITE", "XOR", "YEAR_MONTH", "ZEROFILL" };
675677

676678
// SQL:2003 reserved words from 'ISO/IEC 9075-2:2003 (E), 2003-07-25'
677-
private static final String[] SQL2003_KEYWORDS = new String[] { "ABS", "ALL", "ALLOCATE", "ALTER", "AND", "ANY", "ARE", "ARRAY", "AS", "ASENSITIVE",
678-
"ASYMMETRIC", "AT", "ATOMIC", "AUTHORIZATION", "AVG", "BEGIN", "BETWEEN", "BIGINT", "BINARY", "BLOB", "BOOLEAN", "BOTH", "BY", "CALL", "CALLED",
679-
"CARDINALITY", "CASCADED", "CASE", "CAST", "CEIL", "CEILING", "CHAR", "CHARACTER", "CHARACTER_LENGTH", "CHAR_LENGTH", "CHECK", "CLOB", "CLOSE",
680-
"COALESCE", "COLLATE", "COLLECT", "COLUMN", "COMMIT", "CONDITION", "CONNECT", "CONSTRAINT", "CONVERT", "CORR", "CORRESPONDING", "COUNT",
679+
/* package private */ static final List<String> SQL2003_KEYWORDS = Arrays.asList("ABS", "ALL", "ALLOCATE", "ALTER", "AND", "ANY", "ARE", "ARRAY", "AS",
680+
"ASENSITIVE", "ASYMMETRIC", "AT", "ATOMIC", "AUTHORIZATION", "AVG", "BEGIN", "BETWEEN", "BIGINT", "BINARY", "BLOB", "BOOLEAN", "BOTH", "BY", "CALL",
681+
"CALLED", "CARDINALITY", "CASCADED", "CASE", "CAST", "CEIL", "CEILING", "CHAR", "CHARACTER", "CHARACTER_LENGTH", "CHAR_LENGTH", "CHECK", "CLOB",
682+
"CLOSE", "COALESCE", "COLLATE", "COLLECT", "COLUMN", "COMMIT", "CONDITION", "CONNECT", "CONSTRAINT", "CONVERT", "CORR", "CORRESPONDING", "COUNT",
681683
"COVAR_POP", "COVAR_SAMP", "CREATE", "CROSS", "CUBE", "CUME_DIST", "CURRENT", "CURRENT_DATE", "CURRENT_DEFAULT_TRANSFORM_GROUP", "CURRENT_PATH",
682684
"CURRENT_ROLE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_TRANSFORM_GROUP_FOR_TYPE", "CURRENT_USER", "CURSOR", "CYCLE", "DATE", "DAY",
683685
"DEALLOCATE", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELETE", "DENSE_RANK", "DEREF", "DESCRIBE", "DETERMINISTIC", "DISCONNECT", "DISTINCT",
@@ -696,7 +698,7 @@ protected enum ProcedureType {
696698
"SYMMETRIC", "SYSTEM", "SYSTEM_USER", "TABLE", "TABLESAMPLE", "THEN", "TIME", "TIMESTAMP", "TIMEZONE_HOUR", "TIMEZONE_MINUTE", "TO", "TRAILING",
697699
"TRANSLATE", "TRANSLATION", "TREAT", "TRIGGER", "TRIM", "TRUE", "UESCAPE", "UNION", "UNIQUE", "UNKNOWN", "UNNEST", "UPDATE", "UPPER", "USER",
698700
"USING", "VALUE", "VALUES", "VARCHAR", "VARYING", "VAR_POP", "VAR_SAMP", "WHEN", "WHENEVER", "WHERE", "WIDTH_BUCKET", "WINDOW", "WITH", "WITHIN",
699-
"WITHOUT", "YEAR" };
701+
"WITHOUT", "YEAR");
700702

701703
private static volatile String mysqlKeywords = null;
702704

@@ -3424,7 +3426,7 @@ public String getSQLKeywords() throws SQLException {
34243426
StringBuilder mysqlKeywordsBuffer = new StringBuilder();
34253427

34263428
Collections.addAll(mysqlKeywordSet, MYSQL_KEYWORDS);
3427-
mysqlKeywordSet.removeAll(Arrays.asList(SQL2003_KEYWORDS));
3429+
mysqlKeywordSet.removeAll(SQL2003_KEYWORDS);
34283430

34293431
for (String keyword : mysqlKeywordSet) {
34303432
mysqlKeywordsBuffer.append(",").append(keyword);

src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaDataUsingInfoSchema.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,30 @@
3131

3232
import java.sql.ResultSet;
3333
import java.sql.SQLException;
34+
import java.sql.Statement;
35+
import java.util.ArrayList;
36+
import java.util.Collections;
3437
import java.util.List;
38+
import java.util.Map;
3539

3640
import com.mysql.cj.Messages;
3741
import com.mysql.cj.MysqlType;
42+
import com.mysql.cj.ServerVersion;
3843
import com.mysql.cj.conf.PropertyDefinitions;
3944
import com.mysql.cj.exceptions.MysqlErrorNumbers;
4045
import com.mysql.cj.jdbc.exceptions.SQLError;
4146
import com.mysql.cj.jdbc.result.ResultSetFactory;
4247
import com.mysql.cj.result.Field;
48+
import com.mysql.cj.util.LRUCache;
4349
import com.mysql.cj.util.StringUtils;
4450

4551
/**
4652
* DatabaseMetaData implementation that uses INFORMATION_SCHEMA
4753
*/
4854
public class DatabaseMetaDataUsingInfoSchema extends DatabaseMetaData {
4955

56+
private static Map<ServerVersion, String> keywordsCache = Collections.synchronizedMap(new LRUCache<>(10));
57+
5058
protected enum FunctionConstant {
5159
// COLUMN_TYPE values
5260
FUNCTION_COLUMN_UNKNOWN, FUNCTION_COLUMN_IN, FUNCTION_COLUMN_INOUT, FUNCTION_COLUMN_OUT, FUNCTION_COLUMN_RETURN, FUNCTION_COLUMN_RESULT,
@@ -1103,6 +1111,40 @@ public java.sql.ResultSet getFunctions(String catalog, String schemaPattern, Str
11031111
}
11041112
}
11051113

1114+
@Override
1115+
public String getSQLKeywords() throws SQLException {
1116+
if (!this.conn.getServerVersion().meetsMinimum(ServerVersion.parseVersion("8.0.11"))) {
1117+
return super.getSQLKeywords();
1118+
}
1119+
1120+
String keywords = keywordsCache.get(this.conn.getServerVersion());
1121+
if (keywords != null) {
1122+
return keywords;
1123+
}
1124+
1125+
synchronized (keywordsCache) {
1126+
// Double check, maybe another thread already added it.
1127+
keywords = keywordsCache.get(this.conn.getServerVersion());
1128+
if (keywords != null) {
1129+
return keywords;
1130+
}
1131+
1132+
List<String> keywordsFromServer = new ArrayList<>();
1133+
Statement stmt = this.conn.getMetadataSafeStatement();
1134+
ResultSet rs = stmt.executeQuery("SELECT WORD FROM INFORMATION_SCHEMA.KEYWORDS WHERE RESERVED=1 ORDER BY WORD");
1135+
while (rs.next()) {
1136+
keywordsFromServer.add(rs.getString(1));
1137+
}
1138+
stmt.close();
1139+
1140+
keywordsFromServer.removeAll(SQL2003_KEYWORDS);
1141+
keywords = String.join(",", keywordsFromServer);
1142+
1143+
keywordsCache.put(this.conn.getServerVersion(), keywords);
1144+
return keywords;
1145+
}
1146+
}
1147+
11061148
private final void appendJdbcTypeMappingQuery(StringBuilder buf, String mysqlTypeColumnName, String fullMysqlTypeColumnName) {
11071149

11081150
buf.append("CASE ");

src/test/java/com/mysql/cj/ServerVersionTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131

3232
import static org.junit.Assert.assertEquals;
3333
import static org.junit.Assert.assertFalse;
34+
import static org.junit.Assert.assertNotEquals;
35+
import static org.junit.Assert.assertNotSame;
36+
import static org.junit.Assert.assertSame;
3437
import static org.junit.Assert.assertTrue;
3538

3639
import org.junit.Test;
@@ -99,4 +102,44 @@ public void testComparison() {
99102
assertTrue(v202.compareTo(v101) > 0);
100103
assertTrue(v202.compareTo(v200) > 0);
101104
}
105+
106+
@Test
107+
public void testEqualsAndHash() {
108+
ServerVersion v123a = new ServerVersion(1, 2, 3);
109+
ServerVersion v123b = new ServerVersion(1, 2, 3);
110+
ServerVersion v123c = new ServerVersion("1.2.3", 1, 2, 3);
111+
ServerVersion v123d = new ServerVersion("1.2.3-something", 1, 2, 3);
112+
ServerVersion v123e = ServerVersion.parseVersion("1.2.3");
113+
ServerVersion v123f = ServerVersion.parseVersion("1.2.3-something");
114+
ServerVersion[] versions = new ServerVersion[] { v123a, v123b, v123c, v123d, v123e, v123f };
115+
ServerVersion v321a = new ServerVersion(3, 2, 1);
116+
ServerVersion v321b = ServerVersion.parseVersion("3.2.1");
117+
118+
for (int i = 0; i < versions.length; i++) {
119+
ServerVersion v1 = versions[i];
120+
for (int j = 0; j < versions.length; j++) {
121+
ServerVersion v2 = versions[j];
122+
if (i == j) {
123+
assertSame(v1, v2);
124+
} else {
125+
assertNotSame(v1, v2);
126+
}
127+
assertEquals(v1, v2);
128+
assertTrue(v1.equals(v2));
129+
assertEquals(v1.hashCode(), v2.hashCode());
130+
131+
assertNotSame(v1, v321a);
132+
assertNotEquals(v1, v321a);
133+
assertFalse(v1.equals(v321a));
134+
assertFalse(v321a.equals(v1));
135+
assertNotEquals(v1.hashCode(), v321a.hashCode());
136+
137+
assertNotSame(v1, v321b);
138+
assertNotEquals(v1, v321b);
139+
assertFalse(v1.equals(v321b));
140+
assertFalse(v321b.equals(v1));
141+
assertNotEquals(v1.hashCode(), v321b.hashCode());
142+
}
143+
}
144+
}
102145
}

src/test/java/testsuite/regression/MetaDataRegressionTest.java

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3892,26 +3892,6 @@ public void testBug35115() throws Exception {
38923892
testConnection.close();
38933893
}
38943894

3895-
/*
3896-
* Tests DatabaseMetaData.getSQLKeywords().
3897-
* (Related to BUG#70701 - DatabaseMetaData.getSQLKeywords() doesn't match MySQL 5.6 reserved words)
3898-
*
3899-
* The keywords list that this method returns depends on JDBC version.
3900-
*
3901-
* @throws Exception if the test fails.
3902-
*/
3903-
public void testReservedWords() throws Exception {
3904-
final String mysqlKeywords = "ACCESSIBLE,ADD,ANALYZE,ASC,BEFORE,CASCADE,CHANGE,CONTINUE,DATABASE,DATABASES,DAY_HOUR,DAY_MICROSECOND,DAY_MINUTE,"
3905-
+ "DAY_SECOND,DELAYED,DESC,DISTINCTROW,DIV,DUAL,ELSEIF,ENCLOSED,ESCAPED,EXIT,EXPLAIN,FLOAT4,FLOAT8,FORCE,FULLTEXT,GENERATED,HIGH_PRIORITY,"
3906-
+ "HOUR_MICROSECOND,HOUR_MINUTE,HOUR_SECOND,IF,IGNORE,INDEX,INFILE,INT1,INT2,INT3,INT4,INT8,IO_AFTER_GTIDS,IO_BEFORE_GTIDS,ITERATE,KEY,KEYS,"
3907-
+ "KILL,LEAVE,LIMIT,LINEAR,LINES,LOAD,LOCK,LONG,LONGBLOB,LONGTEXT,LOOP,LOW_PRIORITY,MASTER_BIND,MASTER_SSL_VERIFY_SERVER_CERT,MAXVALUE,"
3908-
+ "MEDIUMBLOB,MEDIUMINT,MEDIUMTEXT,MIDDLEINT,MINUTE_MICROSECOND,MINUTE_SECOND,NO_WRITE_TO_BINLOG,OPTIMIZE,OPTIMIZER_COSTS,OPTION,OPTIONALLY,"
3909-
+ "OUTFILE,PURGE,READ,READ_WRITE,REGEXP,RENAME,REPEAT,REPLACE,REQUIRE,RESIGNAL,RESTRICT,RLIKE,SCHEMA,SCHEMAS,SECOND_MICROSECOND,SEPARATOR,SHOW,"
3910-
+ "SIGNAL,SPATIAL,SQL_BIG_RESULT,SQL_CALC_FOUND_ROWS,SQL_SMALL_RESULT,SSL,STARTING,STORED,STRAIGHT_JOIN,TERMINATED,TINYBLOB,TINYINT,TINYTEXT,"
3911-
+ "UNDO,UNLOCK,UNSIGNED,USAGE,USE,UTC_DATE,UTC_TIME,UTC_TIMESTAMP,VARBINARY,VARCHARACTER,VIRTUAL,WHILE,WRITE,XOR,YEAR_MONTH,ZEROFILL";
3912-
assertEquals("MySQL keywords don't match expected.", mysqlKeywords, this.conn.getMetaData().getSQLKeywords());
3913-
}
3914-
39153895
/**
39163896
* Tests fix for BUG#68307 - getFunctionColumns() returns incorrect "COLUMN_TYPE" information. This is a JDBC4
39173897
* feature.

0 commit comments

Comments
 (0)