Skip to content

Commit e69b703

Browse files
authored
fix: Fix boolean handling bug in sqlite (#5003)
1 parent fd178cf commit e69b703

File tree

4 files changed

+9
-7
lines changed

4 files changed

+9
-7
lines changed

keep/api/core/cel_to_sql/sql_providers/mysql.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def cast(self, expression_to_cast: str, to_type, force=False):
3333
f"LOWER({expression_to_cast}) = 'true'": "TRUE",
3434
f"LOWER({expression_to_cast}) = 'false'": "FALSE",
3535
f"CAST({expression_to_cast} AS SIGNED) >= 1": "TRUE",
36+
f"CAST({expression_to_cast} AS SIGNED) <= 1": "FALSE",
3637
f"{expression_to_cast} != ''": "TRUE",
3738
}
3839
result = " ".join(

keep/api/core/cel_to_sql/sql_providers/postgresql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def cast(self, expression_to_cast: str, to_type: DataType, force=False):
4444
f"LOWER({expression_to_cast}) = 'true'": "true",
4545
f"LOWER({expression_to_cast}) = 'false'": "false",
4646
# regex match ensures safe casting to float
47-
f"{expression_to_cast} ~ '^[-+]?[0-9]*\\.?[0-9]+$' AND CAST({expression_to_cast} AS FLOAT) >= 1": "true",
47+
f"{expression_to_cast} ~ '^[-+]?[0-9]*\\.?[0-9]+$'": f"CAST({expression_to_cast} AS FLOAT) >= 1",
4848
f"LOWER({expression_to_cast}) != ''": "true",
4949
}
5050
result = " ".join(

keep/api/core/cel_to_sql/sql_providers/sqlite.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ def cast(self, expression_to_cast: str, to_type: DataType, force=False):
7777
f"LOWER({expression_to_cast}) = 'true'": "TRUE",
7878
f"LOWER({expression_to_cast}) = 'false'": "FALSE",
7979
f"CAST({expression_to_cast} AS SIGNED) >= 1": "TRUE",
80+
f"CAST({expression_to_cast} AS SIGNED) <= 1": "FALSE",
8081
f"{expression_to_cast} != ''": "TRUE",
8182
}
8283
result = " ".join(

tests/cel_to_sql/cel-to-sql-test-cases.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
"input_cel": "booleanFromJson == true",
1313
"description": "Equality with boolean from JSON",
1414
"expected_sql_dialect_based": {
15-
"mysql": "CASE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'true' THEN TRUE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'false' THEN FALSE WHEN CAST(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) AS SIGNED) >= 1 THEN TRUE WHEN JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) != '' THEN TRUE ELSE FALSE END = TRUE",
16-
"postgresql": "CASE WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'true' THEN true WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'false' THEN false WHEN (alert_event) ->> 'booleanFromJson' ~ '^[-+]?[0-9]*\\.?[0-9]+$' AND CAST((alert_event) ->> 'booleanFromJson' AS FLOAT) >= 1 THEN true WHEN LOWER((alert_event) ->> 'booleanFromJson') != '' THEN true ELSE false END = true",
17-
"sqlite": "CASE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'true' THEN TRUE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'false' THEN FALSE WHEN CAST(json_extract(alert_event, '$.\"booleanFromJson\"') AS SIGNED) >= 1 THEN TRUE WHEN json_extract(alert_event, '$.\"booleanFromJson\"') != '' THEN TRUE ELSE FALSE END = true"
15+
"mysql": "CASE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'true' THEN TRUE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'false' THEN FALSE WHEN CAST(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) AS SIGNED) >= 1 THEN TRUE WHEN CAST(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) AS SIGNED) <= 1 THEN FALSE WHEN JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) != '' THEN TRUE ELSE FALSE END = TRUE",
16+
"postgresql": "CASE WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'true' THEN true WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'false' THEN false WHEN (alert_event) ->> 'booleanFromJson' ~ '^[-+]?[0-9]*\\.?[0-9]+$' THEN CAST((alert_event) ->> 'booleanFromJson' AS FLOAT) >= 1 WHEN LOWER((alert_event) ->> 'booleanFromJson') != '' THEN true ELSE false END = true",
17+
"sqlite": "CASE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'true' THEN TRUE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'false' THEN FALSE WHEN CAST(json_extract(alert_event, '$.\"booleanFromJson\"') AS SIGNED) >= 1 THEN TRUE WHEN CAST(json_extract(alert_event, '$.\"booleanFromJson\"') AS SIGNED) <= 1 THEN FALSE WHEN json_extract(alert_event, '$.\"booleanFromJson\"') != '' THEN TRUE ELSE FALSE END = true"
1818
}
1919
},
2020
{
@@ -57,9 +57,9 @@
5757
"input_cel": "booleanFromJson in [true,false]",
5858
"description": "IN operator along with boolean from JSON",
5959
"expected_sql_dialect_based": {
60-
"mysql": "CASE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'true' THEN TRUE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'false' THEN FALSE WHEN CAST(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) AS SIGNED) >= 1 THEN TRUE WHEN JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) != '' THEN TRUE ELSE FALSE END in (TRUE, FALSE)",
61-
"postgresql": "CASE WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'true' THEN true WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'false' THEN false WHEN (alert_event) ->> 'booleanFromJson' ~ '^[-+]?[0-9]*\\.?[0-9]+$' AND CAST((alert_event) ->> 'booleanFromJson' AS FLOAT) >= 1 THEN true WHEN LOWER((alert_event) ->> 'booleanFromJson') != '' THEN true ELSE false END in (true, false)",
62-
"sqlite": "CASE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'true' THEN TRUE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'false' THEN FALSE WHEN CAST(json_extract(alert_event, '$.\"booleanFromJson\"') AS SIGNED) >= 1 THEN TRUE WHEN json_extract(alert_event, '$.\"booleanFromJson\"') != '' THEN TRUE ELSE FALSE END in (true, false)"
60+
"mysql": "CASE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'true' THEN TRUE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"'))) = 'false' THEN FALSE WHEN CAST(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) AS SIGNED) >= 1 THEN TRUE WHEN CAST(JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) AS SIGNED) <= 1 THEN FALSE WHEN JSON_UNQUOTE(JSON_EXTRACT(alert_event, '$.\"booleanFromJson\"')) != '' THEN TRUE ELSE FALSE END in (TRUE, FALSE)",
61+
"postgresql": "CASE WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'true' THEN true WHEN LOWER((alert_event) ->> 'booleanFromJson') = 'false' THEN false WHEN (alert_event) ->> 'booleanFromJson' ~ '^[-+]?[0-9]*\\.?[0-9]+$' THEN CAST((alert_event) ->> 'booleanFromJson' AS FLOAT) >= 1 WHEN LOWER((alert_event) ->> 'booleanFromJson') != '' THEN true ELSE false END in (true, false)",
62+
"sqlite": "CASE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'true' THEN TRUE WHEN LOWER(json_extract(alert_event, '$.\"booleanFromJson\"')) = 'false' THEN FALSE WHEN CAST(json_extract(alert_event, '$.\"booleanFromJson\"') AS SIGNED) >= 1 THEN TRUE WHEN CAST(json_extract(alert_event, '$.\"booleanFromJson\"') AS SIGNED) <= 1 THEN FALSE WHEN json_extract(alert_event, '$.\"booleanFromJson\"') != '' THEN TRUE ELSE FALSE END in (true, false)"
6363
}
6464
},
6565
{

0 commit comments

Comments
 (0)