Skip to content

Conversation

@fivetran-felixhuang
Copy link
Collaborator

https://docs.snowflake.com/en/sql-reference/functions/try_to_binary

The difference between TRY_TO_BINARY and TO_BINARY is that TRY_TO_BINARY returns NULL when TO_BINARY throws an error. Also TRY_TO_BINARY returns NULL if the format is not HEX, BASE64, or UTF-8.

We can achieve this be using transpilation method tobinary_sql and wrap the transpiled query with TRY(). If the format specified is invalid, we return NULL directly.

source query:
SELECT
TRY_TO_BINARY('48656C6C6F', 'HEX') AS valid_hex,
TRY_TO_BINARY('Hello', 'UTF-8') AS valid_utf8,
TRY_TO_BINARY('SGVsbG8=', 'BASE64') AS valid_base64,
TRY_TO_BINARY('invalid_hex', 'HEX') AS invalid_hex,
TRY_TO_BINARY('48656C6C6F', 'UTF-16') AS invalid_format,
TRY_TO_BINARY('invalid==', 'BASE64') AS invalid_base64;

transpiled query:
SELECT
TRY(UNHEX('48656C6C6F')) AS "VALID_HEX",
TRY(ENCODE('Hello')) AS "VALID_UTF8",
TRY(FROM_BASE64('SGVsbG8=')) AS "VALID_BASE64",
TRY(UNHEX('invalid_hex')) AS "INVALID_HEX",
TRY(NULL) AS "INVALID_FORMAT",
TRY(FROM_BASE64('invalid==')) AS "INVALID_BASE64"

-- (wrapped with HEX so we can see the blob value directly)
SELECT
HEX(TRY(UNHEX('48656C6C6F'))) AS "VALID_HEX",
HEX(TRY(ENCODE('Hello'))) AS "VALID_UTF8",
HEX(TRY(FROM_BASE64('SGVsbG8='))) AS "VALID_BASE64",
HEX(TRY(UNHEX('invalid_hex'))) AS "INVALID_HEX",
HEX(TRY(NULL)) AS "INVALID_FORMAT",
HEX(TRY(FROM_BASE64('invalid=='))) AS "INVALID_BASE64"

@github-actions
Copy link
Contributor

github-actions bot commented Dec 23, 2025

SQLGlot Integration Test Results

Comparing:

  • this branch (sqlglot:transpile_snowflake_duckdb_try_to_binary, sqlglot version: transpile_snowflake_duckdb_try_to_binary)
  • baseline (main, sqlglot version: 28.5.1.dev34)

⚠️ Limited to dialects: duckdb, snowflake

By Dialect

dialect main sqlglot:transpile_snowflake_duckdb_try_to_binary difference links
duckdb -> duckdb 4003/4003 passed (100.0%) 4003/4003 passed (100.0%) No change full result / delta
snowflake -> duckdb 626/1085 passed (57.7%) 626/1085 passed (57.7%) No change full result / delta
snowflake -> snowflake 981/1085 passed (90.4%) 981/1085 passed (90.4%) No change full result / delta

Overall

main: 6173 total, 5610 passed (pass rate: 90.9%), sqlglot version: 28.5.1.dev34

sqlglot:transpile_snowflake_duckdb_try_to_binary: 6173 total, 5610 passed (pass rate: 90.9%), sqlglot version: transpile_snowflake_duckdb_try_to_binary

Difference: No change

Copy link
Collaborator

@VaggelisD VaggelisD left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good overall @fivetran-felixhuang! Got only a few minor comments:

@VaggelisD VaggelisD merged commit e7b5d6f into main Dec 29, 2025
9 checks passed
@VaggelisD VaggelisD deleted the transpile_snowflake_duckdb_try_to_binary branch December 29, 2025 13:50
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.

4 participants