MCPcopy Create free account
hub / github.com/auxten/postgresql-parser / TestNormalizeExpr

Function TestNormalizeExpr

pkg/sql/sem/tree/normalize_test.go:53–318  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

51}
52
53func TestNormalizeExpr(t *testing.T) {
54 defer leaktest.AfterTest(t)()
55 defer tree.MockNameTypes(map[string]*types.T{
56 "a": types.Int,
57 "b": types.Int,
58 "c": types.Int,
59 "d": types.Bool,
60 "s": types.String,
61 "j": types.Jsonb,
62 "jv": types.Jsonb,
63 })()
64 testData := []struct {
65 expr string
66 expected string
67 }{
68 {`(a)`, `a`},
69 {`((((a))))`, `a`},
70 // These expression previously always mapped INT2/INT4 to INT8, but after
71 // unifying the type system, they now produce better results. Leaving the
72 // tests here to make sure they don't regress. See
73 // https://github.com/auxten/postgresql-parser/issues/32639
74 {`CAST(NULL AS INT2)`, `CAST(NULL AS INT2)`},
75 {`CAST(NULL AS INT4)`, `CAST(NULL AS INT4)`},
76 {`CAST(NULL AS INT8)`, `CAST(NULL AS INT8)`},
77 {`+a`, `a`},
78 {`-(-a)`, `a`},
79 {`-+-a`, `a`},
80 {`-(a-b)`, `b - a`},
81 {`-0`, `0`},
82 {`-NULL`, `NULL`},
83 {`-1`, `-1`},
84 {`a+0`, `a`},
85 {`0+a`, `a`},
86 {`a+(2-2)`, `a`},
87 {`a-0`, `a`},
88 {`a*1`, `a`},
89 {`1*a`, `a`},
90 {`a+NULL`, `NULL`},
91 {`a/1`, `CAST(a AS DECIMAL)`},
92 {`0/a`, `0 / a`},
93 {`0/1`, `0`},
94 {`12 BETWEEN 24 AND 36`, `false`},
95 {`12 BETWEEN 10 AND 20`, `true`},
96 {`10 BETWEEN a AND 20`, `a <= 10`},
97 {`(1 + 2) BETWEEN b AND c`, `(b <= 3) AND (c >= 3)`},
98 {`a BETWEEN b AND c`, `(a >= b) AND (a <= c)`},
99 {`a BETWEEN SYMMETRIC b AND c`, `((a >= b) AND (a <= c)) OR ((a >= c) AND (a <= b))`},
100 {`a NOT BETWEEN b AND c`, `(a < b) OR (a > c)`},
101 {`a NOT BETWEEN SYMMETRIC b AND c`, `((a < b) OR (a > c)) AND ((a < c) OR (a > b))`},
102 {`a BETWEEN NULL AND c`, `NULL AND (a <= c)`},
103 {`a BETWEEN SYMMETRIC NULL AND c`, `(NULL AND (a <= c)) OR ((a >= c) AND NULL)`},
104 {`a BETWEEN b AND NULL`, `(a >= b) AND NULL`},
105 {`a BETWEEN SYMMETRIC b AND NULL`, `((a >= b) AND NULL) OR (NULL AND (a <= b))`},
106 {`a BETWEEN NULL AND NULL`, `NULL`},
107 {`NULL BETWEEN 1 AND 2`, `NULL`},
108 {`1+1`, `2`},
109 {`(1+1,2+2,3+3)`, `(2, 4, 6)`},
110 {`a+(1+1)`, `a + 2`},

Callers

nothing calls this directly

Calls 7

NormalizeExprMethod · 0.95
AfterTestFunction · 0.92
MockNameTypesFunction · 0.92
MakeSemaContextFunction · 0.92
ParseExprFunction · 0.92
TypeCheckMethod · 0.65
StringMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…