IS NOT? NULL support
[dbsrgits/SQL-Abstract-2.0-ish.git] / t / 100_expr_basic.t
1 use strict;
2 use warnings;
3
4 use Test::More tests => 16;
5 use Test::Differences;
6
7 use_ok('SQL::Abstract') or BAIL_OUT( "$@" );
8
9 my $sqla = SQL::Abstract->create(1);
10
11 is $sqla->dispatch(
12   { -type => 'expr',
13     op => '>',
14     args => [
15       {-type => name => args => [qw/me id/] }, 
16       { -type => 'value', value => 500 }
17     ]
18   }
19 ), "me.id > ?", 
20    "simple expr clause";
21
22 is $sqla->dispatch(
23   { -type => 'expr',
24     op => '>',
25     args => [
26       {-type => 'name', args => [qw/me id/]}, 
27       {-type => 'value', value => 500 }
28     ]
29   }
30 ), "me.id > ?", 
31    "simple expr clause";
32
33 my $cols = [
34   { -type => 'expr',
35     op => '>',
36     args => [
37       {-type => 'name', args => [qw/me id/]}, 
38       {-type => 'value', value => 500 }
39     ]
40   },
41   { -type => 'expr',
42     op => '==',
43     args => [
44       {-type => 'name', args => [qw/me name/]}, 
45       {-type => 'value', value => '200' }
46     ]
47   },
48 ];
49
50 eq_or_diff( [ SQL::Abstract->generate(
51     { -ast_version => 1,
52       -type => 'expr',
53       op => 'and',
54       args => $cols,
55     }
56   ) ], 
57   [ "me.id > ? AND me.name = ?",
58     [ 500,
59       '200'
60     ]
61   ],
62   "Where with binds"
63 );
64
65
66 is $sqla->dispatch(
67   { -type => 'expr',  op => 'or', args => $cols }
68 ), "me.id > ? OR me.name = ?", 
69    "expr clause (simple or)";
70
71
72 is $sqla->dispatch(
73   { -type => 'expr', op => 'or',
74     args => [
75       { -type => 'expr', op => '==', 
76         args => [ {-type => 'name', args => [qw/me name/] }, {-type => 'value', value => 500 } ]
77       },
78       { -type => 'expr', op => 'or', args => $cols }
79     ]
80   }
81 ), "me.name = ? OR me.id > ? OR me.name = ?",
82    "expr clause (nested or)";
83
84 is $sqla->dispatch(
85   { -type => 'expr', op => 'or',
86     args => [
87       { -type => 'expr', op => '==', 
88         args => [ {-type => 'name', args => [qw/me name/] }, {-type => 'value', value => 500 } ]
89       },
90       { -type => 'expr', op => 'and', args => $cols }
91     ]
92   }
93 ), "me.name = ? OR (me.id > ? AND me.name = ?)", 
94    "expr clause (inner and)";
95
96 is $sqla->dispatch(
97   { -type => 'expr', op => 'and', args => [
98       { -type => 'expr', op => '==', args => [
99           {-type => 'name', args => [qw/me id/] }, {-type => 'value', value => 200 } 
100         ],
101       },
102       { -type => 'expr', op => 'and', args => $cols }
103     ]
104   }
105 ), "me.id = ? AND me.id > ? AND me.name = ?", 
106    "expr clause (nested and)";
107
108
109 is $sqla->dispatch(
110   { -type => 'expr', op => 'and', args => [
111       { -type => 'expr', op => '==', args => [
112           {-type => 'name', args => [qw/me id/] }, {-type => 'value', value => 200 } 
113         ],
114       },
115       { -type => 'expr', op => 'or', args => $cols }
116     ]
117   }
118 ), "me.id = ? AND (me.id > ? OR me.name = ?)",
119    "expr clause (inner or)";
120
121 is $sqla->dispatch(
122   { -type => 'expr', op => 'in', args => [  ] }
123 ), "0 = 1", "emtpy -in";
124
125 is $sqla->dispatch(
126   { -type => 'expr', 
127     op => 'in', 
128     args => [ { -type => 'name', args => ['foo'] } ],
129   }
130 ), "0 = 1", "emtpy -in";
131
132 eq_or_diff(
133   [SQL::Abstract->generate(
134     { -ast_version => 1,
135       -type => 'expr',
136       op => 'and',
137       args => [
138         { -type => 'expr',
139           op => 'in',
140           args => [
141             {-type => 'name', args => [qw/me id/] },
142             {-type => 'value', value => 100 },
143             {-type => 'value', value => 200 },
144             {-type => 'value', value => 300 },
145           ]
146         }
147       ]
148     }
149   ) ],
150
151   [ "me.id IN (?, ?, ?)", 
152     [ 100, 200, 300 ]
153   ],
154   
155   "IN expression");
156
157 eq_or_diff(
158   [SQL::Abstract->generate(
159     { -ast_version => 1,
160       -type => 'expr',
161       op => 'and',
162       args => [
163         { -type => 'expr',
164           op => 'not_in',
165           args => [
166             {-type => 'name', args => [qw/me id/] },
167             {-type => 'value', value => 100 },
168             {-type => 'value', value => 200 },
169             {-type => 'value', value => 300 },
170           ]
171         }
172       ]
173     }
174   ) ],
175
176   [ "me.id NOT IN (?, ?, ?)", 
177     [ 100, 200, 300 ]
178   ],
179   
180   "NOT IN clause");
181
182
183 is $sqla->dispatch(
184   { -type => 'expr',
185     op => 'like',
186     args => [
187       {-type => name => args => [qw/me id/] }, 
188       { -type => 'value', value => 500 }
189     ]
190   }
191 ), "me.id LIKE ?", 
192    "LIKE expr clause";
193
194
195 is $sqla->dispatch(
196   { -type => 'expr',
197     op => '==',
198     args => [
199       {-type => name => args => [qw/me id/] },
200       { -type => 'value', value => undef }
201     ]
202   }
203 ), "me.id IS NULL",
204    "== undef";
205
206
207 is $sqla->dispatch(
208   { -type => 'expr',
209     op => '!=',
210     args => [
211       {-type => name => args => [qw/me id/] },
212       { -type => 'value', value => undef }
213     ]
214   }
215 ), "me.id IS NOT NULL",
216    "!= undef";