Skip to content

Commit e41196b

Browse files
committed
fix(sqlalchemy-bigquery): resolve ST function type binding bug and unskip geography tests
1 parent edc0423 commit e41196b

2 files changed

Lines changed: 32 additions & 6 deletions

File tree

packages/sqlalchemy-bigquery/sqlalchemy_bigquery/geography.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,8 @@ def _fixup_st_arguments(element, compiler, **kw):
183183
argument_types = _argument_types.get(element.name.lower())
184184
if argument_types:
185185
for argument_type, argument in zip(argument_types, element.clauses.clauses):
186-
if isinstance(argument, BindParameter) and (
187-
argument.type is not argument_type
188-
or not isinstance(argument.type, argument_type)
186+
if isinstance(argument, BindParameter) and not isinstance(
187+
argument.type, argument_type
189188
):
190189
argument.type = argument_type()
191190

packages/sqlalchemy-bigquery/tests/unit/test_geography.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
geoalchemy2 = pytest.importorskip("geoalchemy2")
2525

2626

27-
# TODO(http://github.com/googleapis/google-cloud-python/issues/17287): Unskip once bug is resolved.
28-
@pytest.mark.skip(reason="Failing in CI with AssertionError.")
2927
def test_geoalchemy2_core(faux_conn, last_query):
3028
"""Make sure GeoAlchemy 2 Core Tutorial works as adapted to only having geometry"""
3129
conn = faux_conn
@@ -101,7 +99,7 @@ def test_geoalchemy2_core(faux_conn, last_query):
10199
last_query(
102100
"SELECT `lake`.`name` \n"
103101
"FROM `lake` \n"
104-
"WHERE ST_Contains(`lake`.`geog`, %(ST_Contains_1:geography)s)",
102+
"WHERE ST_Contains(`lake`.`geog`, %(ST_Contains_1:STRING)s)",
105103
{"ST_Contains_1": "POINT(4 1)"},
106104
)
107105

@@ -183,3 +181,32 @@ def test_calling_st_functions_that_dont_take_geographies(faux_conn, last_query):
183181
" AS `ST_GeogFromText_1`",
184182
dict(ST_GeogFromText_2="point(0 0)"),
185183
)
184+
185+
186+
def test_fixup_st_arguments():
187+
from sqlalchemy_bigquery.geography import _fixup_st_arguments, GEOGRAPHY
188+
from geoalchemy2.functions import ST_Area, GenericFunction
189+
from sqlalchemy.sql.elements import BindParameter
190+
191+
class DummyCompiler:
192+
def visit_function(self, element, **kw):
193+
return "func(param)"
194+
195+
# Case 1: argument.type is not yet GEOGRAPHY
196+
func_element = ST_Area(BindParameter("param", "point(0 0)"))
197+
res = _fixup_st_arguments(func_element, DummyCompiler())
198+
assert res == "func(param)"
199+
assert isinstance(func_element.clauses.clauses[0].type, GEOGRAPHY)
200+
201+
# Case 2: argument.type is ALREADY GEOGRAPHY
202+
func_element2 = ST_Area(BindParameter("param", "point(0 0)", type_=GEOGRAPHY()))
203+
_fixup_st_arguments(func_element2, DummyCompiler())
204+
205+
# Case 3: function without specified argument types
206+
class ST_Unknown(GenericFunction):
207+
name = "ST_Unknown"
208+
209+
func_element3 = ST_Unknown(BindParameter("param", "point(0 0)"))
210+
_fixup_st_arguments(func_element3, DummyCompiler())
211+
212+

0 commit comments

Comments
 (0)