func()

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
}