Skip to content

feat(duckdb): Add transpilation support for BIT_LENGTH#7421

Merged
georgesittas merged 3 commits intomainfrom
RD-1147695-bit-length
Apr 1, 2026
Merged

feat(duckdb): Add transpilation support for BIT_LENGTH#7421
georgesittas merged 3 commits intomainfrom
RD-1147695-bit-length

Conversation

@fivetran-amrutabhimsenayachit
Copy link
Copy Markdown
Collaborator

@fivetran-amrutabhimsenayachit fivetran-amrutabhimsenayachit commented Mar 31, 2026

BIT_LENGTH(TO_BINARY('A1B2', 'HEX')) transpiles to BIT_LENGTH(UNHEX('A1B2'))UNHEX returns BLOB, but DuckDB's BIT_LENGTH does not accept BLOB.
Modified this to use the correct DuckDB equivalent - OCTET_LENGTH(UNHEX('A1B2')) * 8.

 python3 -c "
from sqlglot import parse_one
from sqlglot.optimizer.annotate_types import annotate_types

sql = \"SELECT BIT_LENGTH('abc') AS short_str, BIT_LENGTH('hello world') AS long_str, BIT_LENGTH('') AS empty_str, BIT_LENGTH(NULL) AS null_str, BIT_LENGTH(TO_BINARY('A1B2', 'HEX')) AS bin_input\"
print(annotate_types(parse_one(sql, dialect='snowflake'), dialect='snowflake').sql('duckdb'))
"
-->
SELECT BIT_LENGTH('abc') AS short_str, BIT_LENGTH('hello world') AS long_str, BIT_LENGTH('') AS empty_str, BIT_LENGTH(NULL) AS null_str, CASE TYPEOF(UNHEX('A1B2')) WHEN 'BLOB' THEN OCTET_LENGTH(CAST(UNHEX('A1B2') AS BLOB)) * 8 ELSE BIT_LENGTH(CAST(UNHEX('A1B2') AS TEXT)) END AS bin_input

│ short_str │ long_str │ empty_str │ null_str │ bin_input │
│   int64   │  int64   │   int64   │  int64   │   int64   │
├───────────┼──────────┼───────────┼──────────┼───────────┤
│        24 │       88 │         0 │     NULL │        16 │

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 31, 2026

SQLGlot Integration Test Results

Comparing:

  • this branch (sqlglot:RD-1147695-bit-length, sqlglot version: RD-1147695-bit-length)
  • baseline (main, sqlglot version: 0.0.1.dev1)

By Dialect

dialect main sqlglot:RD-1147695-bit-length transitions links
bigquery -> bigquery 23872/23877 passed (100.0%) 21252/21252 passed (100.0%) No change full result / delta
bigquery -> duckdb 2105/2624 passed (80.2%) 0/0 passed (0.0%) No change full result / delta
snowflake -> duckdb 1511/2674 passed (56.5%) 0/0 passed (0.0%) No change full result / delta
snowflake -> snowflake 65910/65910 passed (100.0%) 63015/63015 passed (100.0%) No change full result / delta
databricks -> databricks 1364/1364 passed (100.0%) 1364/1364 passed (100.0%) No change full result / delta
postgres -> postgres 6040/6040 passed (100.0%) 6040/6040 passed (100.0%) No change full result / delta
redshift -> redshift 7059/7059 passed (100.0%) 7059/7059 passed (100.0%) No change full result / delta

Overall

main: 109548 total, 107861 passed (pass rate: 98.5%), sqlglot version: 0.0.1.dev1

sqlglot:RD-1147695-bit-length: 102733 total, 102733 passed (pass rate: 100.0%), sqlglot version: RD-1147695-bit-length

Transitions:
No change

✅ 1 test(s) passed

@fivetran-amrutabhimsenayachit fivetran-amrutabhimsenayachit force-pushed the RD-1147695-bit-length branch 3 times, most recently from bb760a8 to 80988a3 Compare March 31, 2026 20:14
@georgesittas georgesittas force-pushed the RD-1147695-bit-length branch 3 times, most recently from 1153063 to f7bb417 Compare April 1, 2026 12:16
@georgesittas
Copy link
Copy Markdown
Collaborator

@fivetran-amrutabhimsenayachit check out the latest changes I made.

@georgesittas georgesittas force-pushed the RD-1147695-bit-length branch from f7bb417 to 71fc0c8 Compare April 1, 2026 13:19
@georgesittas georgesittas force-pushed the RD-1147695-bit-length branch from 71fc0c8 to b51d771 Compare April 1, 2026 13:20
@georgesittas georgesittas merged commit 62d7176 into main Apr 1, 2026
7 checks passed
@georgesittas georgesittas deleted the RD-1147695-bit-length branch April 1, 2026 13:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants