# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# RECIPE CATEGORY: PostgreSQL
# RECIPE KEYWORDS: statement options
# RECIPE STARTS HERE

#: The ADBC driver tries to execute queries with COPY by default since it is
#: faster for large result sets.  PostgreSQL does not support ``COPY`` for all
#: kinds of queries, however.  For example, ``SHOW`` queries will not work.
#: In this case, you can explicitly disable the ``COPY`` optimization.

import os

from adbc_driver_manager import dbapi

uri = os.environ["ADBC_POSTGRESQL_TEST_URI"]
conn = dbapi.connect("postgresql", uri)

#: The option can be set when creating the cursor:

with conn.cursor(
    adbc_stmt_kwargs={
        "adbc.postgresql.use_copy": False,
    }
) as cur:
    cur.execute("SHOW ALL")
    print(cur.fetch_arrow_table().schema)
    # Output:
    # name: string
    # setting: string
    # description: string

#: Or it can be set afterwards:

with conn.cursor() as cur:
    cur.adbc_statement.set_options(
        **{
            "adbc.postgresql.use_copy": False,
        }
    )
    cur.execute("SHOW ALL")
    print(cur.fetch_arrow_table().schema)
    # Output:
    # name: string
    # setting: string
    # description: string

#: Without the option, the query fails as the driver attempts to execute the
#: query with ``COPY``:

with conn.cursor() as cur:
    try:
        cur.execute("SHOW ALL")
    except conn.Error:
        pass
    else:
        raise RuntimeError("Expected error")

conn.close()
