in go/adbc/driver/snowflake/connection.go [265:349]
func (c *cnxn) getObjectsDbSchemas(ctx context.Context, depth adbc.ObjectDepth, catalog *string, dbSchema *string) (result map[string][]string, err error) {
if depth == adbc.ObjectDepthCatalogs {
return
}
conditions := make([]string, 0)
if catalog != nil && *catalog != "" {
conditions = append(conditions, ` CATALOG_NAME LIKE \'`+*catalog+`\'`)
}
if dbSchema != nil && *dbSchema != "" {
conditions = append(conditions, ` SCHEMA_NAME LIKE \'`+*dbSchema+`\'`)
}
cond := strings.Join(conditions, " AND ")
if cond != "" {
cond = `statement := 'SELECT * FROM (' || statement || ') WHERE ` + cond + `';`
}
result = make(map[string][]string)
const queryPrefix = `DECLARE
c1 CURSOR FOR SELECT DATABASE_NAME FROM INFORMATION_SCHEMA.DATABASES;
res RESULTSET;
counter INTEGER DEFAULT 0;
statement VARCHAR DEFAULT '';
BEGIN
FOR rec IN c1 DO
LET sharelist RESULTSET := (EXECUTE IMMEDIATE 'SHOW SHARES LIKE \'%' || rec.database_name || '%\'');
LET cnt RESULTSET := (SELECT COUNT(*) FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())));
LET cnt_cur CURSOR for cnt;
LET share_cnt INTEGER DEFAULT 0;
OPEN cnt_cur;
FETCH cnt_cur INTO share_cnt;
CLOSE cnt_cur;
IF (share_cnt > 0) THEN
LET c2 CURSOR for sharelist;
LET created_on TIMESTAMP;
LET kind VARCHAR DEFAULT '';
LET share_name VARCHAR DEFAULT '';
LET dbname VARCHAR DEFAULT '';
OPEN c2;
FETCH c2 INTO created_on, kind, share_name, dbname;
CLOSE c2;
IF (dbname = '') THEN
CONTINUE;
END IF;
END IF;
IF (counter > 0) THEN
statement := statement || ' UNION ALL ';
END IF;
statement := statement || ' SELECT CATALOG_NAME, SCHEMA_NAME FROM ' || rec.database_name || '.INFORMATION_SCHEMA.SCHEMATA';
counter := counter + 1;
END FOR;
`
const querySuffix = `
res := (EXECUTE IMMEDIATE :statement);
RETURN TABLE (res);
END;`
query := queryPrefix + cond + querySuffix
var rows *sql.Rows
rows, err = c.sqldb.QueryContext(ctx, query)
if err != nil {
err = errToAdbcErr(adbc.StatusIO, err)
return
}
defer rows.Close()
var catalogName, schemaName string
for rows.Next() {
if err = rows.Scan(&catalogName, &schemaName); err != nil {
err = errToAdbcErr(adbc.StatusIO, err)
return
}
cat, ok := result[catalogName]
if !ok {
cat = make([]string, 0, 1)
}
result[catalogName] = append(cat, schemaName)
}
return
}