GitHub user set92 created a discussion: Snowflake provider 
(SnowflakeSqlApiOperator) - Not exposing query results with multiple queries

### Apache Airflow version

Other Airflow 2/3 version (please specify below)

### If "Other Airflow 2/3 version" selected, which one?

2.10.3

### What happened?

When calling the .execute, and retrieve the query_ids I get the parent ID, but 
if I'm running multiple queries I want to know all the queries IDs to retrieve 
results for any of them.

On the logs, I can see the API response, but I don't see a method to get it. 

While checking the code I see it calls to the Hook, and on the hook I can see
```
    def _process_response(self, status_code, resp):
        self.log.info("Snowflake SQL GET statements status API response: %s", 
resp)
        if status_code == 202:
            return {"status": "running", "message": "Query statements are still 
running"}
        elif status_code == 422:
            return {"status": "error", "message": resp["message"]}
        elif status_code == 200:
            if resp_statement_handles := resp.get("statementHandles"):
                statement_handles = resp_statement_handles
            elif resp_statement_handle := resp.get("statementHandle"):
                statement_handles = [resp_statement_handle]
            else:
                statement_handles = []
            return {
                "status": "success",
                "message": resp["message"],
                "statement_handles": statement_handles,
            }
        else:
            return {"status": "error", "message": resp["message"]}
```
So, seeing this I would say in the Hook is correct, because if it has 
`statementHandles` it returns it. Although I would say that is not totally 
right, because you may want/need both. The parent id that is the 
statementHandle, and the IDs of the children (statementHandles). 

But the Operator only returns the parent ID, even so when in the resp I can see 
everything. I think is because it calls to check_query_output() which only logs 
the json response, but doesn't return it, and the hook uses 
get_sql_api_query_status that parses it correctly?

I also think that the poll_queries would be a nice method to have exposed to 
the hook, since now the hook I think it runs the query and forget about it.

```
resp:
[TIMESTAMP] {snowflake_sql_api.py:287} INFO - Snowflake SQL GET statements 
status API response: {'resultSetMetaData': {'numRows': 1, 'format': 'jsonv2', 
'partitionInfo': [{'rowCount': 1, 'uncompressedSize': 57}], 'rowType': 
[{'name': 'multiple statement execution', 'database': '', 'schema': '', 
'table': '', 'scale': None, 'nullable': False, 'byteLength': 16777216, 
'precision': None, 'collation': None, 'length': 16777216, 'type': 'text'}]}, 
'data': [['Multiple statements executed successfully.']], 'code': '090001', 
'statementHandles': ['XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'], 'statementStatusUrl': 
'/api/v2/statements/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX?requestId=XXXXXXX
 X-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'requestId': 
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'sqlState': '00000', 'statementHandle': 
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'message': 'Statement executed 
successfully.', 'createdOn': 1763984429070}
```




### What you think should happen instead?

_No response_

### How to reproduce

I don't have a basic example since I'm debugging production code, but it should 
be 
```
    op = SnowflakeSqlApiOperator(
        task_id="run_sql",
        snowflake_conn_id=snflk_conn_id,
        sql=sql_statement,
        database=sql_params["database"],
        schema=sql_params["schema_db"],
        deferrable=False,
        statement_count=stmt_count,
        warehouse=kwargs.get("warehouse", "").upper(),
    )
```


sql_statement = """
ALTER SESSION SET TRANSACTION_ABORT_ON_ERROR = TRUE;
BEGIN TRANSACTION;

SELECT 4 as "number of rows inserted";
SELECT 2 as "number of rows updated";

COMMIT;
"""

### Operating System

AWS MWAA

### Versions of Apache Airflow Providers

<h2>Providers</h2>
  

  
Package Name | Version | Description
-- | -- | --
apache-airflow-providers-amazon | 9.0.0 | Amazon integration (including Amazon 
Web Services (AWS)).
apache-airflow-providers-celery | 3.8.3 | Celery
apache-airflow-providers-common-compat | 1.7.3 | Common Compatibility Provider 
- providing compatibility code for previous Airflow versions
apache-airflow-providers-common-io | 1.4.2 | ``Common IO Provider``
apache-airflow-providers-common-sql | 1.28.0 | Common SQL Provider
apache-airflow-providers-fab | 1.5.0 | Flask App Builder
apache-airflow-providers-ftp | 3.11.1 | File Transfer Protocol (FTP)
apache-airflow-providers-http | 4.13.2 | Hypertext Transfer Protocol (HTTP)
apache-airflow-providers-imap | 3.7.0 | Internet Message Access Protocol (IMAP)
apache-airflow-providers-microsoft-mssql | 3.9.1 | Microsoft SQL Server (MSSQL)
apache-airflow-providers-pagerduty | 5.0.2 | Pagerduty
apache-airflow-providers-postgres | 5.13.1 | PostgreSQL
apache-airflow-providers-slack | 9.2.0 | Slack services integration including:  
  - Slack API   - Slack Incoming Webhook
apache-airflow-providers-smtp | 1.8.0 | Simple Mail Transfer Protocol (SMTP)
apache-airflow-providers-snowflake | 6.5.3 | Snowflake
apache-airflow-providers-sqlite | 3.9.0 | SQLite


### Deployment

Amazon (AWS) MWAA

### Deployment details

_No response_

### Anything else?

_No response_

### Are you willing to submit PR?

- [ ] Yes I am willing to submit a PR!

### Code of Conduct

- [x] I agree to follow this project's [Code of 
Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)


GitHub link: https://github.com/apache/airflow/discussions/58689

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: [email protected]

Reply via email to