diff --git a/sqlglot/dialects/snowflake.py b/sqlglot/dialects/snowflake.py index e0d392b0cd..93731f3049 100644 --- a/sqlglot/dialects/snowflake.py +++ b/sqlglot/dialects/snowflake.py @@ -107,6 +107,13 @@ def _builder(args: t.List) -> E: return _builder +def _build_bitor(args: t.List) -> exp.BitwiseOr | exp.Anonymous: + if len(args) == 3: + return exp.Anonymous(this="BITOR", expressions=args) + + return binary_from_function(exp.BitwiseOr)(args) + + # https://docs.snowflake.com/en/sql-reference/functions/div0 def _build_if_from_div0(args: t.List) -> exp.If: lhs = exp._wrap(seq_get(args, 0), exp.Binary) @@ -393,6 +400,8 @@ class Parser(parser.Parser): ), "BITXOR": binary_from_function(exp.BitwiseXor), "BIT_XOR": binary_from_function(exp.BitwiseXor), + "BITOR": _build_bitor, + "BIT_OR": _build_bitor, "BOOLXOR": binary_from_function(exp.Xor), "DATE": _build_datetime("DATE", exp.DataType.Type.DATE), "DATE_TRUNC": _date_trunc_to_time, @@ -869,6 +878,7 @@ class Generator(generator.Generator): "CONVERT_TIMEZONE", e.args.get("zone"), e.this ), exp.BitwiseXor: rename_func("BITXOR"), + exp.BitwiseOr: rename_func("BITOR"), exp.Create: transforms.preprocess([_flatten_structured_types_unless_iceberg]), exp.DateAdd: date_delta_sql("DATEADD"), exp.DateDiff: date_delta_sql("DATEDIFF"), diff --git a/tests/dialects/test_snowflake.py b/tests/dialects/test_snowflake.py index 4eb97235da..f70023b9ea 100644 --- a/tests/dialects/test_snowflake.py +++ b/tests/dialects/test_snowflake.py @@ -976,6 +976,12 @@ def test_snowflake(self): "snowflake": "EDITDISTANCE(col1, col2, 3)", }, ) + self.validate_identity("SELECT BITOR(a, b) FROM table") + + self.validate_identity("SELECT BIT_OR(a, b) FROM table", "SELECT BITOR(a, b) FROM table") + + # Test BITOR with three arguments, padding on the left + self.validate_identity("SELECT BITOR(a, b, 'LEFT') FROM table_name") def test_null_treatment(self): self.validate_all(