Skip to content

Commit

Permalink
opt: simplify leak-proof boolean CASE statements
Browse files Browse the repository at this point in the history
This patch adds a normalization rule `SimplifyLeakproofBooleanCase`
that replaces a leak-proof boolean CASE statement with an
equivalent boolean expression built using `AND` and `OR` operators.
This is possible when the following conditions are satisfied:
  1. The CASE statement returns a boolean value.
  2. The CASE statement is leak-proof.
  3. The CASE condition is a *constant* boolean value (True, False, NULL).
  4. Each WHEN branch returns a *constant* boolean value.

Example:
```
CASE WHEN a THEN False WHEN b THEN True ELSE c END
=>
((a IS NOT True) AND (b OR c))
```
See the `ConvertCaseToCondition` comment for details.

This is useful for strict UDFs, which implement the argument NULL
check using a CASE statement.

Informs cockroachdb#96218

Release note: None
  • Loading branch information
DrewKimball committed Feb 4, 2023
1 parent 5fbcd8a commit d995dcd
Show file tree
Hide file tree
Showing 17 changed files with 1,658 additions and 127 deletions.
7 changes: 7 additions & 0 deletions pkg/ccl/logictestccl/tests/3node-tenant/generated_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

383 changes: 383 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/scalar
Original file line number Diff line number Diff line change
@@ -0,0 +1,383 @@
# ------------------------------------------------------------------------------
# Test with boolean CASE statements.
# ------------------------------------------------------------------------------

statement ok
CREATE TABLE bools (a BOOL, b BOOL, c BOOL, d BOOL, e BOOL);
INSERT INTO bools VALUES
(True, True, True, True, True),
(False, False, False, False, False),
(True, False, True, False, True),
(False, True, False, True, False),
(True, False, False, False, False),
(False, True, True, True, True),
(True, False, True, True, True),
(False, True, False, False, False),
(NULL, True, True, True, True),
(NULL, NULL, NULL, NULL, NULL),
(True, NULL, True, NULL, True),
(False, True, NULL, True, NULL),
(True, NULL, NULL, NULL, NULL),
(NULL, True, False, True, True),
(True, NULL, True, True, True),
(NULL, True, NULL, False, False);

query BBBBBB rowsort
SELECT CASE WHEN a THEN True WHEN b THEN True ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
true false true false true false
true true false false false false
true false true true true true
true true false true true true
true false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
true false true NULL true NULL
true true NULL NULL NULL NULL
true NULL true false true true
true true NULL true true true
true NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN True WHEN b THEN FALSE ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
false false true false true false
true true false false false false
false false true true true true
true true false true true true
false false true false false false
false NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
false false true NULL true NULL
true true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
false NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN False WHEN b THEN True ELSE c END, * FROM bools;
----
false true true true true true
false false false false false false
false true false true false true
true false true false true false
false true false false false false
true false true true true true
false true false true true true
true false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
false true NULL true NULL true
true false true NULL true NULL
false true NULL NULL NULL NULL
true NULL true false true true
false true NULL true true true
true NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN False WHEN b THEN False ELSE c END, * FROM bools;
----
false true true true true true
false false false false false false
false true false true false true
false false true false true false
false true false false false false
false false true true true true
false true false true true true
false false true false false false
false NULL true true true true
NULL NULL NULL NULL NULL NULL
false true NULL true NULL true
false false true NULL true NULL
false true NULL NULL NULL NULL
false NULL true false true true
false true NULL true true true
false NULL true NULL false false

query BBBBBB rowsort
SELECT CASE False WHEN a THEN True WHEN b THEN True ELSE c END, * FROM bools;
----
true true true true true true
true false false false false false
true true false true false true
true false true false true false
true true false false false false
true false true true true true
true true false true true true
true false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
true false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE False WHEN a THEN True WHEN b THEN FALSE ELSE c END, * FROM bools;
----
true true true true true true
true false false false false false
false true false true false true
true false true false true false
false true false false false false
true false true true true true
false true false true true true
true false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
true false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE False WHEN a THEN False WHEN b THEN True ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
false false true false true false
true true false false false false
false false true true true true
true true false true true true
false false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
false false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE False WHEN a THEN False WHEN b THEN False ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
false true false true false true
false false true false true false
false true false false false false
false false true true true true
false true false true true true
false false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
false false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE NULL WHEN a THEN True WHEN b THEN True WHEN NULL THEN True ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
false false true false true false
false true false false false false
true false true true true true
true true false true true true
false false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
NULL false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE NULL WHEN a THEN True WHEN b THEN False WHEN NULL THEN True ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
false false true false true false
false true false false false false
true false true true true true
true true false true true true
false false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
NULL false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE NULL WHEN a THEN False WHEN b THEN True WHEN NULL THEN True ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
false false true false true false
false true false false false false
true false true true true true
true true false true true true
false false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
NULL false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE NULL WHEN a THEN False WHEN b THEN False WHEN NULL THEN True ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
false false true false true false
false true false false false false
true false true true true true
true true false true true true
false false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
NULL false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a OR b THEN True WHEN b AND c THEN True ELSE d OR NOT e END, * FROM bools;
----
true true true true true true
true false false false false false
true true false true false true
true false true false true false
true true false false false false
true false true true true true
true true false true true true
true false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
true false true NULL true NULL
true true NULL NULL NULL NULL
true NULL true false true true
true true NULL true true true
true NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN NULL WHEN b THEN True ELSE c END, * FROM bools;
----
NULL true true true true true
false false false false false false
NULL true false true false true
true false true false true false
NULL true false false false false
true false true true true true
NULL true false true true true
true false true false false false
true NULL true true true true
NULL NULL NULL NULL NULL NULL
NULL true NULL true NULL true
true false true NULL true NULL
NULL true NULL NULL NULL NULL
true NULL true false true true
NULL true NULL true true true
true NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN NULL WHEN b THEN FALSE ELSE c END, * FROM bools;
----
NULL true true true true true
false false false false false false
NULL true false true false true
false false true false true false
NULL true false false false false
false false true true true true
NULL true false true true true
false false true false false false
false NULL true true true true
NULL NULL NULL NULL NULL NULL
NULL true NULL true NULL true
false false true NULL true NULL
NULL true NULL NULL NULL NULL
false NULL true false true true
NULL true NULL true true true
false NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN True WHEN b THEN NULL ELSE c END, * FROM bools;
----
true true true true true true
false false false false false false
true true false true false true
NULL false true false true false
true true false false false false
NULL false true true true true
true true false true true true
NULL false true false false false
NULL NULL true true true true
NULL NULL NULL NULL NULL NULL
true true NULL true NULL true
NULL false true NULL true NULL
true true NULL NULL NULL NULL
NULL NULL true false true true
true true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN False WHEN b THEN NULL ELSE c END, * FROM bools;
----
false true true true true true
false false false false false false
false true false true false true
NULL false true false true false
false true false false false false
NULL false true true true true
false true false true true true
NULL false true false false false
NULL NULL true true true true
NULL NULL NULL NULL NULL NULL
false true NULL true NULL true
NULL false true NULL true NULL
false true NULL NULL NULL NULL
NULL NULL true false true true
false true NULL true true true
NULL NULL true NULL false false

query BBBBBB rowsort
SELECT CASE WHEN a THEN NULL WHEN b THEN NULL ELSE c END, * FROM bools;
----
NULL true true true true true
false false false false false false
NULL true false true false true
NULL false true false true false
NULL true false false false false
NULL false true true true true
NULL true false true true true
NULL false true false false false
NULL NULL true true true true
NULL NULL NULL NULL NULL NULL
NULL true NULL true NULL true
NULL false true NULL true NULL
NULL true NULL NULL NULL NULL
NULL NULL true false true true
NULL true NULL true true true
NULL NULL true NULL false false
Loading

0 comments on commit d995dcd

Please sign in to comment.