Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@ jobs:
matrix:
crdb-version: [
"cockroach:latest-v24.1",
"cockroach:latest-v24.2",
"cockroach:latest-v24.3",
"cockroach:latest-v25.1",
"cockroach:latest-v25.2",
"cockroach:latest-v25.3"
]
Expand Down
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Version 2.0.4
Unreleased

- Fix reflection of CHAR columns (#275)


# Version 2.0.3
June 10, 2025
Expand Down
6 changes: 3 additions & 3 deletions dev-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ cffi==1.17.1
# via cryptography
charset-normalizer==3.4.3
# via requests
cryptography==45.0.6
cryptography==45.0.7
# via secretstorage
distlib==0.4.0
# via virtualenv
Expand Down Expand Up @@ -50,7 +50,7 @@ packaging==25.0
# via
# tox
# twine
platformdirs==4.3.8
platformdirs==4.4.0
# via virtualenv
pluggy==1.6.0
# via tox
Expand Down Expand Up @@ -85,7 +85,7 @@ tox==3.23.1
# via -r dev-requirements.in
twine==6.1.0
# via -r dev-requirements.in
typing-extensions==4.14.1
typing-extensions==4.15.0
# via virtualenv
urllib3==2.5.0
# via
Expand Down
6 changes: 3 additions & 3 deletions sqlalchemy_cockroachdb/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@
"timestamp with time zone": sqltypes.TIMESTAMP,
"timestamp without time zone": sqltypes.TIMESTAMP,
"interval": sqltypes.Interval,
"char": sqltypes.VARCHAR,
"char": sqltypes.CHAR,
"char varying": sqltypes.VARCHAR,
"character": sqltypes.VARCHAR,
"character": sqltypes.CHAR,
"character varying": sqltypes.VARCHAR,
"string": sqltypes.VARCHAR,
"text": sqltypes.VARCHAR,
Expand Down Expand Up @@ -244,7 +244,7 @@ def get_columns(self, conn, table_name, schema=None, **kw):
precision=row.numeric_precision,
scale=row.numeric_scale,
)
elif type_class is sqltypes.VARCHAR:
elif type_class is sqltypes.VARCHAR or type_class is sqltypes.CHAR:
typ = type_class(length=row.character_maximum_length)
else:
typ = type_class
Expand Down
4 changes: 2 additions & 2 deletions test-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
alembic==1.16.4
alembic==1.16.5
# via -r test-requirements.in
async-timeout==5.0.1
# via asyncpg
Expand Down Expand Up @@ -40,7 +40,7 @@ tomli==2.2.1
# via
# alembic
# pytest
typing-extensions==4.14.1
typing-extensions==4.15.0
# via
# alembic
# exceptiongroup
Expand Down
10 changes: 8 additions & 2 deletions test/test_introspection.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,17 @@ def test_timestamp(self):
def test_interval(self):
self._test("interval", sqltypes.Interval)

def test_varchar(self):
def test_char(self):
types = [
"char",
"char varying",
"character",
]
for t in types:
self._test(t, sqltypes.CHAR)

def test_varchar(self):
types = [
"char varying",
"character varying",
"string",
"text",
Expand Down
20 changes: 5 additions & 15 deletions test/test_suite_alembic.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,13 @@
from alembic.testing.suite import * # noqa
from sqlalchemy.testing import skip
from alembic.testing.suite import AutogenerateFKOptionsTest as _AutogenerateFKOptionsTest
# from sqlalchemy.testing import skip
from alembic.testing.suite import BackendAlterColumnTest as _BackendAlterColumnTest


class AutogenerateFKOptionsTest(_AutogenerateFKOptionsTest):
@skip("cockroachdb")
def test_nochange_ondelete(self):
pass


class BackendAlterColumnTest(_BackendAlterColumnTest):
@skip("cockroachdb")
def test_modify_nullable_to_non(self):
# previously needed "with self.op.get_context().autocommit_block():"
# which is no longer valid in SQLA 2.0
pass
if config.db.dialect._is_v253plus:
super().test_modify_nullable_to_non()

@skip("cockroachdb")
def test_modify_type_int_str(self):
# TODO: enable this test when warning removed for ALTER COLUMN int → string
pass
if config.db.dialect._is_v253plus:
super().test_modify_type_int_str()
17 changes: 0 additions & 17 deletions test/test_suite_sqlalchemy.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
from sqlalchemy.testing.suite import (
ComponentReflectionTest as _ComponentReflectionTest,
)
from sqlalchemy.testing.suite import (
ComponentReflectionTestExtra as _ComponentReflectionTestExtra,
)
from sqlalchemy.testing.suite import HasIndexTest as _HasIndexTest
from sqlalchemy.testing.suite import HasTableTest as _HasTableTest
from sqlalchemy.testing.suite import IntegerTest as _IntegerTest
Expand All @@ -21,7 +18,6 @@
)
from sqlalchemy.testing.suite import TrueDivTest as _TrueDivTest
from sqlalchemy.testing.suite import UnicodeSchemaTest as _UnicodeSchemaTest
import sqlalchemy.types as sql_types


class ComponentReflectionTest(_ComponentReflectionTest):
Expand Down Expand Up @@ -421,19 +417,6 @@ def test_not_existing_table(self):
pass


class ComponentReflectionTestExtra(_ComponentReflectionTestExtra):
@testing.combinations(
sql_types.String,
sql_types.VARCHAR,
# sql_types.CHAR, # we return VARCHAR(length=52)
(sql_types.NVARCHAR, testing.requires.nvarchar_types),
(sql_types.NCHAR, testing.requires.nvarchar_types),
argnames="type_",
)
def test_string_length_reflection(self, connection, metadata, type_):
super().test_string_length_reflection(connection, metadata, type_, [])


class HasIndexTest(_HasIndexTest):
@skip("cockroachdb")
def test_has_index(self):
Expand Down