forked from cockroachdb/cockroach
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
opt: simplify leak-proof boolean CASE statements
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
1 parent
5fbcd8a
commit d995dcd
Showing
17 changed files
with
1,658 additions
and
127 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.