in asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBMetaStatement.java [207:295]
protected ADBResultSet executeGetColumnsQuery(String catalog, String schemaPattern, String tableNamePattern,
String columnNamePattern) throws SQLException {
checkClosed();
StringBuilder sql = new StringBuilder(2048);
populateQueryProlog(sql, "JDBC-GetColumns");
sql.append("select TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, DATA_TYPE, TYPE_NAME, COLUMN_SIZE, ");
sql.append("1 BUFFER_LENGTH, null DECIMAL_DIGITS, 2 NUM_PREC_RADIX, NULLABLE, ");
sql.append("null REMARKS, null COLUMN_DEF, DATA_TYPE SQL_DATA_TYPE,");
sql.append("0 SQL_DATETIME_SUB, COLUMN_SIZE CHAR_OCTET_LENGTH, ORDINAL_POSITION, ");
sql.append("case NULLABLE when 0 then 'NO' else 'YES' end IS_NULLABLE, ");
sql.append("null SCOPE_CATALOG, null SCOPE_SCHEMA, null SCOPE_TABLE, null SOURCE_DATA_TYPE, ");
sql.append("'NO' IS_AUTOINCREMENT, 'NO' IS_GENERATEDCOLUMN ");
sql.append("from Metadata.`Dataset` ds ");
sql.append("join Metadata.`Datatype` dt ");
sql.append("on ds.DatatypeDataverseName = dt.DataverseName and ds.DatatypeName = dt.DatatypeName ");
sql.append("unnest dt.Derived.Record.Fields as field at fieldpos ");
sql.append("left join Metadata.`Datatype` dt2 ");
sql.append(
"on field.FieldType = dt2.DatatypeName and ds.DataverseName = dt2.DataverseName and dt2.Derived is known ");
sql.append("let ");
switch (connection.catalogDataverseMode) {
case CATALOG:
sql.append("TABLE_CAT = ds.DataverseName, ");
sql.append("TABLE_SCHEM = null, ");
break;
case CATALOG_SCHEMA:
sql.append("dvname = decode_dataverse_name(ds.DataverseName), ");
sql.append("TABLE_CAT = dvname[0], ");
sql.append("TABLE_SCHEM = case array_length(dvname) when 1 then null else dvname[1] end, ");
break;
default:
throw new IllegalStateException();
}
sql.append("TABLE_NAME = ds.DatasetName, ");
sql.append("COLUMN_NAME = field.FieldName, ");
sql.append("TYPE_NAME = case ");
for (ADBDatatype nestedType : new ADBDatatype[] { ADBDatatype.OBJECT, ADBDatatype.ARRAY,
ADBDatatype.MULTISET }) {
sql.append(String.format("when dt2.Derived.%s is known then '%s' ",
ADBDatatype.getDerivedRecordName(nestedType), nestedType.getTypeName()));
}
sql.append("else field.FieldType end, ");
sql.append("DATA_TYPE = ");
sql.append("case TYPE_NAME ");
for (ADBDatatype type : ADBDatatype.values()) {
JDBCType jdbcType = type.getJdbcType();
if (type.isNullOrMissing() || jdbcType.equals(JDBCType.OTHER)) {
// will be handled by the 'else' clause
continue;
}
sql.append("when '").append(type.getTypeName()).append("' ");
sql.append("then ").append(jdbcType.getVendorTypeNumber()).append(" ");
}
sql.append("else ").append(JDBCType.OTHER.getVendorTypeNumber()).append(" end, ");
sql.append("COLUMN_SIZE = case field.FieldType when 'string' then 32767 else 8 end, "); // TODO:based on type
sql.append("ORDINAL_POSITION = fieldpos, ");
sql.append("NULLABLE = case when field.IsNullable or field.IsMissable then 1 else 0 end ");
sql.append("where (array_length(dt.Derived.Record.Fields) > 0) ");
if (catalog != null) {
sql.append("and (TABLE_CAT = $1) ");
}
if (schemaPattern != null) {
sql.append("and (if_null(TABLE_SCHEM, '') like $2) ");
}
if (tableNamePattern != null) {
sql.append("and (TABLE_NAME like $3) ");
}
if (columnNamePattern != null) {
sql.append("and (COLUMN_NAME like $4) ");
}
switch (connection.catalogDataverseMode) {
case CATALOG:
break;
case CATALOG_SCHEMA:
sql.append("and (array_length(dvname) between 1 and 2) ");
break;
default:
throw new IllegalStateException();
}
sql.append("order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION");
return executeQueryImpl(sql.toString(),
Arrays.asList(catalog, schemaPattern, tableNamePattern, columnNamePattern));
}