Skip to content

Parameter Substitution not happening for SQL statement #26

@rad-pat

Description

@rad-pat

Given a simple select that has a limit/offset clause, parameter substitution does not occur for the SQL during execution so it fails to execute.

import sqlalchemy as sa

metadata = sa.MetaData()

tbl = sa.Table(
    "test-table",
    metadata,
    sa.Column("Col1", sa.DECIMAL(38, 10)),
    sa.Column("Col2", sa.VARCHAR()),
    sa.Column("Col3", sa.VARCHAR()),
    schema="test-schema",
)
select_query = sa.select(tbl).limit(1000).offset(0)

engine = sa.create_engine("databend://root:@plaid-databend-query:8000?sslmode=disable")

# print(select_query.compile(engine, compile_kwargs={"literal_binds": True, "render_postcompile": True}))
with engine.connect() as conn:
    conn.execute(select_query).fetchall()

Actual SQL generated by SQLAlchemy normal compilation (although incorrect values for limit/offset)

SELECT "Col1", "Col2", "Col3" 
FROM "test-schema"."test-table"
 LIMIT 0,0
Traceback (most recent call last):
  File "/home/plaid/src/plaid/plaid/temp/patbuxton/databend_sql.py", line 22, in <module>
    conn.execute(select_query).fetchall()
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1385, in execute
    return meth(self, multiparams, params, _EMPTY_EXECUTION_OPTS)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection
    return connection._execute_clauseelement(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1577, in _execute_clauseelement
    ret = self._execute_context(
          ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1953, in _execute_context
    self._handle_dbapi_exception(
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2138, in _handle_dbapi_exception
    util.raise_(exc_info[1], with_traceback=exc_info[2])
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
    raise exception
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1910, in _execute_context
    self.dialect.do_execute(
  File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.11/site-packages/databend_sqlalchemy/connector.py", line 182, in execute
    rows = self._db.query_iter(operation)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Exception: APIError: ResponseError with 1005: error: 
  --> SQL:3:10
  |
1 | SELECT "Col1", "Col2", "Col3" 
  | ------ while parsing `SELECT ...`
2 | FROM "test-schema"."test-table"
3 |  LIMIT 0,%(param_2)s
  |          ^
  |          |
  |          missing lhs or rhs for the binary operator
  |          while parsing expression

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions