• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SAP / sqlalchemy-hana
96%
main: 95%

Build:
Build:
LAST BUILD BRANCH: renovate/lock-file-maintenance
DEFAULT BRANCH: main
Repo Added 07 May 2025 10:50AM UTC
Files 23
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

LAST BUILD ON BRANCH step-461
branch: step-461
CHANGE BRANCH
x
Reset
  • step-461
  • NumberOfTransactionsExceededError
  • NumberOfTransactionsExceededError2
  • TransactionManager
  • async-workflow
  • asyncio
  • bump-310
  • bump-4.1.0
  • bump-4.3.0
  • bump-460
  • changelog-303
  • dependabot/pip/black-25.9.0
  • dependabot/pip/coverage-toml--7.10.1
  • dependabot/pip/coverage-toml--7.10.2
  • dependabot/pip/coverage-toml--7.10.4
  • dependabot/pip/coverage-toml--7.10.5
  • dependabot/pip/coverage-toml--7.10.6
  • dependabot/pip/coverage-toml--7.10.7
  • dependabot/pip/coverage-toml--7.11.0
  • dependabot/pip/coverage-toml--7.8.2
  • dependabot/pip/coverage-toml--7.9.1
  • dependabot/pip/coverage-toml--7.9.2
  • dependabot/pip/diff-cover-toml--9.3.1
  • dependabot/pip/diff-cover-toml--9.3.2
  • dependabot/pip/diff-cover-toml--9.4.0
  • dependabot/pip/diff-cover-toml--9.4.1
  • dependabot/pip/diff-cover-toml--9.5.0
  • dependabot/pip/diff-cover-toml--9.6.0
  • dependabot/pip/diff-cover-toml--9.7.1
  • dependabot/pip/flake8-7.3.0
  • dependabot/pip/flake8-tergeo-25.10.9.0
  • dependabot/pip/flake8-tergeo-25.5.14.0
  • dependabot/pip/flake8-tergeo-25.5.22.0
  • dependabot/pip/flake8-tergeo-25.6.11.0
  • dependabot/pip/flake8-tergeo-25.6.26.0
  • dependabot/pip/flake8-tergeo-25.7.9.0
  • dependabot/pip/flake8-tergeo-25.8.13.0
  • dependabot/pip/isort-6.1.0
  • dependabot/pip/isort-7.0.0
  • dependabot/pip/mypy-1.16.1
  • dependabot/pip/mypy-1.17.0
  • dependabot/pip/mypy-1.17.1
  • dependabot/pip/mypy-1.18.1
  • dependabot/pip/mypy-1.18.2
  • dependabot/pip/pre-commit-4.3.0
  • dependabot/pip/pylint-3.3.8
  • dependabot/pip/pylint-3.3.9
  • dependabot/pip/pylint-4.0.2
  • dependabot/pip/pytest-8.4.1
  • dependabot/pip/pytest-8.4.2
  • dependabot/pip/pytest-cov-6.2.1
  • dependabot/pip/pytest-cov-6.3.0
  • dependabot/pip/pytest-cov-7.0.0
  • dependabot/pip/pytest-randomly-4.0.1
  • dependabot/pip/pyupgrade-3.21.0
  • dependabot/pip/types-hdbcli-2.25.0.20250715
  • dependabot/pip/types-hdbcli-2.25.0.20250809
  • dependabot/pip/types-hdbcli-2.25.0.20250915
  • dependabot/pip/typing-extensions-4.14.0
  • dependabot/pip/typing-extensions-4.14.1
  • dependabot/pip/typing-extensions-4.15.0
  • dependabot/uv/alembic-1.17.1
  • dependabot/uv/alembic-1.17.2
  • dependabot/uv/black-25.11.0
  • dependabot/uv/black-25.12.0
  • dependabot/uv/coverage-toml--7.11.3
  • dependabot/uv/coverage-toml--7.12.0
  • dependabot/uv/coverage-toml--7.13.0
  • dependabot/uv/diff-cover-toml--10.0.0
  • dependabot/uv/diff-cover-toml--9.7.2
  • dependabot/uv/hdbcli-2.26.25
  • dependabot/uv/hdbcli-2.26.26
  • dependabot/uv/mako-1.3.11
  • dependabot/uv/mypy-1.19.0
  • dependabot/uv/mypy-1.19.1
  • dependabot/uv/pre-commit-4.4.0
  • dependabot/uv/pre-commit-4.5.0
  • dependabot/uv/pylint-4.0.3
  • dependabot/uv/pylint-4.0.4
  • dependabot/uv/pylint-per-file-ignores-3.2.0
  • dependabot/uv/pytest-9.0.0
  • dependabot/uv/pytest-9.0.1
  • dependabot/uv/pytest-9.0.2
  • dependabot/uv/pyupgrade-3.21.1
  • dependabot/uv/pyupgrade-3.21.2
  • dependabot/uv/uv-0.9.10
  • dependabot/uv/uv-0.9.11
  • dependabot/uv/uv-0.9.16
  • dependabot/uv/uv-0.9.17
  • dependabot/uv/uv-0.9.7
  • dependabot/uv/uv-0.9.8
  • dependency-groups
  • error-149
  • feat/uv
  • feature/add-mypy-strict-concatenate
  • fix-alembic-group
  • fix-ci
  • fix-of
  • fix-work
  • fix/native-boolean-false-int-compare
  • flak
  • handle-10735
  • issue-387
  • issue-612
  • kasium-patch-1
  • linter
  • marker-sparse-driver-backend
  • mypy
  • pin-build-tools
  • py314
  • pytest-strict
  • pyupgrade
  • randomly
  • re-440
  • reno
  • renovate/actions-checkout-6.x
  • renovate/actions-checkout-7.x
  • renovate/actions-setup-python-6.x
  • renovate/astral-sh-setup-uv-7.x
  • renovate/astral-sh-setup-uv-8.x
  • renovate/black-26.x
  • renovate/configure
  • renovate/coverage-7.x
  • renovate/diff-cover-10.x
  • renovate/flake8-tergeo-25.x
  • renovate/flake8-tergeo-26.x
  • renovate/isort-8.x
  • renovate/lock-file-maintenance
  • renovate/major-github-artifact-actions
  • renovate/mypy-1.x
  • renovate/mypy-2.x
  • renovate/pre-commit-4.x
  • renovate/pre-commit-pre-commit-hooks-6.x
  • renovate/pylint-4.x
  • renovate/pylint-per-file-ignores-3.x
  • renovate/pytest-9.x
  • renovate/pytest-cov-7.x
  • renovate/pytest-randomly-4.x
  • renovate/setuptools-83.x
  • renovate/softprops-action-gh-release-3.x
  • renovate/toml-sort-0.x
  • renovate/types-hdbcli-2.x
  • renovate/typing-extensions-4.x
  • renovate/uv-0.x
  • resize
  • rm-optional-dependencies
  • rm-todo
  • session-context-err
  • trigger-cover
  • update-isort-pylint
  • uv-test
  • welcome-2026
  • with-statement-hint

15 Jul 2026 07:46AM UTC coverage: 95.816% (+8.3%) from 87.487%
29399238210

push

github

web-flow
Fix sql.false()/sql.true() rendering under use_native_boolean=False (#656)

## Summary

`HANAStatementCompiler.visit_is_true_unary_operator` and
`visit_is_false_unary_operator` unconditionally emit `... = TRUE` /
`... = FALSE`. When the dialect is configured with
`use_native_boolean=False`, SQLAlchemy's base `visit_true`/`visit_false`
render the wrapped element as an INT literal (`1`/`0`), so the compiled
WHERE becomes e.g. `WHERE 0 = TRUE` — which HANA rejects with error
**266 "BOOLEAN type is not comparable with INT"**.

This PR makes both overrides branch on
`self.dialect.supports_native_boolean` and fall back to an INT compare
in non-native mode. Native-mode behaviour is unchanged: the existing
`= TRUE` / `= FALSE` path is preserved, which is why these overrides
exist in the first place (HANA rejects a bare `WHERE TRUE` /
`WHERE FALSE`, per the comment above the methods).

## Reproducer

```python
from sqlalchemy import literal_column, select, sql
from sqlalchemy_hana.dialect import HANAHDBCLIDialect

dialect = HANAHDBCLIDialect(use_native_boolean=False)
stmt = select(literal_column("id")).where(sql.false())
print(stmt.compile(dialect=dialect))
# Before this PR:  SELECT id FROM DUMMY WHERE 0 = TRUE   <-- HANA error 266
# After this PR:   SELECT id FROM DUMMY WHERE 0 = 1
```

## Before / After

`select(literal_column("id")).where(sql.false())` with
`use_native_boolean=False`:

| | Before | After |
| -------------- | -------------------- |
---------------------------------- |
| Compiled SQL | `WHERE 0 = TRUE` | `WHERE 0 = 1` |
| HANA response | error 266 | executes; predicate is always false |

Same statement with `use_native_boolean=True` (unchanged):

|                | Before                 | After                  |
| -------------- | ---------------------- | ---------------------- |
| Compiled SQL   | `WHERE false = TRUE`   | `WHERE false = TRUE`   |

## Test evidence

Added `test_sql_unary_boolean_non_native` in `test/test_sql_compile.py`
tha... (continued)

10 of 11 new or added lines in 2 files covered. (90.91%)

13 existing lines in 1 file now uncovered.

1855 of 1936 relevant lines covered (95.82%)

0.96 hits per line

Relevant lines Covered
Build:
Build:
1936 RELEVANT LINES 1855 COVERED LINES
0.96 HITS PER LINE
Source Files on step-461
  • Tree
  • List 23
  • Changed 2
  • Source Changed 2
  • Coverage Changed 2
Coverage ∆ File Lines Relevant Covered Missed Hits/Line

Recent builds

Builds Branch Commit Type Ran Committer Via Coverage
29399238210 step-461 Fix sql.false()/sql.true() rendering under use_native_boolean=False (#656) ## Summary `HANAStatementCompiler.visit_is_true_unary_operator` and `visit_is_false_unary_operator` unconditionally emit `... = TRUE` / `... = FALSE`. When the dialect is... push 15 Jul 2026 08:44AM UTC web-flow github
95.82
29398684632 step-461 Fix sql.false()/sql.true() rendering under use_native_boolean=False (#656) ## Summary `HANAStatementCompiler.visit_is_true_unary_operator` and `visit_is_false_unary_operator` unconditionally emit `... = TRUE` / `... = FALSE`. When the dialect is... push 15 Jul 2026 08:36AM UTC web-flow github
95.82
See All Builds (324)
  • Repo on GitHub
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc