googleapis / python-bigquery-sqlalchemy

SQLAlchemy dialect for BigQuery
MIT License
436 stars 130 forks source link

Grouping by struct member broken in 1.11 #1117

Open bnaul opened 1 month ago

bnaul commented 1 month ago

The following worked in 1.10 but raises an exception in 1.11:

from sqlalchemy import create_engine, Table, Integer, MetaData, Column, select, func
from sqlalchemy_bigquery import STRUCT

engine = create_engine(f"bigquery:///tmp", echo=True)
metadata = MetaData()
table = Table(
    "table",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("nested", STRUCT(x=Integer))
)

query = (
    select(
        table.c.nested.x.label("x"),
    )
    .group_by(
        "x"
    )
)
print(query.compile(engine))

->

UnsupportedCompilationError: Compiler <sqlalchemy.sql.compiler.StrSQLCompiler object at 0x102f35f00> can't render element of type <function struct_getitem_op at 0x30532a9e0> (Background on this error at: https://sqlalche.me/e/14/l7de)

I traced the issue back to this line: https://github.com/googleapis/python-bigquery-sqlalchemy/pull/1053/files#diff-efe1987a73ae5b54aa817dc8c70541025df89d9d08601c8ab33fa84ad8c09de7R344

Removing this check or catching the exception resolves the issue. Perhaps a safer way to do this check would be to see if it's a function and then check its name? Not totally sure but I'm sure you will know @tswast 🙂

tswast commented 1 month ago

My memory is a bit fuzzy on why we added that line. Presumably there was some test that was failing without it. @chalmerlowe Do you remember?

chalmerlowe commented 1 month ago

I will take a look tomorrow.