in src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaDataUsingInfoSchema.java [119:286]
public ResultSet getColumns(String catalog, String schemaPattern, String tableName, String columnNamePattern) throws SQLException {
String db = getDatabase(catalog, schemaPattern);
db = this.pedantic ? db : StringUtils.unQuoteIdentifier(db, this.quotedId);
StringBuilder sqlBuf = new StringBuilder(
this.databaseTerm.getValue() == DatabaseTerm.SCHEMA ? "SELECT TABLE_CATALOG, TABLE_SCHEMA," : "SELECT TABLE_SCHEMA, NULL,");
sqlBuf.append(" TABLE_NAME, COLUMN_NAME,");
appendJdbcTypeMappingQuery(sqlBuf, "DATA_TYPE", "COLUMN_TYPE");
sqlBuf.append(" AS DATA_TYPE, ");
sqlBuf.append("UPPER(CASE");
if (this.tinyInt1isBit) {
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='TINYINT' THEN CASE");
sqlBuf.append(
" WHEN LOCATE('ZEROFILL', UPPER(COLUMN_TYPE)) = 0 AND LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) = 0 AND LOCATE('(1)', COLUMN_TYPE) != 0 THEN ");
sqlBuf.append(this.transformedBitIsBoolean ? "'BOOLEAN'" : "'BIT'");
sqlBuf.append(" WHEN LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) != 0 AND LOCATE('UNSIGNED', UPPER(DATA_TYPE)) = 0 THEN 'TINYINT UNSIGNED'");
sqlBuf.append(" ELSE DATA_TYPE END ");
}
sqlBuf.append(
" WHEN LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) != 0 AND LOCATE('UNSIGNED', UPPER(DATA_TYPE)) = 0 AND LOCATE('SET', UPPER(DATA_TYPE)) <> 1 AND LOCATE('ENUM', UPPER(DATA_TYPE)) <> 1 THEN CONCAT(DATA_TYPE, ' UNSIGNED')");
// spatial data types
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='POINT' THEN 'GEOMETRY'");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='LINESTRING' THEN 'GEOMETRY'");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='POLYGON' THEN 'GEOMETRY'");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='MULTIPOINT' THEN 'GEOMETRY'");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='MULTILINESTRING' THEN 'GEOMETRY'");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='MULTIPOLYGON' THEN 'GEOMETRY'");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='GEOMETRYCOLLECTION' THEN 'GEOMETRY'");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='GEOMCOLLECTION' THEN 'GEOMETRY'");
sqlBuf.append(" ELSE UPPER(DATA_TYPE) END) AS TYPE_NAME,");
sqlBuf.append("UPPER(CASE");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='DATE' THEN 10"); // supported range is '1000-01-01' to '9999-12-31'
if (this.conn.getServerVersion().meetsMinimum(ServerVersion.parseVersion("5.6.4"))) {
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='TIME'"); // supported range is '-838:59:59.000000' to '838:59:59.000000'
sqlBuf.append(" THEN 8+(CASE WHEN DATETIME_PRECISION>0 THEN DATETIME_PRECISION+1 ELSE DATETIME_PRECISION END)");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='DATETIME' OR"); // supported range is '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
sqlBuf.append(" UPPER(DATA_TYPE)='TIMESTAMP'"); // supported range is '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC
sqlBuf.append(" THEN 19+(CASE WHEN DATETIME_PRECISION>0 THEN DATETIME_PRECISION+1 ELSE DATETIME_PRECISION END)");
} else {
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='TIME' THEN 8"); // supported range is '-838:59:59.000000' to '838:59:59.000000'
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='DATETIME' OR"); // supported range is '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
sqlBuf.append(" UPPER(DATA_TYPE)='TIMESTAMP'"); // supported range is '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC
sqlBuf.append(" THEN 19");
}
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='YEAR' THEN 4");
if (this.tinyInt1isBit && !this.transformedBitIsBoolean) {
sqlBuf.append(
" WHEN UPPER(DATA_TYPE)='TINYINT' AND LOCATE('ZEROFILL', UPPER(COLUMN_TYPE)) = 0 AND LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) = 0 AND LOCATE('(1)', COLUMN_TYPE) != 0 THEN 1");
}
// workaround for Bug#69042 (16712664), "MEDIUMINT PRECISION/TYPE INCORRECT IN INFORMATION_SCHEMA.COLUMNS", I_S bug returns NUMERIC_PRECISION=7 for MEDIUMINT UNSIGNED when it must be 8.
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='MEDIUMINT' AND LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) != 0 THEN 8");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='JSON' THEN 1073741824"); // JSON columns is limited to the value of the max_allowed_packet system variable (max value 1073741824)
// spatial data types
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='GEOMETRY' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='POINT' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='LINESTRING' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='POLYGON' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='MULTIPOINT' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='MULTILINESTRING' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='MULTIPOLYGON' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='GEOMETRYCOLLECTION' THEN 65535");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='GEOMCOLLECTION' THEN 65535");
sqlBuf.append(" WHEN CHARACTER_MAXIMUM_LENGTH IS NULL THEN NUMERIC_PRECISION");
sqlBuf.append(" WHEN CHARACTER_MAXIMUM_LENGTH > ");
sqlBuf.append(Integer.MAX_VALUE);
sqlBuf.append(" THEN ");
sqlBuf.append(Integer.MAX_VALUE);
sqlBuf.append(" ELSE CHARACTER_MAXIMUM_LENGTH");
sqlBuf.append(" END) AS COLUMN_SIZE,");
sqlBuf.append(maxBufferSize);
sqlBuf.append(" AS BUFFER_LENGTH,");
sqlBuf.append("UPPER(CASE");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='DECIMAL' THEN NUMERIC_SCALE");
sqlBuf.append(" WHEN UPPER(DATA_TYPE)='FLOAT' OR UPPER(DATA_TYPE)='DOUBLE' THEN");
sqlBuf.append(" CASE WHEN NUMERIC_SCALE IS NULL THEN 0");
sqlBuf.append(" ELSE NUMERIC_SCALE END");
sqlBuf.append(" ELSE NULL END) AS DECIMAL_DIGITS,");
sqlBuf.append("10 AS NUM_PREC_RADIX,");
sqlBuf.append("CASE");
sqlBuf.append(" WHEN IS_NULLABLE='NO' THEN ");
sqlBuf.append(columnNoNulls);
sqlBuf.append(" ELSE CASE WHEN IS_NULLABLE='YES' THEN ");
sqlBuf.append(columnNullable);
sqlBuf.append(" ELSE ");
sqlBuf.append(columnNullableUnknown);
sqlBuf.append(" END END AS NULLABLE,");
sqlBuf.append("COLUMN_COMMENT AS REMARKS,");
sqlBuf.append("COLUMN_DEFAULT AS COLUMN_DEF,");
sqlBuf.append("0 AS SQL_DATA_TYPE,");
sqlBuf.append("0 AS SQL_DATETIME_SUB,");
sqlBuf.append("CASE WHEN CHARACTER_OCTET_LENGTH > ");
sqlBuf.append(Integer.MAX_VALUE);
sqlBuf.append(" THEN ");
sqlBuf.append(Integer.MAX_VALUE);
sqlBuf.append(" ELSE CHARACTER_OCTET_LENGTH END AS CHAR_OCTET_LENGTH,");
sqlBuf.append("ORDINAL_POSITION, IS_NULLABLE, NULL AS SCOPE_CATALOG, NULL AS SCOPE_SCHEMA, NULL AS SCOPE_TABLE, NULL AS SOURCE_DATA_TYPE,");
sqlBuf.append("IF (EXTRA LIKE '%auto_increment%','YES','NO') AS IS_AUTOINCREMENT, ");
sqlBuf.append("IF (EXTRA LIKE '%GENERATED%','YES','NO') AS IS_GENERATEDCOLUMN ");
sqlBuf.append("FROM INFORMATION_SCHEMA.COLUMNS");
StringBuilder conditionBuf = new StringBuilder();
if (db != null) {
conditionBuf.append("information_schema".equalsIgnoreCase(db) || "performance_schema".equalsIgnoreCase(db) || !StringUtils.hasWildcards(db)
|| this.databaseTerm.getValue() == DatabaseTerm.CATALOG ? " TABLE_SCHEMA = ?" : " TABLE_SCHEMA LIKE ?");
}
if (tableName != null) {
if (conditionBuf.length() > 0) {
conditionBuf.append(" AND");
}
conditionBuf.append(StringUtils.hasWildcards(tableName) ? " TABLE_NAME LIKE ?" : " TABLE_NAME = ?");
}
if (columnNamePattern != null) {
if (conditionBuf.length() > 0) {
conditionBuf.append(" AND");
}
conditionBuf.append(StringUtils.hasWildcards(columnNamePattern) ? " COLUMN_NAME LIKE ?" : " COLUMN_NAME = ?");
}
if (conditionBuf.length() > 0) {
sqlBuf.append(" WHERE");
}
sqlBuf.append(conditionBuf);
sqlBuf.append(" ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION");
java.sql.PreparedStatement pStmt = null;
try {
pStmt = prepareMetaDataSafeStatement(sqlBuf.toString());
int nextId = 1;
if (db != null) {
pStmt.setString(nextId++, db);
}
if (tableName != null) {
pStmt.setString(nextId++, tableName);
}
if (columnNamePattern != null) {
pStmt.setString(nextId, columnNamePattern);
}
ResultSet rs = executeMetadataQuery(pStmt);
((com.mysql.cj.jdbc.result.ResultSetInternalMethods) rs).getColumnDefinition().setFields(createColumnsFields());
return rs;
} finally {
if (pStmt != null) {
pStmt.close();
}
}
}