in asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBMetaStatement.java [375:466]
protected ADBResultSet executeGetImportedExportedKeysQuery(String comment, String pkCatalog, String pkSchema,
String pkTable, String fkCatalog, String fkSchema, String fkTable, boolean orderByFk) throws SQLException {
StringBuilder sql = new StringBuilder(2048);
populateQueryProlog(sql, comment);
sql.append("select PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, PKCOLUMN_NAME, ");
sql.append("FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, FKCOLUMN_NAME, KEY_SEQ, ");
sql.append(DatabaseMetaData.importedKeyNoAction).append(" UPDATE_RULE, ");
sql.append(DatabaseMetaData.importedKeyNoAction).append(" DELETE_RULE, ");
sql.append("FK_NAME, PK_NAME, ");
sql.append(DatabaseMetaData.importedKeyInitiallyDeferred).append(" DEFERRABILITY ");
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 coalesce(ds.InternalDetails, ds.ExternalDetails, ds.ViewDetails).ForeignKeys fk at fkpos ");
sql.append("join Metadata.`Dataset` ds2 ");
sql.append("on fk.RefDataverseName = ds2.DataverseName and fk.RefDatasetName = ds2.DatasetName ");
sql.append("unnest fk.ForeignKey fki at fkipos ");
sql.append("let ");
sql.append("hasFields = array_length(dt.Derived.Record.Fields) > 0, ");
switch (connection.catalogDataverseMode) {
case CATALOG:
sql.append("FKTABLE_CAT = ds.DataverseName, ");
sql.append("FKTABLE_SCHEM = null, ");
sql.append("PKTABLE_CAT = ds2.DataverseName, ");
sql.append("PKTABLE_SCHEM = null, ");
break;
case CATALOG_SCHEMA:
sql.append("dvname = decode_dataverse_name(ds.DataverseName), ");
sql.append("FKTABLE_CAT = dvname[0], ");
sql.append("FKTABLE_SCHEM = case array_length(dvname) when 1 then null else dvname[1] end, ");
sql.append("dvname2 = decode_dataverse_name(ds2.DataverseName), ");
sql.append("PKTABLE_CAT = dvname2[0], ");
sql.append("PKTABLE_SCHEM = case array_length(dvname2) when 1 then null else dvname2[1] end, ");
break;
default:
throw new IllegalStateException();
}
sql.append("ds2Details = coalesce(ds2.InternalDetails, ds2.ExternalDetails, ds2.ViewDetails), ");
sql.append("FKTABLE_NAME = ds.DatasetName, ");
sql.append("PKTABLE_NAME = ds2.DatasetName, ");
sql.append("FKCOLUMN_NAME = fki[0], ");
sql.append("PKCOLUMN_NAME = ds2Details.PrimaryKey[fkipos-1][0], ");
sql.append("KEY_SEQ = fkipos, ");
sql.append("PK_NAME = PKTABLE_NAME || '").append(PK_NAME_SUFFIX).append("', ");
sql.append("FK_NAME = FKTABLE_NAME || '").append(FK_NAME_SUFFIX).append("_' || string(fkpos) ");
sql.append("where (every fki2 in fk.ForeignKey satisfies array_length(fki2) = 1 end) ");
sql.append("and (every fksi in fk.KeySourceIndicator satisfies fksi = 0 end ) ");
sql.append("and (every pki in ds2Details.PrimaryKey satisfies array_length(pki) = 1 end) ");
sql.append("and (every pksi in ds2Details.KeySourceIndicator satisfies pksi = 0 end) ");
if (pkCatalog != null) {
sql.append("and (").append("PKTABLE_CAT").append(" = $1) ");
}
if (pkSchema != null) {
sql.append("and (if_null(").append("PKTABLE_SCHEM").append(", '') like $2) ");
}
if (pkTable != null) {
sql.append("and (").append("PKTABLE_NAME").append(" like $3) ");
}
if (fkCatalog != null) {
sql.append("and (").append("FKTABLE_CAT").append(" = $4) ");
}
if (fkSchema != null) {
sql.append("and (if_null(").append("FKTABLE_SCHEM").append(", '') like $5) ");
}
if (fkTable != null) {
sql.append("and (").append("FKTABLE_NAME").append(" like $6) ");
}
switch (connection.catalogDataverseMode) {
case CATALOG:
break;
case CATALOG_SCHEMA:
sql.append("and (array_length(dvname) between 1 and 2) ");
sql.append("and (array_length(dvname2) between 1 and 2) ");
break;
default:
throw new IllegalStateException();
}
if (!connection.catalogIncludesSchemaless) {
sql.append("and hasFields ");
}
sql.append("order by ").append(
orderByFk ? "FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME" : "PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME")
.append(", KEY_SEQ");
return executeQueryImpl(sql.toString(),
Arrays.asList(pkCatalog, pkSchema, pkTable, fkCatalog, fkSchema, fkTable));
}