You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2025/12/29 03:38:35 UTC
(arrow-adbc) branch main updated: feat(c/driver/postgresql): add validation suite and override tests (#3821)
This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 4a3b8eb94 feat(c/driver/postgresql): add validation suite and override tests (#3821)
4a3b8eb94 is described below
commit 4a3b8eb940a138a7517fbdcf43d7b53692db5130
Author: Mandukhai Alimaa <11...@users.noreply.github.com>
AuthorDate: Sun Dec 28 21:38:29 2025 -0600
feat(c/driver/postgresql): add validation suite and override tests (#3821)
This PR contains:
- Setup validataion suite for the postgresql driver. (128 tests pass. 0
failing. Decimal ingest test, and decimal bind tests were skipped due to
bug and the fix has not been merged yet.
https://github.com/apache/arrow-adbc/pull/3787)
- PostgreSQL specific test overrides
- Update postgresql integration test in CI workflow to run validation
tests
- Update RAT license exlusions file to ignore the .lock files and test
sql files.
There was a small change made in the
c/driver/postgresql/result_helper.cc due to the segfault when the number
of query parameters doesn't match the number of result columns. The test
that triggered the bug was calling get_parameter_schema() on `SELECT 1 +
$1 + $2` .
This query has 2 parameters but returns only 1 result column (the
computed sum). The code was incorrectly using PQfname(result_, i) to
retrieve parameter names, but PQfname() actually retrieves result column
names from the result set. When iterating through parameters, the first
iteration (i=0) would work fine accessing column 0, but the second
iteration (i=1) would access an out-of-range column. PQfname() returns
NULL for out-of-range column numbers, and passing this NULL pointer to
AppendChild() as a C string causes the segfault.
---
.github/workflows/integration.yml | 10 +
c/driver/postgresql/connection.cc | 4 +-
c/driver/postgresql/postgresql_test.cc | 4 +-
c/driver/postgresql/result_helper.cc | 10 +-
c/driver/postgresql/validation/.gitignore | 18 +
c/driver/postgresql/validation/README.md | 59 +
c/driver/postgresql/validation/pixi.lock | 1629 ++++++++++++++++++++
c/driver/postgresql/validation/pixi.toml | 34 +
c/driver/postgresql/validation/pytest.ini | 24 +
.../validation/queries/ingest/decimal.toml | 19 +
.../validation/queries/ingest/time_ms.txtcase | 21 +
.../validation/queries/ingest/time_ns.txtcase | 21 +
.../validation/queries/ingest/time_s.txtcase | 21 +
.../validation/queries/ingest/timestamp_ms.txtcase | 44 +
.../validation/queries/ingest/timestamp_ns.txtcase | 44 +
.../validation/queries/ingest/timestamp_s.txtcase | 44 +
.../queries/ingest/timestamptz_ms.txtcase | 49 +
.../queries/ingest/timestamptz_ns.txtcase | 50 +
.../queries/ingest/timestamptz_s.txtcase | 49 +
.../validation/queries/type/bind/binary.bind.sql | 1 +
.../validation/queries/type/bind/binary.setup.sql | 3 +
.../queries/type/bind/binary_view.setup.sql | 3 +
.../validation/queries/type/bind/decimal.toml | 19 +
.../queries/type/bind/fixed_size_binary.setup.sql | 3 +
.../queries/type/bind/large_binary.setup.sql | 3 +
.../queries/type/bind/large_string.setup.sql | 3 +
.../validation/queries/type/bind/string.setup.sql | 3 +
.../queries/type/bind/string_view.setup.sql | 3 +
.../validation/queries/type/bind/time_ms.txtcase | 21 +
.../validation/queries/type/bind/time_ns.txtcase | 21 +
.../validation/queries/type/bind/time_s.txtcase | 21 +
.../queries/type/bind/timestamp_ms.txtcase | 38 +
.../queries/type/bind/timestamp_ns.txtcase | 38 +
.../queries/type/bind/timestamp_s.txtcase | 38 +
.../queries/type/bind/timestamptz_ms.txtcase | 43 +
.../queries/type/bind/timestamptz_ns.txtcase | 43 +
.../queries/type/bind/timestamptz_s.txtcase | 43 +
.../validation/queries/type/literal/binary.sql | 1 +
.../queries/type/literal/decimal.schema.json | 14 +
.../queries/type/select/binary.setup.sql | 10 +
.../queries/type/select/decimal.schema.json | 14 +
.../queries/type/select/string.setup.sql | 10 +
c/driver/postgresql/validation/tests/__init__.py | 16 +
c/driver/postgresql/validation/tests/conftest.py | 69 +
c/driver/postgresql/validation/tests/postgresql.py | 90 ++
.../postgresql/validation/tests/test_connection.py | 27 +
.../postgresql/validation/tests/test_ingest.py | 27 +
c/driver/postgresql/validation/tests/test_query.py | 27 +
.../postgresql/validation/tests/test_statement.py | 97 ++
dev/release/rat_exclude_files.txt | 2 +
glib/test/helper.rb | 2 +-
glib/test/test-arrow-connection.rb | 4 +-
glib/test/test-connection.rb | 4 +-
53 files changed, 2902 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index fa633fe85..7ca7ce4eb 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -248,6 +248,16 @@ jobs:
./ci/scripts/cpp_test.sh "$(pwd)/build"
./ci/scripts/python_test.sh "$(pwd)" "$(pwd)/build"
docker compose down
+ - name: Install pixi
+ uses: prefix-dev/setup-pixi@ba3bb36eb2066252b2363392b7739741bb777659 # v0.8.1
+ with:
+ pixi-version: v0.62.1
+ - name: Run PostgreSQL Validation Suite
+ run: |
+ env POSTGRES_VERSION=15 docker compose up --wait --detach postgres-test
+ cd c/driver/postgresql/validation
+ pixi run validate
+ docker compose down
- name: Test PostgreSQL Driver - postgres 16
env:
BUILD_ALL: "0"
diff --git a/c/driver/postgresql/connection.cc b/c/driver/postgresql/connection.cc
index ad4433b04..cf4dea157 100644
--- a/c/driver/postgresql/connection.cc
+++ b/c/driver/postgresql/connection.cc
@@ -541,10 +541,10 @@ AdbcStatusCode PostgresConnection::GetInfo(struct AdbcConnection* connection,
break;
case ADBC_INFO_DRIVER_VERSION:
// TODO(lidavidm): fill in driver version
- infos.push_back({info_codes[i], "(unknown)"});
+ infos.push_back({info_codes[i], "unknown"});
break;
case ADBC_INFO_DRIVER_ARROW_VERSION:
- infos.push_back({info_codes[i], NANOARROW_VERSION});
+ infos.push_back({info_codes[i], "v" NANOARROW_VERSION});
break;
case ADBC_INFO_DRIVER_ADBC_VERSION:
infos.push_back({info_codes[i], ADBC_VERSION_1_1_0});
diff --git a/c/driver/postgresql/postgresql_test.cc b/c/driver/postgresql/postgresql_test.cc
index b11be3df0..5eca504da 100644
--- a/c/driver/postgresql/postgresql_test.cc
+++ b/c/driver/postgresql/postgresql_test.cc
@@ -203,7 +203,7 @@ class PostgresQuirks : public adbc_validation::DriverQuirks {
case ADBC_INFO_DRIVER_NAME:
return "ADBC PostgreSQL Driver";
case ADBC_INFO_DRIVER_VERSION:
- return "(unknown)";
+ return "unknown";
case ADBC_INFO_VENDOR_NAME:
return "PostgreSQL";
default:
@@ -291,7 +291,7 @@ TEST_F(PostgresConnectionTest, GetInfoMetadata) {
}
case ADBC_INFO_DRIVER_VERSION: {
ArrowStringView val = ArrowArrayViewGetStringUnsafe(str_child, offset);
- EXPECT_EQ("(unknown)", std::string(val.data, val.size_bytes));
+ EXPECT_EQ("unknown", std::string(val.data, val.size_bytes));
break;
}
case ADBC_INFO_VENDOR_NAME: {
diff --git a/c/driver/postgresql/result_helper.cc b/c/driver/postgresql/result_helper.cc
index 862dd0aac..e87ee3735 100644
--- a/c/driver/postgresql/result_helper.cc
+++ b/c/driver/postgresql/result_helper.cc
@@ -143,14 +143,16 @@ Status PqResultHelper::ResolveParamTypes(PostgresTypeResolver& type_resolver,
const Oid pg_oid = PQparamtype(result_, i);
PostgresType pg_type;
if (type_resolver.Find(pg_oid, &pg_type, &na_error) != NANOARROW_OK) {
- Status status = Status::NotImplemented("[libpq] Parameter #", i + 1, " (\"",
- PQfname(result_, i),
- "\") has unknown type code ", pg_oid);
+ std::string param_name = "$" + std::to_string(i + 1);
+ Status status =
+ Status::NotImplemented("[libpq] Parameter #", i + 1, " (\"", param_name,
+ "\") has unknown type code ", pg_oid);
ClearResult();
return status;
}
- root_type.AppendChild(PQfname(result_, i), pg_type);
+ std::string param_name = "$" + std::to_string(i + 1);
+ root_type.AppendChild(param_name.c_str(), pg_type);
}
*param_types = root_type;
diff --git a/c/driver/postgresql/validation/.gitignore b/c/driver/postgresql/validation/.gitignore
new file mode 100644
index 000000000..793b616b6
--- /dev/null
+++ b/c/driver/postgresql/validation/.gitignore
@@ -0,0 +1,18 @@
+# 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.
+
+validation-report.xml
diff --git a/c/driver/postgresql/validation/README.md b/c/driver/postgresql/validation/README.md
new file mode 100644
index 000000000..9ea9067dc
--- /dev/null
+++ b/c/driver/postgresql/validation/README.md
@@ -0,0 +1,59 @@
+<!--
+ 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.
+-->
+
+# PostgreSQL ADBC Driver Validation Suite
+
+This directory contains a Python-based validation suite for the PostgreSQL ADBC driver.
+
+## Testing
+
+A running instance of PostgreSQL is required. For example, using Docker:
+
+```shell
+$ docker run -it --rm \
+ -e POSTGRES_PASSWORD=password \
+ -e POSTGRES_DB=postgres \
+ -p 5432:5432 \
+ postgres
+```
+
+Alternatively use the `docker compose` provided by ADBC to manage the test
+database container.
+
+```shell
+$ docker compose up postgres-test
+# When finished:
+# docker compose down postgres-test
+```
+
+Then, to run the tests, set the environment variable specifying the
+PostgreSQL URI before running tests:
+
+```shell
+$ export ADBC_POSTGRESQL_TEST_URI=postgresql://localhost:5432/postgres?user=postgres&password=password
+```
+
+### 5. Run Tests
+
+#### Using pixi:
+
+```bash
+cd c/driver/postgresql/validation
+pixi run validate
+```
diff --git a/c/driver/postgresql/validation/pixi.lock b/c/driver/postgresql/validation/pixi.lock
new file mode 100644
index 000000000..79c6f0e74
--- /dev/null
+++ b/c/driver/postgresql/validation/pixi.lock
@@ -0,0 +1,1629 @@
+version: 6
+environments:
+ default:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-lazy-fixtures-1.4.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_100_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
+ - pypi: https://files.pythonhosted.org/packages/e8/74/60407d06a3263155495e730e8fa671db976c918aea16b5471de16025b811/adbc_driver_manager-1.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/dev#aa41c0f61c5c2e1ea3ee8ac54fedb4e452218946
+ - pypi: https://files.pythonhosted.org/packages/44/83/a2960d2c975836daa629a73995134fd86520c101412578c57da3d2aa71ee/doit-0.36.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/1a/7b/adf3f611f11997fc429d4b00a730604b65d952417f36a10c4be6e38e064d/duckdb-1.4.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/1b/8b/5362443737a5307a7b67c1017c42cd104213189b4970bf607e05faf9c525/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/dc/b3/f0c69382492f1f19030ee580fb85bd4cbae157ecf3b24ac89362a315539c/pygit2-1.19.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/validation#32a647736227f3b020776dd493153aa6eb3bff19
+ - pypi: https://files.pythonhosted.org/packages/38/1b/1d3af9103dc3f0758f01e5c90113753254cc47ab9a3767a726d2dafcf5aa/whenever-0.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
+ linux-aarch64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h1022ec0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-lazy-fixtures-1.4.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_100_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda
+ - pypi: https://files.pythonhosted.org/packages/a5/e7/c3039fd725636d1d25c339223027a7f999ac23048d4437ab5ad22f42ecdd/adbc_driver_manager-1.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/dev#aa41c0f61c5c2e1ea3ee8ac54fedb4e452218946
+ - pypi: https://files.pythonhosted.org/packages/44/83/a2960d2c975836daa629a73995134fd86520c101412578c57da3d2aa71ee/doit-0.36.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/73/dd/23152458cf5fd51e813fadda60b9b5f011517634aa4bb9301f5f3aa951d8/duckdb-1.4.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ff/c0/782344c2ce58afbea010150df07e3a2f5fdad299cd631697ae7bd3bac6e3/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ba/40/3df9f3cc9397aae3c6befcea9f815393c8d0a53e9717b6ab4ca51f62ff72/pygit2-1.19.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/validation#32a647736227f3b020776dd493153aa6eb3bff19
+ - pypi: https://files.pythonhosted.org/packages/e2/10/b63b29ead140d671cefa50718e1e7c7a228e8eb335e009f72c154d8fcb2a/whenever-0.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
+ - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
+ osx-arm64:
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-lazy-fixtures-1.4.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_100_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda
+ - pypi: https://files.pythonhosted.org/packages/ee/de/ae8d9a532dba87b61201bf64678b142afb07782c014539cef81681f0fa35/adbc_driver_manager-1.9.0-cp313-cp313-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/dev#aa41c0f61c5c2e1ea3ee8ac54fedb4e452218946
+ - pypi: https://files.pythonhosted.org/packages/44/83/a2960d2c975836daa629a73995134fd86520c101412578c57da3d2aa71ee/doit-0.36.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c4/19/57af0cc66ba2ffb8900f567c9aec188c6ab2a7b3f2260e9c6c3c5f9b57b1/duckdb-1.4.3-cp313-cp313-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a6/d6/d0fac16a2963002fc22c8fa75180a838737203d558f0ed3b564c4a54eef5/pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/3b/f7/c0f72a5a87537b5622931a59be33654fa6e7cce25497c42f54de45a54622/pygit2-1.19.0-cp313-cp313-macosx_10_13_universal2.whl
+ - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/validation#32a647736227f3b020776dd493153aa6eb3bff19
+ - pypi: https://files.pythonhosted.org/packages/d7/95/1b32ae824ece99ec1ad154f78cec1e092171666167d47df83039fa35804a/whenever-0.9.4-cp313-cp313-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
+ win-64:
+ - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-lazy-fixtures-1.4.0-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_33.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_33.conda
+ - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_33.conda
+ - pypi: https://files.pythonhosted.org/packages/35/28/260053893ca51b1f06e2fe652ee267cbfe359a2c4c8312dc0307a0f54579/adbc_driver_manager-1.9.0-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/dev#aa41c0f61c5c2e1ea3ee8ac54fedb4e452218946
+ - pypi: https://files.pythonhosted.org/packages/44/83/a2960d2c975836daa629a73995134fd86520c101412578c57da3d2aa71ee/doit-0.36.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/40/d5/6b7ddda7713a788ab2d622c7267ec317718f2bdc746ce1fca49b7ff0e50f/duckdb-1.4.3-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2d/f8/1d0bd75bf9328a3b826e24a16e5517cd7f9fbf8d34a3184a4566ef5a7f29/pyarrow-22.0.0-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6e/ae/58ff127fa1177f63c6b56bf77882a357779090a70aaaadbdfe71bbd98a27/pygit2-1.19.0-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl
+ - pypi: https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl
+ - pypi: git+https://github.com/adbc-drivers/validation#32a647736227f3b020776dd493153aa6eb3bff19
+ - pypi: https://files.pythonhosted.org/packages/9f/e7/84381106a701c812652405f4d74093f6da7c2748a639084fd2c092cd2c78/whenever-0.9.4-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
+packages:
+- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2
+ sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726
+ md5: d7c89558ba9fa0495403155b64376d81
+ license: None
+ purls: []
+ size: 2562
+ timestamp: 1578324546067
+- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2
+ build_number: 16
+ sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22
+ md5: 73aaf86a425cc6e73fcf236a5a46396d
+ depends:
+ - _libgcc_mutex 0.1 conda_forge
+ - libgomp >=7.5.0
+ constrains:
+ - openmp_impl 9999
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 23621
+ timestamp: 1650670423406
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2
+ build_number: 16
+ sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0
+ md5: 6168d71addc746e8f2b8d57dfd2edcea
+ depends:
+ - libgomp >=7.5.0
+ constrains:
+ - openmp_impl 9999
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 23712
+ timestamp: 1650670790230
+- pypi: https://files.pythonhosted.org/packages/35/28/260053893ca51b1f06e2fe652ee267cbfe359a2c4c8312dc0307a0f54579/adbc_driver_manager-1.9.0-cp313-cp313-win_amd64.whl
+ name: adbc-driver-manager
+ version: 1.9.0
+ sha256: 21e0ab1adb0c804955279b0a919ba8dec5264db1e85e43a89af9fbbf8a8e52c9
+ requires_dist:
+ - typing-extensions
+ - pandas ; extra == 'dbapi'
+ - pyarrow>=14.0.1 ; extra == 'dbapi'
+ - duckdb ; extra == 'test'
+ - pandas ; extra == 'test'
+ - polars ; extra == 'test'
+ - pyarrow>=14.0.1 ; extra == 'test'
+ - pytest ; extra == 'test'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/a5/e7/c3039fd725636d1d25c339223027a7f999ac23048d4437ab5ad22f42ecdd/adbc_driver_manager-1.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
+ name: adbc-driver-manager
+ version: 1.9.0
+ sha256: 0a7961db77730ce0ab326a225dc534b43d4017b28a30703eaac7e3cdf1e5fb7d
+ requires_dist:
+ - typing-extensions
+ - pandas ; extra == 'dbapi'
+ - pyarrow>=14.0.1 ; extra == 'dbapi'
+ - duckdb ; extra == 'test'
+ - pandas ; extra == 'test'
+ - polars ; extra == 'test'
+ - pyarrow>=14.0.1 ; extra == 'test'
+ - pytest ; extra == 'test'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/e8/74/60407d06a3263155495e730e8fa671db976c918aea16b5471de16025b811/adbc_driver_manager-1.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: adbc-driver-manager
+ version: 1.9.0
+ sha256: f1a8ba1ad7c4b50f5486401cc1bf04d313f74065f0d752ab0145292ab746f0fb
+ requires_dist:
+ - typing-extensions
+ - pandas ; extra == 'dbapi'
+ - pyarrow>=14.0.1 ; extra == 'dbapi'
+ - duckdb ; extra == 'test'
+ - pandas ; extra == 'test'
+ - polars ; extra == 'test'
+ - pyarrow>=14.0.1 ; extra == 'test'
+ - pytest ; extra == 'test'
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/ee/de/ae8d9a532dba87b61201bf64678b142afb07782c014539cef81681f0fa35/adbc_driver_manager-1.9.0-cp313-cp313-macosx_11_0_arm64.whl
+ name: adbc-driver-manager
+ version: 1.9.0
+ sha256: fe4affd71f7facdaf4c04839846b090c945586c36d0fd79cd7fb5a3251d36f85
+ requires_dist:
+ - typing-extensions
+ - pandas ; extra == 'dbapi'
+ - pyarrow>=14.0.1 ; extra == 'dbapi'
+ - duckdb ; extra == 'test'
+ - pandas ; extra == 'test'
+ - polars ; extra == 'test'
+ - pyarrow>=14.0.1 ; extra == 'test'
+ - pytest ; extra == 'test'
+ requires_python: '>=3.10'
+- pypi: git+https://github.com/adbc-drivers/dev#aa41c0f61c5c2e1ea3ee8ac54fedb4e452218946
+ name: adbc-drivers-dev
+ version: '0.1'
+ requires_dist:
+ - doit
+ - jinja2
+ - packaging
+ - platformdirs
+ - pygit2
+ - requests
+ - ruamel-yaml>=0.18.11,<0.19
+ - tomlkit>=0.13.2,<0.14
+- pypi: git+https://github.com/adbc-drivers/validation#32a647736227f3b020776dd493153aa6eb3bff19
+ name: adbc-drivers-validation
+ version: '0.1'
+ requires_dist:
+ - adbc-driver-manager>=1.6.0,<2
+ - bidict>=0.23.1,<1.0.0
+ - duckdb>=1.4.1,<2
+ - jinja2>=3.1.6,<4
+ - pyarrow>=22.0.0,<23
+ - pytest>=9.0.0,<10
+ - whenever>=0.9.3,<0.10
+ requires_python: '>=3.13'
+- pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl
+ name: bidict
+ version: 0.23.1
+ sha256: 5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5
+ requires_python: '>=3.8'
+- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda
+ sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5
+ md5: 51a19bba1b8ebfb60df25cde030b7ebc
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 260341
+ timestamp: 1757437258798
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda
+ sha256: d2a296aa0b5f38ed9c264def6cf775c0ccb0f110ae156fcde322f3eccebf2e01
+ md5: 2921ac0b541bf37c69e66bd6d9a43bca
+ depends:
+ - libgcc >=14
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 192536
+ timestamp: 1757437302703
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda
+ sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1
+ md5: 58fd217444c2a5701a44244faf518206
+ depends:
+ - __osx >=11.0
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 125061
+ timestamp: 1757437486465
+- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda
+ sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692
+ md5: 1077e9333c41ff0be8edd1a5ec0ddace
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 55977
+ timestamp: 1757437738856
+- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda
+ sha256: 686a13bd2d4024fc99a22c1e0e68a7356af3ed3304a8d3ff6bb56249ad4e82f0
+ md5: f98fb7db808b94bc1ec5b0e62f9f1069
+ depends:
+ - __win
+ license: ISC
+ purls: []
+ size: 152827
+ timestamp: 1762967310929
+- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda
+ sha256: b986ba796d42c9d3265602bc038f6f5264095702dd546c14bc684e60c385e773
+ md5: f0991f0f84902f6b6009b4d2350a83aa
+ depends:
+ - __unix
+ license: ISC
+ purls: []
+ size: 152432
+ timestamp: 1762967197890
+- pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl
+ name: certifi
+ version: 2025.11.12
+ sha256: 97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl
+ name: cffi
+ version: 2.0.0
+ sha256: 19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75
+ requires_dist:
+ - pycparser ; implementation_name != 'PyPy'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl
+ name: cffi
+ version: 2.0.0
+ sha256: 45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca
+ requires_dist:
+ - pycparser ; implementation_name != 'PyPy'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: cffi
+ version: 2.0.0
+ sha256: c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26
+ requires_dist:
+ - pycparser ; implementation_name != 'PyPy'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
+ name: cffi
+ version: 2.0.0
+ sha256: d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b
+ requires_dist:
+ - pycparser ; implementation_name != 'PyPy'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
+ name: charset-normalizer
+ version: 3.4.4
+ sha256: 6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl
+ name: charset-normalizer
+ version: 3.4.4
+ sha256: e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl
+ name: charset-normalizer
+ version: 3.4.4
+ sha256: b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ name: charset-normalizer
+ version: 3.4.4
+ sha256: a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl
+ name: cloudpickle
+ version: 3.1.2
+ sha256: 9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a
+ requires_python: '>=3.8'
+- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
+ sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287
+ md5: 962b9857ee8e7018c22f2776ffa0b2d7
+ depends:
+ - python >=3.9
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/colorama?source=hash-mapping
+ size: 27011
+ timestamp: 1733218222191
+- pypi: https://files.pythonhosted.org/packages/44/83/a2960d2c975836daa629a73995134fd86520c101412578c57da3d2aa71ee/doit-0.36.0-py3-none-any.whl
+ name: doit
+ version: 0.36.0
+ sha256: ebc285f6666871b5300091c26eafdff3de968a6bd60ea35dd1e3fc6f2e32479a
+ requires_dist:
+ - cloudpickle
+ - importlib-metadata>=4.4
+ - tomli ; python_full_version < '3.11' and extra == 'toml'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/1a/7b/adf3f611f11997fc429d4b00a730604b65d952417f36a10c4be6e38e064d/duckdb-1.4.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
+ name: duckdb
+ version: 1.4.3
+ sha256: a2813f4635f4d6681cc3304020374c46aca82758c6740d7edbc237fe3aae2744
+ requires_dist:
+ - ipython ; extra == 'all'
+ - fsspec ; extra == 'all'
+ - numpy ; extra == 'all'
+ - pandas ; extra == 'all'
+ - pyarrow ; extra == 'all'
+ - adbc-driver-manager ; extra == 'all'
+ requires_python: '>=3.9.0'
+- pypi: https://files.pythonhosted.org/packages/40/d5/6b7ddda7713a788ab2d622c7267ec317718f2bdc746ce1fca49b7ff0e50f/duckdb-1.4.3-cp313-cp313-win_amd64.whl
+ name: duckdb
+ version: 1.4.3
+ sha256: 6db124f53a3edcb32b0a896ad3519e37477f7e67bf4811cb41ab60c1ef74e4c8
+ requires_dist:
+ - ipython ; extra == 'all'
+ - fsspec ; extra == 'all'
+ - numpy ; extra == 'all'
+ - pandas ; extra == 'all'
+ - pyarrow ; extra == 'all'
+ - adbc-driver-manager ; extra == 'all'
+ requires_python: '>=3.9.0'
+- pypi: https://files.pythonhosted.org/packages/73/dd/23152458cf5fd51e813fadda60b9b5f011517634aa4bb9301f5f3aa951d8/duckdb-1.4.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
+ name: duckdb
+ version: 1.4.3
+ sha256: 006aca6a6d6736c441b02ff5c7600b099bb8b7f4de094b8b062137efddce42df
+ requires_dist:
+ - ipython ; extra == 'all'
+ - fsspec ; extra == 'all'
+ - numpy ; extra == 'all'
+ - pandas ; extra == 'all'
+ - pyarrow ; extra == 'all'
+ - adbc-driver-manager ; extra == 'all'
+ requires_python: '>=3.9.0'
+- pypi: https://files.pythonhosted.org/packages/c4/19/57af0cc66ba2ffb8900f567c9aec188c6ab2a7b3f2260e9c6c3c5f9b57b1/duckdb-1.4.3-cp313-cp313-macosx_11_0_arm64.whl
+ name: duckdb
+ version: 1.4.3
+ sha256: 1e5457dda91b67258aae30fb1a0df84183a9f6cd27abac1d5536c0d876c6dfa1
+ requires_dist:
+ - ipython ; extra == 'all'
+ - fsspec ; extra == 'all'
+ - numpy ; extra == 'all'
+ - pandas ; extra == 'all'
+ - pyarrow ; extra == 'all'
+ - adbc-driver-manager ; extra == 'all'
+ requires_python: '>=3.9.0'
+- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
+ sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144
+ md5: 8e662bd460bda79b1ea39194e3c4c9ab
+ depends:
+ - python >=3.10
+ - typing_extensions >=4.6.0
+ license: MIT and PSF-2.0
+ purls:
+ - pkg:pypi/exceptiongroup?source=compressed-mapping
+ size: 21333
+ timestamp: 1763918099466
+- pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl
+ name: idna
+ version: '3.11'
+ sha256: 771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea
+ requires_dist:
+ - ruff>=0.6.2 ; extra == 'all'
+ - mypy>=1.11.2 ; extra == 'all'
+ - pytest>=8.3.2 ; extra == 'all'
+ - flake8>=7.1.1 ; extra == 'all'
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl
+ name: importlib-metadata
+ version: 8.7.0
+ sha256: e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd
+ requires_dist:
+ - zipp>=3.20
+ - typing-extensions>=3.6.4 ; python_full_version < '3.8'
+ - pytest>=6,!=8.1.* ; extra == 'test'
+ - importlib-resources>=1.3 ; python_full_version < '3.9' and extra == 'test'
+ - packaging ; extra == 'test'
+ - pyfakefs ; extra == 'test'
+ - flufl-flake8 ; extra == 'test'
+ - pytest-perf>=0.9.2 ; extra == 'test'
+ - jaraco-test>=5.4 ; extra == 'test'
+ - sphinx>=3.5 ; extra == 'doc'
+ - jaraco-packaging>=9.3 ; extra == 'doc'
+ - rst-linker>=1.9 ; extra == 'doc'
+ - furo ; extra == 'doc'
+ - sphinx-lint ; extra == 'doc'
+ - jaraco-tidelift>=1.4 ; extra == 'doc'
+ - ipython ; extra == 'perf'
+ - pytest-checkdocs>=2.4 ; extra == 'check'
+ - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check'
+ - pytest-cov ; extra == 'cover'
+ - pytest-enabler>=2.2 ; extra == 'enabler'
+ - pytest-mypy ; extra == 'type'
+ requires_python: '>=3.9'
+- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
+ sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19
+ md5: 9614359868482abba1bd15ce465e3c42
+ depends:
+ - python >=3.10
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/iniconfig?source=compressed-mapping
+ size: 13387
+ timestamp: 1760831448842
+- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
+ name: jinja2
+ version: 3.1.6
+ sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
+ requires_dist:
+ - markupsafe>=2.0
+ - babel>=2.7 ; extra == 'i18n'
+ requires_python: '>=3.7'
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda
+ sha256: 9e191baf2426a19507f1d0a17be0fdb7aa155cdf0f61d5a09c808e0a69464312
+ md5: a6abd2796fc332536735f68ba23f7901
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - zstd >=1.5.7,<1.6.0a0
+ constrains:
+ - binutils_impl_linux-64 2.45
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 725545
+ timestamp: 1764007826689
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda
+ sha256: 7a13072581fa23f658a04f62f62c4677c57d3c9696fbc01cc954a88fc354b44d
+ md5: 28035705fe0c977ea33963489cd008ad
+ depends:
+ - zstd >=1.5.7,<1.6.0a0
+ constrains:
+ - binutils_impl_linux-aarch64 2.45
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 875534
+ timestamp: 1764007911054
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda
+ sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f
+ md5: 8b09ae86839581147ef2e5c5e229d164
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - expat 2.7.3.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 76643
+ timestamp: 1763549731408
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda
+ sha256: cc2581a78315418cc2e0bb2a273d37363203e79cefe78ba6d282fed546262239
+ md5: b414e36fbb7ca122030276c75fa9c34a
+ depends:
+ - libgcc >=14
+ constrains:
+ - expat 2.7.3.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 76201
+ timestamp: 1763549910086
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda
+ sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98
+ md5: b79875dbb5b1db9a4a22a4520f918e1a
+ depends:
+ - __osx >=11.0
+ constrains:
+ - expat 2.7.3.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 67800
+ timestamp: 1763549994166
+- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda
+ sha256: 844ab708594bdfbd7b35e1a67c379861bcd180d6efe57b654f482ae2f7f5c21e
+ md5: 8c9e4f1a0e688eef2e95711178061a0f
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ constrains:
+ - expat 2.7.3.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 70137
+ timestamp: 1763550049107
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda
+ sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54
+ md5: 35f29eec58405aaf55e01cb470d8c26a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 57821
+ timestamp: 1760295480630
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda
+ sha256: 6c3332e78a975e092e54f87771611db81dcb5515a3847a3641021621de76caea
+ md5: 0c5ad486dcfb188885e3cf8ba209b97b
+ depends:
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 55586
+ timestamp: 1760295405021
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda
+ sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f
+ md5: 411ff7cd5d1472bba0f55c0faf04453b
+ depends:
+ - __osx >=11.0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 40251
+ timestamp: 1760295839166
+- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda
+ sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3
+ md5: ba4ad812d2afc22b9a34ce8327a0930f
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 44866
+ timestamp: 1760295760649
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda
+ sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451
+ md5: 6d0363467e6ed84f11435eb309f2ff06
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - _openmp_mutex >=4.5
+ constrains:
+ - libgcc-ng ==15.2.0=*_16
+ - libgomp 15.2.0 he0feb66_16
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 1042798
+ timestamp: 1765256792743
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda
+ sha256: 44bfc6fe16236babb271e0c693fe7fd978f336542e23c9c30e700483796ed30b
+ md5: cf9cd6739a3b694dcf551d898e112331
+ depends:
+ - _openmp_mutex >=4.5
+ constrains:
+ - libgomp 15.2.0 h8acb6b2_16
+ - libgcc-ng ==15.2.0=*_16
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 620637
+ timestamp: 1765256938043
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda
+ sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687
+ md5: 26c46f90d0e727e95c6c9498a33a09f3
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 603284
+ timestamp: 1765256703881
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda
+ sha256: 0a9d77c920db691eb42b78c734d70c5a1d00b3110c0867cfff18e9dd69bc3c29
+ md5: 4d2f224e8186e7881d53e3aead912f6c
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 587924
+ timestamp: 1765256821307
+- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda
+ sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8
+ md5: 1a580f7796c7bf6393fddb8bbbde58dc
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ constrains:
+ - xz 5.8.1.*
+ license: 0BSD
+ purls: []
+ size: 112894
+ timestamp: 1749230047870
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda
+ sha256: 498ea4b29155df69d7f20990a7028d75d91dbea24d04b2eb8a3d6ef328806849
+ md5: 7d362346a479256857ab338588190da0
+ depends:
+ - libgcc >=13
+ constrains:
+ - xz 5.8.1.*
+ license: 0BSD
+ purls: []
+ size: 125103
+ timestamp: 1749232230009
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda
+ sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285
+ md5: d6df911d4564d77c4374b02552cb17d1
+ depends:
+ - __osx >=11.0
+ constrains:
+ - xz 5.8.1.*
+ license: 0BSD
+ purls: []
+ size: 92286
+ timestamp: 1749230283517
+- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda
+ sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc
+ md5: c15148b2e18da456f5108ccb5e411446
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.2,<15
+ - vc14_runtime >=14.29.30139
+ constrains:
+ - xz 5.8.1.*
+ license: 0BSD
+ purls: []
+ size: 104935
+ timestamp: 1749230611612
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda
+ sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee
+ md5: c7e925f37e3b40d893459e625f6a53f1
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 91183
+ timestamp: 1748393666725
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda
+ sha256: ef8697f934c80b347bf9d7ed45650928079e303bad01bd064995b0e3166d6e7a
+ md5: 78cfed3f76d6f3f279736789d319af76
+ depends:
+ - libgcc >=13
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 114064
+ timestamp: 1748393729243
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda
+ sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2
+ md5: 85ccccb47823dd9f7a99d2c7f530342f
+ depends:
+ - __osx >=11.0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 71829
+ timestamp: 1748393749336
+- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda
+ sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf
+ md5: 74860100b2029e2523cf480804c76b9b
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.2,<15
+ - vc14_runtime >=14.29.30139
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 88657
+ timestamp: 1723861474602
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda
+ sha256: 6f0e8a812e8e33a4d8b7a0e595efe28373080d27b78ee4828aa4f6649a088454
+ md5: 2e1b84d273b01835256e53fd938de355
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libzlib >=1.3.1,<2.0a0
+ license: blessing
+ purls: []
+ size: 938979
+ timestamp: 1764359444435
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda
+ sha256: e394dd772b71dbcd653d078f3aacf6e26e3478bd6736a687ab86e463a2f153a8
+ md5: 233efdd411317d2dc5fde72464b3df7a
+ depends:
+ - libgcc >=14
+ - libzlib >=1.3.1,<2.0a0
+ license: blessing
+ purls: []
+ size: 939207
+ timestamp: 1764359457549
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda
+ sha256: a46b167447e2a9e38586320c30b29e3b68b6f7e6b873c18d6b1aa2efd2626917
+ md5: 67e50e5bd4e5e2310d66b88c4da50096
+ depends:
+ - __osx >=11.0
+ - libzlib >=1.3.1,<2.0a0
+ license: blessing
+ purls: []
+ size: 906292
+ timestamp: 1764359907797
+- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda
+ sha256: a976c8b455d9023b83878609bd68c3b035b9839d592bd6c7be7552c523773b62
+ md5: f92bef2f8e523bb0eabe60099683617a
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: blessing
+ purls: []
+ size: 1291059
+ timestamp: 1764359545703
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda
+ sha256: 030447cf827c471abd37092ab9714fde82b8222106f22fde94bc7a64e2704c40
+ md5: 41f5c09a211985c3ce642d60721e7c3e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 40235
+ timestamp: 1764790744114
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h1022ec0_1.conda
+ sha256: 3113c857e36779d94cf9a18236a710ceca0e94230b3bfeba0d134f33ee8c9ecd
+ md5: 15b2cc72b9b05bcb141810b1bada654f
+ depends:
+ - libgcc >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 43415
+ timestamp: 1764790752623
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
+ sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4
+ md5: edb0dca6bc32e4f4789199455a1dbeb8
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ constrains:
+ - zlib 1.3.1 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 60963
+ timestamp: 1727963148474
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda
+ sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84
+ md5: 08aad7cbe9f5a6b460d0976076b6ae64
+ depends:
+ - libgcc >=13
+ constrains:
+ - zlib 1.3.1 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 66657
+ timestamp: 1727963199518
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
+ sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b
+ md5: 369964e85dc26bfe78f41399b366c435
+ depends:
+ - __osx >=11.0
+ constrains:
+ - zlib 1.3.1 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 46438
+ timestamp: 1727963202283
+- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
+ sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402
+ md5: 41fbfac52c601159df6c01f875de31b9
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.2,<15
+ - vc14_runtime >=14.29.30139
+ constrains:
+ - zlib 1.3.1 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 55476
+ timestamp: 1727963768015
+- pypi: https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
+ name: markupsafe
+ version: 3.0.3
+ sha256: 133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl
+ name: markupsafe
+ version: 3.0.3
+ sha256: 9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl
+ name: markupsafe
+ version: 3.0.3
+ sha256: 116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ name: markupsafe
+ version: 3.0.3
+ sha256: ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676
+ requires_python: '>=3.9'
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586
+ md5: 47e340acb35de30501a76c7c799c41d7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: X11 AND BSD-3-Clause
+ purls: []
+ size: 891641
+ timestamp: 1738195959188
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda
+ sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468
+ md5: 182afabe009dc78d8b73100255ee6868
+ depends:
+ - libgcc >=13
+ license: X11 AND BSD-3-Clause
+ purls: []
+ size: 926034
+ timestamp: 1738196018799
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
+ sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733
+ md5: 068d497125e4bf8a66bf707254fff5ae
+ depends:
+ - __osx >=11.0
+ license: X11 AND BSD-3-Clause
+ purls: []
+ size: 797030
+ timestamp: 1738196177597
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda
+ sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d
+ md5: 9ee58d5c534af06558933af3c845a780
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - ca-certificates
+ - libgcc >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 3165399
+ timestamp: 1762839186699
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda
+ sha256: 8dd3b4c31fe176a3e51c5729b2c7f4c836a2ce3bd5c82082dc2a503ba9ee0af3
+ md5: 7624c6e01aecba942e9115e0f5a2af9d
+ depends:
+ - ca-certificates
+ - libgcc >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 3705625
+ timestamp: 1762841024958
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda
+ sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988
+ md5: b34dc4172653c13dcf453862f251af2b
+ depends:
+ - __osx >=11.0
+ - ca-certificates
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 3108371
+ timestamp: 1762839712322
+- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda
+ sha256: 6d72d6f766293d4f2aa60c28c244c8efed6946c430814175f959ffe8cab899b3
+ md5: 84f8fb4afd1157f59098f618cd2437e4
+ depends:
+ - ca-certificates
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 9440812
+ timestamp: 1762841722179
+- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda
+ sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991
+ md5: 58335b26c38bf4a20f399384c33cbcf9
+ depends:
+ - python >=3.8
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/packaging?source=hash-mapping
+ size: 62477
+ timestamp: 1745345660407
+- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
+ name: platformdirs
+ version: 4.5.1
+ sha256: d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31
+ requires_dist:
+ - furo>=2025.9.25 ; extra == 'docs'
+ - proselint>=0.14 ; extra == 'docs'
+ - sphinx-autodoc-typehints>=3.2 ; extra == 'docs'
+ - sphinx>=8.2.3 ; extra == 'docs'
+ - appdirs==1.4.4 ; extra == 'test'
+ - covdefaults>=2.3 ; extra == 'test'
+ - pytest-cov>=7 ; extra == 'test'
+ - pytest-mock>=3.15.1 ; extra == 'test'
+ - pytest>=8.4.2 ; extra == 'test'
+ - mypy>=1.18.2 ; extra == 'type'
+ requires_python: '>=3.10'
+- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
+ sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e
+ md5: d7585b6550ad04c8c5e21097ada2888e
+ depends:
+ - python >=3.9
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pluggy?source=compressed-mapping
+ size: 25877
+ timestamp: 1764896838868
+- pypi: https://files.pythonhosted.org/packages/1b/8b/5362443737a5307a7b67c1017c42cd104213189b4970bf607e05faf9c525/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl
+ name: pyarrow
+ version: 22.0.0
+ sha256: e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/2d/f8/1d0bd75bf9328a3b826e24a16e5517cd7f9fbf8d34a3184a4566ef5a7f29/pyarrow-22.0.0-cp313-cp313-win_amd64.whl
+ name: pyarrow
+ version: 22.0.0
+ sha256: a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/a6/d6/d0fac16a2963002fc22c8fa75180a838737203d558f0ed3b564c4a54eef5/pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl
+ name: pyarrow
+ version: 22.0.0
+ sha256: e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/ff/c0/782344c2ce58afbea010150df07e3a2f5fdad299cd631697ae7bd3bac6e3/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl
+ name: pyarrow
+ version: 22.0.0
+ sha256: ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691
+ requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl
+ name: pycparser
+ version: '2.23'
+ sha256: e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934
+ requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/3b/f7/c0f72a5a87537b5622931a59be33654fa6e7cce25497c42f54de45a54622/pygit2-1.19.0-cp313-cp313-macosx_10_13_universal2.whl
+ name: pygit2
+ version: 1.19.0
+ sha256: e84d4a1c8bcd462524bf9d0c5778c2219042c8aeeea82735e8f415d8f8519797
+ requires_dist:
+ - cffi>=2.0
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/6e/ae/58ff127fa1177f63c6b56bf77882a357779090a70aaaadbdfe71bbd98a27/pygit2-1.19.0-cp313-cp313-win_amd64.whl
+ name: pygit2
+ version: 1.19.0
+ sha256: 37ba33c59b8b941f7a2fa1014c11bc847c315ebbaeb92341f7f39efeab75edb2
+ requires_dist:
+ - cffi>=2.0
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/ba/40/3df9f3cc9397aae3c6befcea9f815393c8d0a53e9717b6ab4ca51f62ff72/pygit2-1.19.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
+ name: pygit2
+ version: 1.19.0
+ sha256: 5998943514b89fd4bf8ab11320872bc4c0b6d3517b27beaf79ff9591d3142f1c
+ requires_dist:
+ - cffi>=2.0
+ requires_python: '>=3.11'
+- pypi: https://files.pythonhosted.org/packages/dc/b3/f0c69382492f1f19030ee580fb85bd4cbae157ecf3b24ac89362a315539c/pygit2-1.19.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
+ name: pygit2
+ version: 1.19.0
+ sha256: 46f5f287f19053eb1ba36d72a7458712bc5dcdb1b667ecf162a6cae7e643afe2
+ requires_dist:
+ - cffi>=2.0
+ requires_python: '>=3.11'
+- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda
+ sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a
+ md5: 6b6ece66ebcae2d5f326c77ef2c5a066
+ depends:
+ - python >=3.9
+ license: BSD-2-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/pygments?source=hash-mapping
+ size: 889287
+ timestamp: 1750615908735
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda
+ sha256: 9e749fb465a8bedf0184d8b8996992a38de351f7c64e967031944978de03a520
+ md5: 2b694bad8a50dc2f712f5368de866480
+ depends:
+ - pygments >=2.7.2
+ - python >=3.10
+ - iniconfig >=1.0.1
+ - packaging >=22
+ - pluggy >=1.5,<2
+ - tomli >=1
+ - colorama >=0.4
+ - exceptiongroup >=1
+ - python
+ constrains:
+ - pytest-faulthandler >=2
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pytest?source=hash-mapping
+ size: 299581
+ timestamp: 1765062031645
+- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-lazy-fixtures-1.4.0-pyhd8ed1ab_0.conda
+ sha256: d8299885069ea20b0e48c4d6b97b2f508c26040e5740c9ce8b3d8abae4d68652
+ md5: 04673c65f0c6cf3c2fe3927df657d0ee
+ depends:
+ - pytest >=7
+ - python >=3.10,<4.0.0
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pytest-lazy-fixtures?source=hash-mapping
+ size: 14600
+ timestamp: 1758096611127
+- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_100_cp313.conda
+ build_number: 100
+ sha256: 9cf014cf28e93ee242bacfbf664e8b45ae06e50b04291e640abeaeb0cba0364c
+ md5: 0cbb0010f1d8ecb64a428a8d4214609e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - bzip2 >=1.0.8,<2.0a0
+ - ld_impl_linux-64 >=2.36.1
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - liblzma >=5.8.1,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.1,<4.0a0
+ - libuuid >=2.41.2,<3.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ncurses >=6.5,<7.0a0
+ - openssl >=3.5.4,<4.0a0
+ - python_abi 3.13.* *_cp313
+ - readline >=8.2,<9.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ license: Python-2.0
+ purls: []
+ size: 37226336
+ timestamp: 1765021889577
+ python_site_packages_path: lib/python3.13/site-packages
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_100_cp313.conda
+ build_number: 100
+ sha256: bbb0b341c3ce460d02087e1c5e0d3bb814c270f4ae61f82c0e2996ec3902d301
+ md5: a6e2b5b263090516ec36efdd51dcc35b
+ depends:
+ - bzip2 >=1.0.8,<2.0a0
+ - ld_impl_linux-aarch64 >=2.36.1
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - liblzma >=5.8.1,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.1,<4.0a0
+ - libuuid >=2.41.2,<3.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ncurses >=6.5,<7.0a0
+ - openssl >=3.5.4,<4.0a0
+ - python_abi 3.13.* *_cp313
+ - readline >=8.2,<9.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ license: Python-2.0
+ purls: []
+ size: 33896215
+ timestamp: 1765020450426
+ python_site_packages_path: lib/python3.13/site-packages
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_100_cp313.conda
+ build_number: 100
+ sha256: c476f4e9b6d97c46b496b442878924868a54e5727251549ebfc82027aa52af68
+ md5: 18a8c69608151098a8fb75eea64cc266
+ depends:
+ - __osx >=11.0
+ - bzip2 >=1.0.8,<2.0a0
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - liblzma >=5.8.1,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.1,<4.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ncurses >=6.5,<7.0a0
+ - openssl >=3.5.4,<4.0a0
+ - python_abi 3.13.* *_cp313
+ - readline >=8.2,<9.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ license: Python-2.0
+ purls: []
+ size: 12920650
+ timestamp: 1765020887340
+ python_site_packages_path: lib/python3.13/site-packages
+- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda
+ build_number: 100
+ sha256: 0ee0402368783e1fad10025719530499c517a3dbbdfbe18351841d9b7aef1d6a
+ md5: 9e4c9a7ee9c4ab5b3778ab73e583283e
+ depends:
+ - bzip2 >=1.0.8,<2.0a0
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - liblzma >=5.8.1,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.1,<4.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - openssl >=3.5.4,<4.0a0
+ - python_abi 3.13.* *_cp313
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ - ucrt >=10.0.20348.0
+ - vc >=14.3,<15
+ - vc14_runtime >=14.44.35208
+ license: Python-2.0
+ purls: []
+ size: 16617922
+ timestamp: 1765019627175
+ python_site_packages_path: Lib/site-packages
+- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda
+ build_number: 8
+ sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7
+ md5: 94305520c52a4aa3f6c2b1ff6008d9f8
+ constrains:
+ - python 3.13.* *_cp313
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 7002
+ timestamp: 1752805902938
+- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002
+ md5: d7d95fc8287ea7bf33e0e7116d2b95ec
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - ncurses >=6.5,<7.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 345073
+ timestamp: 1765813471974
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda
+ sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216
+ md5: 3d49cad61f829f4f0e0611547a9cda12
+ depends:
+ - libgcc >=14
+ - ncurses >=6.5,<7.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 357597
+ timestamp: 1765815673644
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
+ sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477
+ md5: f8381319127120ce51e081dce4865cf4
+ depends:
+ - __osx >=11.0
+ - ncurses >=6.5,<7.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 313930
+ timestamp: 1765813902568
+- pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl
+ name: requests
+ version: 2.32.5
+ sha256: 2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6
+ requires_dist:
+ - charset-normalizer>=2,<4
+ - idna>=2.5,<4
+ - urllib3>=1.21.1,<3
+ - certifi>=2017.4.17
+ - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks'
+ - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl
+ name: ruamel-yaml
+ version: 0.18.17
+ sha256: 9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d
+ requires_dist:
+ - ruamel-yaml-clib>=0.2.15 ; python_full_version < '3.15' and platform_python_implementation == 'CPython'
+ - ruamel-yaml-jinja2>=0.2 ; extra == 'jinja2'
+ - ryd ; extra == 'docs'
+ - mercurial>5.7 ; extra == 'docs'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl
+ name: ruamel-yaml-clib
+ version: 0.2.15
+ sha256: 45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
+ name: ruamel-yaml-clib
+ version: 0.2.15
+ sha256: 3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl
+ name: ruamel-yaml-clib
+ version: 0.2.15
+ sha256: 65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+ name: ruamel-yaml-clib
+ version: 0.2.15
+ sha256: 4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf
+ requires_python: '>=3.9'
+- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda
+ sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64
+ md5: 86bc20552bf46075e3d92b67f089172d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - xorg-libx11 >=1.8.12,<2.0a0
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3284905
+ timestamp: 1763054914403
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda
+ sha256: 154e73f6269f92ad5257aa2039278b083998fd19d371e150f307483fb93c07ae
+ md5: 631db4799bc2bfe4daccf80bb3cbc433
+ depends:
+ - libgcc >=13
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - xorg-libx11 >=1.8.12,<2.0a0
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3333495
+ timestamp: 1763059192223
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda
+ sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7
+ md5: a73d54a5abba6543cb2f0af1bfbd6851
+ depends:
+ - __osx >=11.0
+ - libzlib >=1.3.1,<2.0a0
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3125484
+ timestamp: 1763055028377
+- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda
+ sha256: 4581f4ffb432fefa1ac4f85c5682cc27014bcd66e7beaa0ee330e927a7858790
+ md5: 7cb36e506a7dba4817970f8adb6396f9
+ depends:
+ - ucrt >=10.0.20348.0
+ - vc >=14.2,<15
+ - vc14_runtime >=14.29.30139
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3472313
+ timestamp: 1763055164278
+- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda
+ sha256: cb77c660b646c00a48ef942a9e1721ee46e90230c7c570cdeb5a893b5cce9bff
+ md5: d2732eb636c264dc9aa4cbee404b1a53
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/tomli?source=compressed-mapping
+ size: 20973
+ timestamp: 1760014679845
+- pypi: https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl
+ name: tomlkit
+ version: 0.13.3
+ sha256: c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0
+ requires_python: '>=3.8'
+- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
+ sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731
+ md5: 0caa1af407ecff61170c9437a808404d
+ depends:
+ - python >=3.10
+ - python
+ license: PSF-2.0
+ license_family: PSF
+ purls:
+ - pkg:pypi/typing-extensions?source=hash-mapping
+ size: 51692
+ timestamp: 1756220668932
+- pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl
+ name: tzdata
+ version: '2025.3'
+ sha256: 06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1
+ requires_python: '>=2'
+- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda
+ sha256: 50fad5db6734d1bb73df1cf5db73215e326413d4b2137933f70708aa1840e25b
+ md5: 338201218b54cadff2e774ac27733990
+ license: LicenseRef-Public-Domain
+ purls: []
+ size: 119204
+ timestamp: 1765745742795
+- pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl
+ name: tzlocal
+ version: 5.3.1
+ sha256: eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d
+ requires_dist:
+ - tzdata ; sys_platform == 'win32'
+ - pytest>=4.3 ; extra == 'devenv'
+ - pytest-mock>=3.3 ; extra == 'devenv'
+ - pytest-cov ; extra == 'devenv'
+ - check-manifest ; extra == 'devenv'
+ - zest-releaser ; extra == 'devenv'
+ requires_python: '>=3.9'
+- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
+ sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5
+ md5: 71b24316859acd00bdb8b38f5e2ce328
+ constrains:
+ - vc14_runtime >=14.29.30037
+ - vs2015_runtime >=14.29.30037
+ license: LicenseRef-MicrosoftWindowsSDK10
+ purls: []
+ size: 694692
+ timestamp: 1756385147981
+- pypi: https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl
+ name: urllib3
+ version: 2.6.2
+ sha256: ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd
+ requires_dist:
+ - brotli>=1.2.0 ; platform_python_implementation == 'CPython' and extra == 'brotli'
+ - brotlicffi>=1.2.0.0 ; platform_python_implementation != 'CPython' and extra == 'brotli'
+ - h2>=4,<5 ; extra == 'h2'
+ - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks'
+ - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zstd'
+ requires_python: '>=3.9'
+- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_33.conda
+ sha256: 7036945b5fff304064108c22cbc1bb30e7536363782b0456681ee6cf209138bd
+ md5: 2d1c042360c09498891809a3765261be
+ depends:
+ - vc14_runtime >=14.42.34433
+ track_features:
+ - vc14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 19070
+ timestamp: 1765216452130
+- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_33.conda
+ sha256: 7e8f7da25d7ce975bbe7d7e6d6e899bf1f253e524a3427cc135a79f3a79c457c
+ md5: fb8e4914c5ad1c71b3c519621e1df7b8
+ depends:
+ - ucrt >=10.0.20348.0
+ - vcomp14 14.44.35208 h818238b_33
+ constrains:
+ - vs2015_runtime 14.44.35208.* *_33
+ license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime
+ license_family: Proprietary
+ purls: []
+ size: 684323
+ timestamp: 1765216366832
+- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_33.conda
+ sha256: f79edd878094e86af2b2bc1455b0a81e02839a784fb093d5996ad4cf7b810101
+ md5: 4cb6942b4bd846e51b4849f4a93c7e6d
+ depends:
+ - ucrt >=10.0.20348.0
+ constrains:
+ - vs2015_runtime 14.44.35208.* *_33
+ license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime
+ license_family: Proprietary
+ purls: []
+ size: 115073
+ timestamp: 1765216325898
+- pypi: https://files.pythonhosted.org/packages/38/1b/1d3af9103dc3f0758f01e5c90113753254cc47ab9a3767a726d2dafcf5aa/whenever-0.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ name: whenever
+ version: 0.9.4
+ sha256: a4759b9a45c1d280efd1b794e9c9fa6b6ac4708cbdad102e71ae487cafa4f3e3
+ requires_dist:
+ - tzdata>=2020.1 ; sys_platform == 'win32'
+ - tzlocal>=4.0 ; sys_platform != 'darwin' and sys_platform != 'linux'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/9f/e7/84381106a701c812652405f4d74093f6da7c2748a639084fd2c092cd2c78/whenever-0.9.4-py3-none-any.whl
+ name: whenever
+ version: 0.9.4
+ sha256: b373ece2ad5cf4667848af3057aefa8fbb443d20e721cf4259602cc801f9d176
+ requires_dist:
+ - tzdata>=2020.1 ; sys_platform == 'win32'
+ - tzlocal>=4.0 ; sys_platform != 'darwin' and sys_platform != 'linux'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/d7/95/1b32ae824ece99ec1ad154f78cec1e092171666167d47df83039fa35804a/whenever-0.9.4-cp313-cp313-macosx_11_0_arm64.whl
+ name: whenever
+ version: 0.9.4
+ sha256: 7b56922b939050964e9cfbf3304371e42ee00d39d2a3b7203f0fa171ff74bcbc
+ requires_dist:
+ - tzdata>=2020.1 ; sys_platform == 'win32'
+ - tzlocal>=4.0 ; sys_platform != 'darwin' and sys_platform != 'linux'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/e2/10/b63b29ead140d671cefa50718e1e7c7a228e8eb335e009f72c154d8fcb2a/whenever-0.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
+ name: whenever
+ version: 0.9.4
+ sha256: 134f22416e00f9c7df53d8c7373b86104afc72b232687fab55204b2d751468eb
+ requires_dist:
+ - tzdata>=2020.1 ; sys_platform == 'win32'
+ - tzlocal>=4.0 ; sys_platform != 'darwin' and sys_platform != 'linux'
+ requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
+ name: zipp
+ version: 3.23.0
+ sha256: 071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e
+ requires_dist:
+ - pytest>=6,!=8.1.* ; extra == 'test'
+ - jaraco-itertools ; extra == 'test'
+ - jaraco-functools ; extra == 'test'
+ - more-itertools ; extra == 'test'
+ - big-o ; extra == 'test'
+ - pytest-ignore-flaky ; extra == 'test'
+ - jaraco-test ; extra == 'test'
+ - sphinx>=3.5 ; extra == 'doc'
+ - jaraco-packaging>=9.3 ; extra == 'doc'
+ - rst-linker>=1.9 ; extra == 'doc'
+ - furo ; extra == 'doc'
+ - sphinx-lint ; extra == 'doc'
+ - jaraco-tidelift>=1.4 ; extra == 'doc'
+ - pytest-checkdocs>=2.4 ; extra == 'check'
+ - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check'
+ - pytest-cov ; extra == 'cover'
+ - pytest-enabler>=2.2 ; extra == 'enabler'
+ - pytest-mypy ; extra == 'type'
+ requires_python: '>=3.9'
+- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
+ sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7
+ md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 601375
+ timestamp: 1764777111296
+- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda
+ sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75
+ md5: c3655f82dcea2aa179b291e7099c1fcc
+ depends:
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 614429
+ timestamp: 1764777145593
diff --git a/c/driver/postgresql/validation/pixi.toml b/c/driver/postgresql/validation/pixi.toml
new file mode 100644
index 000000000..d74730a9b
--- /dev/null
+++ b/c/driver/postgresql/validation/pixi.toml
@@ -0,0 +1,34 @@
+# 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.
+
+[workspace]
+authors = ["Arrow ADBC Contributors"]
+channels = ["conda-forge"]
+name = "postgresql-validation"
+platforms = ["linux-64", "osx-arm64", "win-64", "linux-aarch64"]
+version = "0.1.0"
+
+[tasks]
+validate = "pytest -vvs --junit-xml=validation-report.xml -rfEsxX tests/"
+
+[dependencies]
+python = ">=3.13.5,<3.14"
+pytest-lazy-fixtures = ">=1.3.2,<2"
+
+[pypi-dependencies]
+adbc-drivers-dev = { git = "https://github.com/adbc-drivers/dev" }
+adbc-drivers-validation = { git = "https://github.com/adbc-drivers/validation" }
diff --git a/c/driver/postgresql/validation/pytest.ini b/c/driver/postgresql/validation/pytest.ini
new file mode 100644
index 000000000..25d1c8e14
--- /dev/null
+++ b/c/driver/postgresql/validation/pytest.ini
@@ -0,0 +1,24 @@
+# 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.
+
+[pytest]
+junit_suite_name = validation
+junit_duration_report = call
+xfail_strict = true
+
+markers =
+ feature: test for a driver-specific feature
diff --git a/c/driver/postgresql/validation/queries/ingest/decimal.toml b/c/driver/postgresql/validation/queries/ingest/decimal.toml
new file mode 100644
index 000000000..0f154e4b4
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/decimal.toml
@@ -0,0 +1,19 @@
+# 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.
+
+
+skip = "decimal ingest code has a bug and fix has not been merged in yet. https://github.com/apache/arrow-adbc/pull/3787"
diff --git a/c/driver/postgresql/validation/queries/ingest/time_ms.txtcase b/c/driver/postgresql/validation/queries/ingest/time_ms.txtcase
new file mode 100644
index 000000000..30dfb7d9b
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/time_ms.txtcase
@@ -0,0 +1,21 @@
+// 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.
+
+
+// part: metadata
+
+skip = "COPY Writer not implemented"
diff --git a/c/driver/postgresql/validation/queries/ingest/time_ns.txtcase b/c/driver/postgresql/validation/queries/ingest/time_ns.txtcase
new file mode 100644
index 000000000..30dfb7d9b
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/time_ns.txtcase
@@ -0,0 +1,21 @@
+// 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.
+
+
+// part: metadata
+
+skip = "COPY Writer not implemented"
diff --git a/c/driver/postgresql/validation/queries/ingest/time_s.txtcase b/c/driver/postgresql/validation/queries/ingest/time_s.txtcase
new file mode 100644
index 000000000..30dfb7d9b
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/time_s.txtcase
@@ -0,0 +1,21 @@
+// 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.
+
+
+// part: metadata
+
+skip = "COPY Writer not implemented"
diff --git a/c/driver/postgresql/validation/queries/ingest/timestamp_ms.txtcase b/c/driver/postgresql/validation/queries/ingest/timestamp_ms.txtcase
new file mode 100644
index 000000000..5ce7f358b
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/timestamp_ms.txtcase
@@ -0,0 +1,44 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "idx",
+ "format": "l",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value",
+ "format": "tsu:",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"idx": 0, "value": null}
+{"idx": 1, "value": 0}
+{"idx": 2, "value": 946684800123000}
+{"idx": 3, "value": 1684158330123000}
+{"idx": 4, "value": -62135596800000000}
+{"idx": 5, "value": 253402300799999000}
diff --git a/c/driver/postgresql/validation/queries/ingest/timestamp_ns.txtcase b/c/driver/postgresql/validation/queries/ingest/timestamp_ns.txtcase
new file mode 100644
index 000000000..ae5d1af24
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/timestamp_ns.txtcase
@@ -0,0 +1,44 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "idx",
+ "format": "l",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value",
+ "format": "tsu:",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"idx": 0, "value": null}
+{"idx": 1, "value": 0}
+{"idx": 2, "value": -9223372036854775}
+{"idx": 3, "value": 946684800000000}
+{"idx": 4, "value": 1684158330000000}
+{"idx": 5, "value": 9223372036854775}
diff --git a/c/driver/postgresql/validation/queries/ingest/timestamp_s.txtcase b/c/driver/postgresql/validation/queries/ingest/timestamp_s.txtcase
new file mode 100644
index 000000000..0982b82c3
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/timestamp_s.txtcase
@@ -0,0 +1,44 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "idx",
+ "format": "l",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value",
+ "format": "tsu:",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"idx": 0, "value": null}
+{"idx": 1, "value": 0}
+{"idx": 2, "value": 946684800000000}
+{"idx": 3, "value": 1684158330000000}
+{"idx": 4, "value": -62135596800000000}
+{"idx": 5, "value": 253402300799000000}
diff --git a/c/driver/postgresql/validation/queries/ingest/timestamptz_ms.txtcase b/c/driver/postgresql/validation/queries/ingest/timestamptz_ms.txtcase
new file mode 100644
index 000000000..81ce61315
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/timestamptz_ms.txtcase
@@ -0,0 +1,49 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "idx",
+ "format": "l",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value2",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"idx": 0, "value": null, "value2": null}
+{"idx": 1, "value": 0, "value2": 0}
+{"idx": 2, "value": 946684800123000, "value2": 946684800123000}
+{"idx": 3, "value": 1684158330123000, "value2": 1684158330123000}
+{"idx": 4, "value": -62135596800000000, "value2": -62135596800000000}
+{"idx": 5, "value": 253402300799999000, "value2": 253402300799999000}
diff --git a/c/driver/postgresql/validation/queries/ingest/timestamptz_ns.txtcase b/c/driver/postgresql/validation/queries/ingest/timestamptz_ns.txtcase
new file mode 100644
index 000000000..12e8ed264
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/timestamptz_ns.txtcase
@@ -0,0 +1,50 @@
+// 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.
+
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "idx",
+ "format": "l",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value2",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"idx": 0, "value": null, "value2": null}
+{"idx": 1, "value": 0, "value2": 0}
+{"idx": 2, "value": -9223372036854775, "value2": -9223372036854775}
+{"idx": 3, "value": 946684800000000, "value2": 946684800000000}
+{"idx": 4, "value": 1684158330000000, "value2": 1684158330000000}
+{"idx": 5, "value": 9223372036854775, "value2": 9223372036854775}
diff --git a/c/driver/postgresql/validation/queries/ingest/timestamptz_s.txtcase b/c/driver/postgresql/validation/queries/ingest/timestamptz_s.txtcase
new file mode 100644
index 000000000..9d2580d92
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/ingest/timestamptz_s.txtcase
@@ -0,0 +1,49 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "idx",
+ "format": "l",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "value2",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"idx": 0, "value": null, "value2": null}
+{"idx": 1, "value": 0, "value2": 0}
+{"idx": 2, "value": 946684800000000, "value2": 946684800000000}
+{"idx": 3, "value": 1684158330000000, "value2": 1684158330000000}
+{"idx": 4, "value": -62135596800000000, "value2": -62135596800000000}
+{"idx": 5, "value": 253402300799000000, "value2": 253402300799000000}
diff --git a/c/driver/postgresql/validation/queries/type/bind/binary.bind.sql b/c/driver/postgresql/validation/queries/type/bind/binary.bind.sql
new file mode 100644
index 000000000..24151ef0e
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/binary.bind.sql
@@ -0,0 +1 @@
+INSERT INTO test_binary (res) VALUES ($1)
diff --git a/c/driver/postgresql/validation/queries/type/bind/binary.setup.sql b/c/driver/postgresql/validation/queries/type/bind/binary.setup.sql
new file mode 100644
index 000000000..228cde867
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/binary.setup.sql
@@ -0,0 +1,3 @@
+CREATE TABLE test_binary (
+ res BYTEA
+);
diff --git a/c/driver/postgresql/validation/queries/type/bind/binary_view.setup.sql b/c/driver/postgresql/validation/queries/type/bind/binary_view.setup.sql
new file mode 100644
index 000000000..0f9cb3f0e
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/binary_view.setup.sql
@@ -0,0 +1,3 @@
+CREATE TABLE test_binary_view (
+ res BYTEA
+);
diff --git a/c/driver/postgresql/validation/queries/type/bind/decimal.toml b/c/driver/postgresql/validation/queries/type/bind/decimal.toml
new file mode 100644
index 000000000..0f154e4b4
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/decimal.toml
@@ -0,0 +1,19 @@
+# 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.
+
+
+skip = "decimal ingest code has a bug and fix has not been merged in yet. https://github.com/apache/arrow-adbc/pull/3787"
diff --git a/c/driver/postgresql/validation/queries/type/bind/fixed_size_binary.setup.sql b/c/driver/postgresql/validation/queries/type/bind/fixed_size_binary.setup.sql
new file mode 100644
index 000000000..468c8cc65
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/fixed_size_binary.setup.sql
@@ -0,0 +1,3 @@
+CREATE TABLE test_fixed_size_binary (
+ res BYTEA
+);
diff --git a/c/driver/postgresql/validation/queries/type/bind/large_binary.setup.sql b/c/driver/postgresql/validation/queries/type/bind/large_binary.setup.sql
new file mode 100644
index 000000000..bbc3b3385
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/large_binary.setup.sql
@@ -0,0 +1,3 @@
+CREATE TABLE test_large_binary (
+ res BYTEA
+);
diff --git a/c/driver/postgresql/validation/queries/type/bind/large_string.setup.sql b/c/driver/postgresql/validation/queries/type/bind/large_string.setup.sql
new file mode 100644
index 000000000..d3aaa565e
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/large_string.setup.sql
@@ -0,0 +1,3 @@
+CREATE TABLE test_large_string (
+ res TEXT
+);
diff --git a/c/driver/postgresql/validation/queries/type/bind/string.setup.sql b/c/driver/postgresql/validation/queries/type/bind/string.setup.sql
new file mode 100644
index 000000000..d77bdb858
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/string.setup.sql
@@ -0,0 +1,3 @@
+CREATE TABLE test_string (
+ res TEXT
+);
diff --git a/c/driver/postgresql/validation/queries/type/bind/string_view.setup.sql b/c/driver/postgresql/validation/queries/type/bind/string_view.setup.sql
new file mode 100644
index 000000000..97c767c1a
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/string_view.setup.sql
@@ -0,0 +1,3 @@
+CREATE TABLE test_string_view (
+ res TEXT
+);
diff --git a/c/driver/postgresql/validation/queries/type/bind/time_ms.txtcase b/c/driver/postgresql/validation/queries/type/bind/time_ms.txtcase
new file mode 100644
index 000000000..30dfb7d9b
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/time_ms.txtcase
@@ -0,0 +1,21 @@
+// 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.
+
+
+// part: metadata
+
+skip = "COPY Writer not implemented"
diff --git a/c/driver/postgresql/validation/queries/type/bind/time_ns.txtcase b/c/driver/postgresql/validation/queries/type/bind/time_ns.txtcase
new file mode 100644
index 000000000..30dfb7d9b
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/time_ns.txtcase
@@ -0,0 +1,21 @@
+// 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.
+
+
+// part: metadata
+
+skip = "COPY Writer not implemented"
diff --git a/c/driver/postgresql/validation/queries/type/bind/time_s.txtcase b/c/driver/postgresql/validation/queries/type/bind/time_s.txtcase
new file mode 100644
index 000000000..30dfb7d9b
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/time_s.txtcase
@@ -0,0 +1,21 @@
+// 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.
+
+
+// part: metadata
+
+skip = "COPY Writer not implemented"
diff --git a/c/driver/postgresql/validation/queries/type/bind/timestamp_ms.txtcase b/c/driver/postgresql/validation/queries/type/bind/timestamp_ms.txtcase
new file mode 100644
index 000000000..9c8ea8378
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/timestamp_ms.txtcase
@@ -0,0 +1,38 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "tsu:",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"res": null}
+{"res": -62135596800000000}
+{"res": 946684800123000}
+{"res": 1684158330123000}
+{"res": 253402300799999000}
diff --git a/c/driver/postgresql/validation/queries/type/bind/timestamp_ns.txtcase b/c/driver/postgresql/validation/queries/type/bind/timestamp_ns.txtcase
new file mode 100644
index 000000000..61832e3fa
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/timestamp_ns.txtcase
@@ -0,0 +1,38 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "tsu:",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"res": null}
+{"res": -9223372036854775}
+{"res": 946684800000000}
+{"res": 1684158330000000}
+{"res": 9223372036854775}
diff --git a/c/driver/postgresql/validation/queries/type/bind/timestamp_s.txtcase b/c/driver/postgresql/validation/queries/type/bind/timestamp_s.txtcase
new file mode 100644
index 000000000..d3ef94a03
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/timestamp_s.txtcase
@@ -0,0 +1,38 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "tsu:",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"res": null}
+{"res": -62135596800000000}
+{"res": 946684800000000}
+{"res": 1684158330000000}
+{"res": 253402300799000000}
diff --git a/c/driver/postgresql/validation/queries/type/bind/timestamptz_ms.txtcase b/c/driver/postgresql/validation/queries/type/bind/timestamptz_ms.txtcase
new file mode 100644
index 000000000..53fee0306
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/timestamptz_ms.txtcase
@@ -0,0 +1,43 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "res2",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"res": null, "res2": null}
+{"res": -14182940000000, "res2": -14182940000000}
+{"res": 946684800000000, "res2": 946684800000000}
+{"res": 1684158330000000, "res2": 1684158330000000}
+{"res": 253402300799999000, "res2": 253402300799999000}
diff --git a/c/driver/postgresql/validation/queries/type/bind/timestamptz_ns.txtcase b/c/driver/postgresql/validation/queries/type/bind/timestamptz_ns.txtcase
new file mode 100644
index 000000000..19129c5e1
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/timestamptz_ns.txtcase
@@ -0,0 +1,43 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "res2",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"res": null, "res2": null}
+{"res": -9223372036854775, "res2": -9223372036854775}
+{"res": 946684800000000, "res2": 946684800000000}
+{"res": 1684158330000000, "res2": 1684158330000000}
+{"res": 9223372036854775, "res2": 9223372036854775}
diff --git a/c/driver/postgresql/validation/queries/type/bind/timestamptz_s.txtcase b/c/driver/postgresql/validation/queries/type/bind/timestamptz_s.txtcase
new file mode 100644
index 000000000..f506ac409
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/bind/timestamptz_s.txtcase
@@ -0,0 +1,43 @@
+// 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.
+
+
+// part: expected_schema
+
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ },
+ {
+ "name": "res2",
+ "format": "tsu:UTC",
+ "flags": ["nullable"]
+ }
+ ]
+}
+
+// part: expected
+
+{"res": null, "res2": null}
+{"res": -14182940000000, "res2": -14182940000000}
+{"res": 946684800000000, "res2": 946684800000000}
+{"res": 1684158330000000, "res2": 1684158330000000}
+{"res": 253402300799000000, "res2": 253402300799000000}
diff --git a/c/driver/postgresql/validation/queries/type/literal/binary.sql b/c/driver/postgresql/validation/queries/type/literal/binary.sql
new file mode 100644
index 000000000..c00c25a6c
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/literal/binary.sql
@@ -0,0 +1 @@
+SELECT decode('e38193e38293e381abe381a1e381afe38081e4b896e7958cefbc81', 'hex') AS res
diff --git a/c/driver/postgresql/validation/queries/type/literal/decimal.schema.json b/c/driver/postgresql/validation/queries/type/literal/decimal.schema.json
new file mode 100644
index 000000000..8cc1d06df
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/literal/decimal.schema.json
@@ -0,0 +1,14 @@
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "u",
+ "flags": ["nullable"],
+ "metadata": {
+ "ARROW:extension:name": "arrow.opaque",
+ "ARROW:extension:metadata": "{\"type_name\": \"numeric\", \"vendor_name\": \"PostgreSQL\"}"
+ }
+ }
+ ]
+}
diff --git a/c/driver/postgresql/validation/queries/type/select/binary.setup.sql b/c/driver/postgresql/validation/queries/type/select/binary.setup.sql
new file mode 100644
index 000000000..070b84a85
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/select/binary.setup.sql
@@ -0,0 +1,10 @@
+CREATE TABLE test_binary (
+ idx INTEGER,
+ res BYTEA
+);
+
+INSERT INTO test_binary (idx, res) VALUES (1, E'\\xe38193e38293e381abe381a1e381afe38081e4b896e7958cefbc81'); -- 'こんにちは、世界!' in UTF-8
+INSERT INTO test_binary (idx, res) VALUES (2, E'\\x00');
+INSERT INTO test_binary (idx, res) VALUES (3, E'\\xdeadbeef');
+INSERT INTO test_binary (idx, res) VALUES (4, E'\\x');
+INSERT INTO test_binary (idx, res) VALUES (5, NULL);
diff --git a/c/driver/postgresql/validation/queries/type/select/decimal.schema.json b/c/driver/postgresql/validation/queries/type/select/decimal.schema.json
new file mode 100644
index 000000000..8cc1d06df
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/select/decimal.schema.json
@@ -0,0 +1,14 @@
+{
+ "format": "+s",
+ "children": [
+ {
+ "name": "res",
+ "format": "u",
+ "flags": ["nullable"],
+ "metadata": {
+ "ARROW:extension:name": "arrow.opaque",
+ "ARROW:extension:metadata": "{\"type_name\": \"numeric\", \"vendor_name\": \"PostgreSQL\"}"
+ }
+ }
+ ]
+}
diff --git a/c/driver/postgresql/validation/queries/type/select/string.setup.sql b/c/driver/postgresql/validation/queries/type/select/string.setup.sql
new file mode 100644
index 000000000..1a401e65c
--- /dev/null
+++ b/c/driver/postgresql/validation/queries/type/select/string.setup.sql
@@ -0,0 +1,10 @@
+CREATE TABLE test_string (
+ idx INTEGER,
+ res TEXT
+);
+
+INSERT INTO test_string (idx, res) VALUES (1, 'hello');
+INSERT INTO test_string (idx, res) VALUES (2, '');
+INSERT INTO test_string (idx, res) VALUES (3, 'Special chars: !@#$%^&*()_+{}|:"<>?~`-=[]\;'',./');
+INSERT INTO test_string (idx, res) VALUES (4, 'Unicode: 你好, Привет, こんにちは, สวัสดี');
+INSERT INTO test_string (idx, res) VALUES (5, NULL);
diff --git a/c/driver/postgresql/validation/tests/__init__.py b/c/driver/postgresql/validation/tests/__init__.py
new file mode 100644
index 000000000..13a83393a
--- /dev/null
+++ b/c/driver/postgresql/validation/tests/__init__.py
@@ -0,0 +1,16 @@
+# 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.
diff --git a/c/driver/postgresql/validation/tests/conftest.py b/c/driver/postgresql/validation/tests/conftest.py
new file mode 100644
index 000000000..8381e4df0
--- /dev/null
+++ b/c/driver/postgresql/validation/tests/conftest.py
@@ -0,0 +1,69 @@
+# 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.
+
+import sys
+from pathlib import Path
+
+import adbc_drivers_validation.model
+import pytest
+from adbc_drivers_validation.tests.conftest import ( # noqa: F401
+ conn,
+ conn_factory,
+ manual_test,
+ noci,
+ pytest_addoption,
+ pytest_collection_modifyitems,
+)
+
+from .postgresql import PostgreSQLQuirks
+
+
+@pytest.fixture(scope="session")
+def driver(request) -> adbc_drivers_validation.model.DriverQuirks:
+ driver = request.param
+ assert driver.startswith("postgresql:")
+ return PostgreSQLQuirks()
+
+
+@pytest.fixture(scope="session")
+def driver_path(driver: adbc_drivers_validation.model.DriverQuirks) -> str:
+ ext = {
+ "win32": "dll",
+ "darwin": "dylib",
+ }.get(sys.platform, "so")
+ # Library can be in multiple possible locations
+ # base = c/driver/postgresql
+ base = Path(__file__).parent.parent.parent
+
+ possible_paths = [
+ # 1. c/build/driver/postgresql/ (CMake build from c/ directory)
+ base.parent.parent
+ / f"build/driver/{driver.name}/libadbc_driver_{driver.name}.{ext}",
+ # 2. <repo-root>/build/driver/postgresql/ (CI build location)
+ base.parent.parent.parent
+ / f"build/driver/{driver.name}/libadbc_driver_{driver.name}.{ext}",
+ # 3. c/driver/postgresql/build/ (local CMake build from driver dir)
+ base / f"build/libadbc_driver_{driver.name}.{ext}",
+ # 4. c/driver/postgresql/ (direct build output in driver dir)
+ base / f"libadbc_driver_{driver.name}.{ext}",
+ ]
+
+ for path in possible_paths:
+ if path.exists():
+ return str(path)
+
+ return str(possible_paths[0])
diff --git a/c/driver/postgresql/validation/tests/postgresql.py b/c/driver/postgresql/validation/tests/postgresql.py
new file mode 100644
index 000000000..95fa509a4
--- /dev/null
+++ b/c/driver/postgresql/validation/tests/postgresql.py
@@ -0,0 +1,90 @@
+# 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.
+
+from pathlib import Path
+
+from adbc_drivers_validation import model, quirks
+
+
+class PostgreSQLQuirks(model.DriverQuirks):
+ name = "postgresql"
+ driver = "adbc_driver_postgresql"
+ driver_name = "ADBC PostgreSQL Driver"
+ vendor_name = "PostgreSQL"
+ vendor_version = "180000"
+ short_version = "15+"
+ features = model.DriverFeatures(
+ connection_get_table_schema=True,
+ connection_transactions=True,
+ get_objects_constraints_foreign=False,
+ get_objects_constraints_primary=False,
+ get_objects_constraints_unique=False,
+ statement_bulk_ingest=True,
+ statement_bulk_ingest_catalog=False,
+ statement_bulk_ingest_schema=False,
+ statement_bulk_ingest_temporary=False,
+ statement_execute_schema=True,
+ statement_get_parameter_schema=True,
+ statement_rows_affected=True,
+ current_catalog="postgres",
+ current_schema="public",
+ supported_xdbc_fields=[],
+ )
+ setup = model.DriverSetup(
+ database={
+ "uri": model.FromEnv("ADBC_POSTGRESQL_TEST_URI"),
+ },
+ connection={},
+ statement={},
+ )
+
+ @property
+ def queries_paths(self) -> tuple[Path]:
+ return (Path(__file__).parent.parent / "queries",)
+
+ def bind_parameter(self, index: int) -> str:
+ """PostgreSQL uses $1, $2, $3, etc. for parameter placeholders."""
+ return f"${index}"
+
+ def is_table_not_found(self, table_name: str, error: Exception) -> bool:
+ """Check if the error indicates a table not found condition."""
+ error_str = str(error).lower()
+ return (
+ (
+ "relation" in error_str
+ and "does not exist" in error_str
+ and table_name.lower() in error_str
+ )
+ or (
+ "table" in error_str
+ and "does not exist" in error_str
+ and table_name.lower() in error_str
+ )
+ or ("undefined_table" in error_str and table_name.lower() in error_str)
+ )
+
+ def quote_one_identifier(self, identifier: str) -> str:
+ """Quote an identifier using PostgreSQL's double-quote syntax."""
+ identifier = identifier.replace('"', '""')
+ return f'"{identifier}"'
+
+ def split_statement(self, statement: str) -> list[str]:
+ """Split a multi-statement SQL string into individual statements."""
+ return quirks.split_statement(statement)
+
+
+QUIRKS = [PostgreSQLQuirks()]
diff --git a/c/driver/postgresql/validation/tests/test_connection.py b/c/driver/postgresql/validation/tests/test_connection.py
new file mode 100644
index 000000000..7c719bbf5
--- /dev/null
+++ b/c/driver/postgresql/validation/tests/test_connection.py
@@ -0,0 +1,27 @@
+# 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.
+
+from adbc_drivers_validation.tests.connection import TestConnection # noqa: F401
+from adbc_drivers_validation.tests.connection import (
+ generate_tests,
+)
+
+from . import postgresql
+
+
+def pytest_generate_tests(metafunc) -> None:
+ return generate_tests(postgresql.QUIRKS, metafunc)
diff --git a/c/driver/postgresql/validation/tests/test_ingest.py b/c/driver/postgresql/validation/tests/test_ingest.py
new file mode 100644
index 000000000..e764e577d
--- /dev/null
+++ b/c/driver/postgresql/validation/tests/test_ingest.py
@@ -0,0 +1,27 @@
+# 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.
+
+from adbc_drivers_validation.tests.ingest import TestIngest # noqa: F401
+from adbc_drivers_validation.tests.ingest import (
+ generate_tests,
+)
+
+from . import postgresql
+
+
+def pytest_generate_tests(metafunc) -> None:
+ return generate_tests(postgresql.QUIRKS, metafunc)
diff --git a/c/driver/postgresql/validation/tests/test_query.py b/c/driver/postgresql/validation/tests/test_query.py
new file mode 100644
index 000000000..3750be471
--- /dev/null
+++ b/c/driver/postgresql/validation/tests/test_query.py
@@ -0,0 +1,27 @@
+# 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.
+
+from adbc_drivers_validation.tests.query import TestQuery # noqa: F401
+from adbc_drivers_validation.tests.query import (
+ generate_tests,
+)
+
+from . import postgresql
+
+
+def pytest_generate_tests(metafunc) -> None:
+ return generate_tests(postgresql.QUIRKS, metafunc)
diff --git a/c/driver/postgresql/validation/tests/test_statement.py b/c/driver/postgresql/validation/tests/test_statement.py
new file mode 100644
index 000000000..594c7c270
--- /dev/null
+++ b/c/driver/postgresql/validation/tests/test_statement.py
@@ -0,0 +1,97 @@
+# 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.
+
+from adbc_drivers_validation import model
+from adbc_drivers_validation.tests.statement import TestStatement as BaseTestStatement
+from adbc_drivers_validation.tests.statement import (
+ generate_tests,
+)
+
+import adbc_driver_manager
+
+from . import postgresql
+
+
+class TestStatement(BaseTestStatement):
+ """PostgreSQL-specific statement tests with overrides."""
+
+ # TODO(https://github.com/adbc-drivers/validation/issues/140):
+ # Remove this override once validation framework supports separate
+ # statement_ddl_rows_affected flag. PostgreSQL returns -1 for DDL
+ # but exact counts for DML, which doesn't fit the current binary flag.
+ def test_rows_affected(
+ self,
+ driver: model.DriverQuirks,
+ conn: adbc_driver_manager.dbapi.Connection,
+ ) -> None:
+ """Override to accept -1 for CREATE TABLE"""
+ table_name = "test_rows_affected"
+ with conn.cursor() as cursor:
+ cursor.adbc_statement.set_sql_query(
+ driver.drop_table(table_name="test_rows_affected")
+ )
+ try:
+ cursor.adbc_statement.execute_update()
+ except adbc_driver_manager.Error as e:
+ if not driver.is_table_not_found(table_name=table_name, error=e):
+ raise
+
+ cursor.adbc_statement.set_sql_query(f"CREATE TABLE {table_name} (id INT)")
+ rows_affected = cursor.adbc_statement.execute_update()
+
+ # PostgreSQL returns -1 for CREATE TABLE
+ assert rows_affected == -1
+
+ cursor.adbc_statement.set_sql_query(
+ f"INSERT INTO {table_name} (id) VALUES (1)"
+ )
+ rows_affected = cursor.adbc_statement.execute_update()
+ if driver.features.statement_rows_affected:
+ assert rows_affected == 1
+ else:
+ assert rows_affected == -1
+
+ cursor.adbc_statement.set_sql_query(
+ f"UPDATE {table_name} SET id = id + 1 WHERE id = 1"
+ )
+ rows_affected = cursor.adbc_statement.execute_update()
+ if driver.features.statement_rows_affected:
+ assert rows_affected == 1
+ else:
+ assert rows_affected == -1
+
+ cursor.adbc_statement.set_sql_query(
+ f"DELETE FROM {table_name} WHERE id = 2"
+ )
+ rows_affected = cursor.adbc_statement.execute_update()
+ if driver.features.statement_rows_affected:
+ assert rows_affected == 1
+ else:
+ assert rows_affected == -1
+
+ cursor.adbc_statement.set_sql_query(
+ driver.drop_table(table_name="test_rows_affected")
+ )
+ try:
+ cursor.adbc_statement.execute_update()
+ except adbc_driver_manager.Error as e:
+ if not driver.is_table_not_found(table_name=table_name, error=e):
+ raise
+
+
+def pytest_generate_tests(metafunc) -> None:
+ return generate_tests(postgresql.QUIRKS, metafunc)
diff --git a/dev/release/rat_exclude_files.txt b/dev/release/rat_exclude_files.txt
index 0f730fa3c..62de66100 100644
--- a/dev/release/rat_exclude_files.txt
+++ b/dev/release/rat_exclude_files.txt
@@ -1,8 +1,10 @@
*.json
+*.lock
*.Rproj
*.Rd
.codespell-dictionary
.codespell-ignore
+c/driver/postgresql/validation/queries/**/*.sql
c/subprojects/fmt.wrap
c/subprojects/gtest.wrap
c/subprojects/nanoarrow.wrap
diff --git a/glib/test/helper.rb b/glib/test/helper.rb
index 7e99ac810..bfafd881c 100644
--- a/glib/test/helper.rb
+++ b/glib/test/helper.rb
@@ -70,7 +70,7 @@ module Helper
def normalize_arrow_version(version)
return nil if version.nil?
- version.gsub(/\A\d+\.\d+\.\d+(?:-SNAPSHOT)?\z/, "X.Y.Z")
+ version.gsub(/\Av?\d+\.\d+\.\d+(?:-SNAPSHOT)?\z/, "vX.Y.Z")
end
def normalize_info(info)
diff --git a/glib/test/test-arrow-connection.rb b/glib/test/test-arrow-connection.rb
index 5827417a3..282593675 100644
--- a/glib/test/test-arrow-connection.rb
+++ b/glib/test/test-arrow-connection.rb
@@ -49,8 +49,8 @@ class ArrowConnectionTest < Test::Unit::TestCase
[ADBC::Info::VENDOR_NAME, "PostgreSQL"],
[ADBC::Info::VENDOR_VERSION, "X.Y.Z"],
[ADBC::Info::DRIVER_NAME, "ADBC PostgreSQL Driver"],
- [ADBC::Info::DRIVER_VERSION, "(unknown)"],
- [ADBC::Info::DRIVER_ARROW_VERSION, "X.Y.Z"],
+ [ADBC::Info::DRIVER_VERSION, "unknown"],
+ [ADBC::Info::DRIVER_ARROW_VERSION, "vX.Y.Z"],
[ADBC::Info::DRIVER_ADBC_VERSION, ADBC::VERSION_1_1_0],
],
normalize_info(table.raw_records))
diff --git a/glib/test/test-connection.rb b/glib/test/test-connection.rb
index aa4c2e484..e76c72d1d 100644
--- a/glib/test/test-connection.rb
+++ b/glib/test/test-connection.rb
@@ -49,8 +49,8 @@ class ConnectionTest < Test::Unit::TestCase
[ADBC::Info::VENDOR_NAME, "PostgreSQL"],
[ADBC::Info::VENDOR_VERSION, "X.Y.Z"],
[ADBC::Info::DRIVER_NAME, "ADBC PostgreSQL Driver"],
- [ADBC::Info::DRIVER_VERSION, "(unknown)"],
- [ADBC::Info::DRIVER_ARROW_VERSION, "X.Y.Z"],
+ [ADBC::Info::DRIVER_VERSION, "unknown"],
+ [ADBC::Info::DRIVER_ARROW_VERSION, "vX.Y.Z"],
[ADBC::Info::DRIVER_ADBC_VERSION, ADBC::VERSION_1_1_0],
],
normalize_info(table.raw_records))