From 39b3f71dc7739e75586b0bd5717801a941e6ef1d Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 14 Nov 2025 16:49:17 +0800 Subject: [PATCH 01/16] chore: bump gaussdb package version to 1.0.4 --- gaussdb/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gaussdb/pyproject.toml b/gaussdb/pyproject.toml index 298a661f4..8931c1b4b 100644 --- a/gaussdb/pyproject.toml +++ b/gaussdb/pyproject.toml @@ -7,7 +7,7 @@ name = "gaussdb" description = "GaussDB database adapter for Python" # STOP AND READ! if you change: -version = "1.0.3" +version = "1.0.4" # also change: # - `docs/news.rst` to declare this as the current version or an unreleased one; # - `gaussdb_c/pyproject.toml` to the same version; From 33f9b594a694734dc415ffbbfb375b23b1305cba Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 14 Nov 2025 16:49:17 +0800 Subject: [PATCH 02/16] chore: bump gaussdb_pool package version to 1.0.4 --- gaussdb_pool/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gaussdb_pool/pyproject.toml b/gaussdb_pool/pyproject.toml index 28ec50718..e4fbb0dd3 100644 --- a/gaussdb_pool/pyproject.toml +++ b/gaussdb_pool/pyproject.toml @@ -7,7 +7,7 @@ name = "gaussdb-pool" description = "Connection Pool for GaussDB" # STOP AND READ! if you change: -version = "1.0.3" +version = "1.0.4" # also change: # - `docs/news_pool.rst` to declare this version current or unreleased From e2f8e9ba9892b86b730f14eccf63f5c4721863ef Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 14 Nov 2025 16:49:17 +0800 Subject: [PATCH 03/16] chore: bump isort_gaussdb package version to 0.0.6 --- tools/isort-gaussdb/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/isort-gaussdb/pyproject.toml b/tools/isort-gaussdb/pyproject.toml index 7c56f20a0..565b428ae 100644 --- a/tools/isort-gaussdb/pyproject.toml +++ b/tools/isort-gaussdb/pyproject.toml @@ -8,7 +8,7 @@ description = "isort plug-in to sort imports by module length first" # Note: to release a new version: # python -m build -o dist --wheel . # twine upload dist/isort_gaussdb-*-py3-none-any.whl -version = "0.0.5" +version = "0.0.6" [project.urls] Homepage = "https://github.com/HuaweiCloudDeveloper/gaussdb-python/" From 38ccc51648cc4cf0d132faa8fcf4948a9290609b Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Mon, 17 Nov 2025 14:23:12 +0800 Subject: [PATCH 04/16] Add DNS and Python environment diagnostics to SSL tests workflow and fix RST license link syntax --- .github/workflows/tests-ssl.yml | 22 ++++++++++++++++++++++ README.rst | 2 +- gaussdb/README.rst | 2 +- gaussdb_pool/README.rst | 2 +- tools/isort-gaussdb/README.rst | 2 +- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests-ssl.yml b/.github/workflows/tests-ssl.yml index 52a133285..152df0875 100644 --- a/.github/workflows/tests-ssl.yml +++ b/.github/workflows/tests-ssl.yml @@ -226,6 +226,28 @@ jobs: run: | mkdir -p reports + - name: Print DNS and Python environment + run: | + python - << 'EOF' +import asyncio +import dns +import dns.version +import dns.asyncresolver + +print("Python version:") +import sys; print(sys.version) + +print("\nEvent loop policy:") +print(asyncio.get_event_loop_policy()) + +print("\nDnspython version:") +print(dns.version.version) + +print("\nAsync resolver instance:") +r = dns.asyncresolver.Resolver() +print(r) +EOF + - name: Run tests env: PYTHONPATH: ./gaussdb:./gaussdb_pool diff --git a/README.rst b/README.rst index 50d10b0b5..a75582ff3 100644 --- a/README.rst +++ b/README.rst @@ -34,7 +34,7 @@ This project is a **fork** of `psycopg`, originally developed by the Psycopg Tea **gaussdb** inherits the same license. All modifications are distributed under the **LGPL v3**. -See the full license text in the :download:`LICENSE.txt` file. +See the full license text in the `LICENSE.txt` file. .. note:: diff --git a/gaussdb/README.rst b/gaussdb/README.rst index 18a07fcb1..39bba3900 100644 --- a/gaussdb/README.rst +++ b/gaussdb/README.rst @@ -45,7 +45,7 @@ This project is a **fork** of `psycopg `_, originally **gaussdb** inherits the same license. All modifications are distributed under the **LGPL v3**. -See the full license text in the :download:`LICENSE.txt` file. +See the full license text in the `LICENSE.txt` file. .. note:: diff --git a/gaussdb_pool/README.rst b/gaussdb_pool/README.rst index 2a364cf8a..01fda966c 100644 --- a/gaussdb_pool/README.rst +++ b/gaussdb_pool/README.rst @@ -27,7 +27,7 @@ This project is a **fork** of `psycopg `_, originally **gaussdb_pool** inherits the same license. All modifications are distributed under the **LGPL v3**. -See the full license text in the :download:`LICENSE.txt` file. +See the full license text in the `LICENSE.txt` file. .. note:: diff --git a/tools/isort-gaussdb/README.rst b/tools/isort-gaussdb/README.rst index 07392eff9..07476c488 100644 --- a/tools/isort-gaussdb/README.rst +++ b/tools/isort-gaussdb/README.rst @@ -41,7 +41,7 @@ This project is a **fork** of `psycopg `_, originally **isort-gaussdb** inherits the same license. All modifications are distributed under the **LGPL v3**. -See the full license text in the :download:`LICENSE.txt` file. +See the full license text in the `LICENSE.txt` file. .. note:: From 8eafd416711990d497ae45de331eacd49ab412b1 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Mon, 17 Nov 2025 14:25:49 +0800 Subject: [PATCH 05/16] Add DNS and Python environment diagnostics to SSL tests workflow and fix RST license link syntax --- .github/workflows/tests-ssl.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/tests-ssl.yml b/.github/workflows/tests-ssl.yml index 152df0875..366890d84 100644 --- a/.github/workflows/tests-ssl.yml +++ b/.github/workflows/tests-ssl.yml @@ -229,24 +229,24 @@ jobs: - name: Print DNS and Python environment run: | python - << 'EOF' -import asyncio -import dns -import dns.version -import dns.asyncresolver + import asyncio + import dns + import dns.version + import dns.asyncresolver -print("Python version:") -import sys; print(sys.version) + print("Python version:") + import sys; print(sys.version) -print("\nEvent loop policy:") -print(asyncio.get_event_loop_policy()) + print("\nEvent loop policy:") + print(asyncio.get_event_loop_policy()) -print("\nDnspython version:") -print(dns.version.version) + print("\nDnspython version:") + print(dns.version.version) -print("\nAsync resolver instance:") -r = dns.asyncresolver.Resolver() -print(r) -EOF + print("\nAsync resolver instance:") + r = dns.asyncresolver.Resolver() + print(r) + EOF - name: Run tests env: From 429e63a86add31501b9bb1905bf5ec10c3c587d9 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Mon, 17 Nov 2025 14:31:48 +0800 Subject: [PATCH 06/16] Add DNS and Python environment diagnostics to SSL tests workflow and fix RST license link syntax --- .github/workflows/tests-ssl.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests-ssl.yml b/.github/workflows/tests-ssl.yml index 366890d84..ea3c5ee4b 100644 --- a/.github/workflows/tests-ssl.yml +++ b/.github/workflows/tests-ssl.yml @@ -228,6 +228,7 @@ jobs: - name: Print DNS and Python environment run: | + source venv/bin/activate python - << 'EOF' import asyncio import dns From 83e669f67273f5c0b7231e4a09c473862d9b8e30 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Mon, 17 Nov 2025 14:51:49 +0800 Subject: [PATCH 07/16] Suppress ResourceWarning in main tests workflow to reduce noise during pytest runs --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cf01d0aa8..45a07c108 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -96,7 +96,7 @@ jobs: GAUSSDB_TEST_DSN: "host=127.0.0.1 port=5432 dbname=test user=root password=Passwd@123 " run: | source venv/bin/activate - pytest -s -v + pytest -s -v -W ignore::ResourceWarning - name: Cleanup if: always() From 4d4aed71ee3973c56bcc71fdb9a0f0207adce0de Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Mon, 17 Nov 2025 15:02:01 +0800 Subject: [PATCH 08/16] Suppress ResourceWarning in main tests workflow to reduce noise during pytest runs --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 45a07c108..296eec2b8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -96,7 +96,7 @@ jobs: GAUSSDB_TEST_DSN: "host=127.0.0.1 port=5432 dbname=test user=root password=Passwd@123 " run: | source venv/bin/activate - pytest -s -v -W ignore::ResourceWarning + pytest -s -v -W ignore::pytest.PytestUnraisableExceptionWarning - name: Cleanup if: always() From 0314ccf5994b09727603af8b739b4bd13c1fb178 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Wed, 19 Nov 2025 17:05:38 +0800 Subject: [PATCH 09/16] Fix Faker byte-like object matching to allow None/empty values and exact match otherwise --- tests/fix_faker.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/fix_faker.py b/tests/fix_faker.py index 33097e86e..daad09c39 100644 --- a/tests/fix_faker.py +++ b/tests/fix_faker.py @@ -315,6 +315,11 @@ def example(self, spec): def match_any(self, spec, got, want): if spec == dt.timedelta: assert abs((got - want).total_seconds()) < 86400 * 2 + elif spec in (bytes, bytearray, memoryview): + if want in (b'', bytearray(b'')) or want is None: + assert got in (None, b'', bytearray(b''), memoryview(b'')) + else: + assert got == want else: assert got == want From 7ae3be19baecf6f7ee4120c3a3734e7a3b1a4820 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Thu, 20 Nov 2025 16:02:29 +0800 Subject: [PATCH 10/16] Update README.rst PYTHONPATH to include gaussdb and gaussdb_pool submodules and fix byte literal formatting in tests/fix_faker.py --- README.rst | 6 +++--- tests/fix_faker.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index a75582ff3..a4c5c8804 100644 --- a/README.rst +++ b/README.rst @@ -134,7 +134,7 @@ Now hack away! You can run the tests using on GaussDB:: # Set the Python import path to include your local GaussDB Python project # Replace your_path with actual values - export PYTHONPATH=/your_path/gaussdb-python + export PYTHONPATH="/your_path/gaussdb-python/gaussdb:/your_path/gaussdb-python/gaussdb_pool" # Select the pure-Python implementation of the GaussDB adapter export PSYCOPG_IMPL=python @@ -183,7 +183,7 @@ Recommended Steps to Run OpenGauss with Python GaussDB Driver Testing (Assuming # Set the Python import path to include your local GaussDB Python project # Replace your_path with actual values - export PYTHONPATH=/your_path/gaussdb-python + export PYTHONPATH="/your_path/gaussdb-python/gaussdb:/your_path/gaussdb-python/gaussdb_pool" # Select the pure-Python implementation of the GaussDB adapter export PSYCOPG_IMPL=python @@ -207,7 +207,7 @@ Steps to Run OpenGauss(SSL) with Python GaussDB Driver Testing (Assuming Docker # Set the Python import path to include your local GaussDB Python project # Replace your_path with actual values - export PYTHONPATH=/your_path/gaussdb-python + export PYTHONPATH="/your_path/gaussdb-python/gaussdb:/your_path/gaussdb-python/gaussdb_pool" # Select the pure-Python implementation of the GaussDB adapter export PSYCOPG_IMPL=python diff --git a/tests/fix_faker.py b/tests/fix_faker.py index daad09c39..8e892356d 100644 --- a/tests/fix_faker.py +++ b/tests/fix_faker.py @@ -316,8 +316,8 @@ def match_any(self, spec, got, want): if spec == dt.timedelta: assert abs((got - want).total_seconds()) < 86400 * 2 elif spec in (bytes, bytearray, memoryview): - if want in (b'', bytearray(b'')) or want is None: - assert got in (None, b'', bytearray(b''), memoryview(b'')) + if want in (b"", bytearray(b"")) or want is None: + assert got in (None, b"", bytearray(b""), memoryview(b"")) else: assert got == want else: From a5561b9c9640537819e48f54979a1dcc0a1e519c Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 21 Nov 2025 09:53:38 +0800 Subject: [PATCH 11/16] Fix test schema cleanup failure by setting owner to root for all testrange functions before dropping schema (resolves #26) --- tests/types/test_range.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/types/test_range.py b/tests/types/test_range.py index fad789bc9..a5e5030d3 100644 --- a/tests/types/test_range.py +++ b/tests/types/test_range.py @@ -270,6 +270,12 @@ def create_test_range(conn): conn.execute( """ + ALTER FUNCTION testschema.testrange(double precision, double precision) OWNER TO root; + ALTER FUNCTION testschema.testrange(double precision, double precision, text) OWNER TO root; + + ALTER FUNCTION public.testrange(text, text, text) OWNER TO root; + ALTER FUNCTION public.testrange(text, text) OWNER TO root; + drop schema if exists testschema cascade; create schema testschema; From 8fb9d8b148415650fe87453d0e434366cfe30476 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 21 Nov 2025 09:58:32 +0800 Subject: [PATCH 12/16] Format ALTER FUNCTION owner changes with explicit parameter lists for better readability in test_range setup (follow-up to #26) --- tests/types/test_range.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tests/types/test_range.py b/tests/types/test_range.py index a5e5030d3..471fe61c0 100644 --- a/tests/types/test_range.py +++ b/tests/types/test_range.py @@ -270,12 +270,22 @@ def create_test_range(conn): conn.execute( """ - ALTER FUNCTION testschema.testrange(double precision, double precision) OWNER TO root; - ALTER FUNCTION testschema.testrange(double precision, double precision, text) OWNER TO root; + ALTER FUNCTION testschema.testrange( + double precision, + double precision + ) + OWNER TO root; + + ALTER FUNCTION testschema.testrange( + double precision, + double precision, + text + ) + OWNER TO root; ALTER FUNCTION public.testrange(text, text, text) OWNER TO root; ALTER FUNCTION public.testrange(text, text) OWNER TO root; - + drop schema if exists testschema cascade; create schema testschema; From d1412973d893b4a8b178d84f8cc1e85136eb048e Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 21 Nov 2025 17:56:32 +0800 Subject: [PATCH 13/16] Add wal_level check to skip logical decoding tests when not set to logical; skip composite and range type tests on GaussDB --- tests/conftest.py | 30 ++++++++++++++++++++++++++++++ tests/test_logical_decoding.py | 11 ++++++++++- tests/types/test_composite.py | 4 ++++ tests/types/test_range.py | 23 +++++------------------ 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index ba51b2728..1e0ba58b6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -145,6 +145,36 @@ def get_database_type(): print(f"Failed to get database version: {e}") return "" +def get_wal_level(): + dsn = os.getenv("DSN") or os.getenv("GAUSSDB_TEST_DSN") + if not dsn: + print("DSN environment variable not set") + return "" + + try: + conn = pq.PGconn.connect(dsn.encode("utf-8")) + if conn.status != pq.ConnStatus.OK: + print(f"Connection failed: {conn.error_message.decode()}") + conn.finish() + return "" + + res = conn.exec_(b"SHOW wal_level;") + if res.status != pq.ExecStatus.TUPLES_OK: + print(f"Query failed: {conn.error_message.decode()}") + res.clear() + conn.finish() + return "" + + raw_wal_level = res.get_value(0, 0) + wal_level = raw_wal_level.decode("utf-8").lower() if raw_wal_level is not None else "" + + res.clear() + conn.finish() + return wal_level + except Exception as e: + print(f"Failed to get wal_level: {e}") + return "" + def pytest_collection_modifyitems(config, items): res = get_database_type() diff --git a/tests/test_logical_decoding.py b/tests/test_logical_decoding.py index 949f636ef..0b4a65380 100644 --- a/tests/test_logical_decoding.py +++ b/tests/test_logical_decoding.py @@ -1,10 +1,19 @@ import pytest +from .conftest import get_wal_level SLOT_NAME = "slot_test" SCHEMA = "my_schema" TABLE = "test01" +@pytest.fixture(scope="session", autouse=True) +def check_wal_level(): + """Check if wal_level is set to logical, skip tests if not.""" + wal_level = get_wal_level() + if wal_level != "logical": + pytest.skip(f"wal_level={wal_level!r}, expected 'logical'") + + def _slot_exists(conn, slot_name): cur = conn.cursor() cur.execute( @@ -37,7 +46,7 @@ def _cleanup_slot_and_schema(conn): @pytest.fixture(scope="function") -def setup_env(conn): +def setup_env(conn, check_wal_level): """Ensure clean environment for each test.""" _cleanup_slot_and_schema(conn) cur = conn.cursor() diff --git a/tests/types/test_composite.py b/tests/types/test_composite.py index fada429f3..faa0da063 100644 --- a/tests/types/test_composite.py +++ b/tests/types/test_composite.py @@ -10,6 +10,7 @@ from ..utils import eur from ..fix_crdb import crdb_skip_message, is_crdb from ..test_adapt import StrNoneBinaryDumper, StrNoneDumper +from ..conftest import get_database_type pytestmark = pytest.mark.crdb_skip("composite") @@ -162,6 +163,9 @@ def test_load_record_binary(conn, want, rec): def testcomp(svcconn): if is_crdb(svcconn): pytest.skip(crdb_skip_message("composite")) + res = get_database_type() + if res == "gaussdb": + pytest.skip("gaussdb not support.") cur = svcconn.cursor() cur.execute( """ diff --git a/tests/types/test_range.py b/tests/types/test_range.py index 471fe61c0..aa0ae057e 100644 --- a/tests/types/test_range.py +++ b/tests/types/test_range.py @@ -12,6 +12,7 @@ from ..utils import eur from ..fix_crdb import crdb_skip_message, is_crdb from ..test_adapt import StrNoneBinaryDumper, StrNoneDumper +from ..conftest import get_database_type pytestmark = pytest.mark.crdb_skip("range") @@ -268,27 +269,14 @@ def create_test_range(conn): if is_crdb(conn): pytest.skip(crdb_skip_message("range")) + res = get_database_type() + if res == "gaussdb": + pytest.skip("gaussdb not support.") + conn.execute( """ - ALTER FUNCTION testschema.testrange( - double precision, - double precision - ) - OWNER TO root; - - ALTER FUNCTION testschema.testrange( - double precision, - double precision, - text - ) - OWNER TO root; - - ALTER FUNCTION public.testrange(text, text, text) OWNER TO root; - ALTER FUNCTION public.testrange(text, text) OWNER TO root; - drop schema if exists testschema cascade; create schema testschema; - drop type if exists testrange cascade; drop type if exists testschema.testrange cascade; @@ -297,7 +285,6 @@ def create_test_range(conn): """ ) - fetch_cases = [ ("testrange", "text"), ("testschema.testrange", "float8"), From 39b8e8cdff3ad50d84f424c378959bbe67bddcea Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 21 Nov 2025 17:59:40 +0800 Subject: [PATCH 14/16] Add wal_level check to skip logical decoding tests when not set to logical; skip composite and range type tests on GaussDB --- tests/conftest.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 1e0ba58b6..6bf49f07b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -145,6 +145,7 @@ def get_database_type(): print(f"Failed to get database version: {e}") return "" + def get_wal_level(): dsn = os.getenv("DSN") or os.getenv("GAUSSDB_TEST_DSN") if not dsn: @@ -166,7 +167,9 @@ def get_wal_level(): return "" raw_wal_level = res.get_value(0, 0) - wal_level = raw_wal_level.decode("utf-8").lower() if raw_wal_level is not None else "" + wal_level = "" + if raw_wal_level: + wal_level = raw_wal_level.decode().lower() res.clear() conn.finish() From 88ef17ecb557b30883b3db05e58e92362d9a0701 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 21 Nov 2025 18:02:44 +0800 Subject: [PATCH 15/16] Fix import order for get_database_type and add missing blank line in logical decoding tests --- tests/test_logical_decoding.py | 1 + tests/types/test_composite.py | 2 +- tests/types/test_range.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_logical_decoding.py b/tests/test_logical_decoding.py index 0b4a65380..69010cbbe 100644 --- a/tests/test_logical_decoding.py +++ b/tests/test_logical_decoding.py @@ -1,4 +1,5 @@ import pytest + from .conftest import get_wal_level SLOT_NAME = "slot_test" diff --git a/tests/types/test_composite.py b/tests/types/test_composite.py index faa0da063..de9820c97 100644 --- a/tests/types/test_composite.py +++ b/tests/types/test_composite.py @@ -8,9 +8,9 @@ from gaussdb.types.composite import register_composite from ..utils import eur +from ..conftest import get_database_type from ..fix_crdb import crdb_skip_message, is_crdb from ..test_adapt import StrNoneBinaryDumper, StrNoneDumper -from ..conftest import get_database_type pytestmark = pytest.mark.crdb_skip("composite") diff --git a/tests/types/test_range.py b/tests/types/test_range.py index aa0ae057e..6375b1095 100644 --- a/tests/types/test_range.py +++ b/tests/types/test_range.py @@ -10,9 +10,9 @@ from gaussdb.types.range import Range, RangeInfo, register_range from ..utils import eur +from ..conftest import get_database_type from ..fix_crdb import crdb_skip_message, is_crdb from ..test_adapt import StrNoneBinaryDumper, StrNoneDumper -from ..conftest import get_database_type pytestmark = pytest.mark.crdb_skip("range") From 6fca2817dcfe41083d3729cc3b2288026ca1e5d8 Mon Sep 17 00:00:00 2001 From: chenyunliang520 Date: Fri, 21 Nov 2025 18:06:02 +0800 Subject: [PATCH 16/16] Add missing blank line after execute block in create_test_range for better readability --- tests/types/test_range.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/types/test_range.py b/tests/types/test_range.py index 6375b1095..f81e73bf9 100644 --- a/tests/types/test_range.py +++ b/tests/types/test_range.py @@ -285,6 +285,7 @@ def create_test_range(conn): """ ) + fetch_cases = [ ("testrange", "text"), ("testschema.testrange", "float8"),