few more comments
[scpubgit/Q-Branch.git] / lib / SQL / Abstract.pm
CommitLineData
96449e8e 1package SQL::Abstract; # see doc at end of file
2
96449e8e 3use strict;
4use warnings;
9d9d5bd6 5use Carp ();
312d830b 6use List::Util ();
7use Scalar::Util ();
96449e8e 8
0da0fe34 9use Exporter 'import';
10our @EXPORT_OK = qw(is_plain_value is_literal_value);
11
12BEGIN {
13 if ($] < 5.009_005) {
14 require MRO::Compat;
15 }
16 else {
17 require mro;
18 }
843a94b5 19
20 *SQL::Abstract::_ENV_::DETECT_AUTOGENERATED_STRINGIFICATION = $ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION}
21 ? sub () { 0 }
22 : sub () { 1 }
23 ;
0da0fe34 24}
25
96449e8e 26#======================================================================
27# GLOBALS
28#======================================================================
29
dc6afcf8 30our $VERSION = '1.86';
7479e27e 31
22f1a437 32# This would confuse some packagers
c520207b 33$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
96449e8e 34
35our $AUTOLOAD;
36
37# special operators (-in, -between). May be extended/overridden by user.
38# See section WHERE: BUILTIN SPECIAL OPERATORS below for implementation
39my @BUILTIN_SPECIAL_OPS = (
f663e672 40 {regex => qr/^ (?: not \s )? between $/ix, handler => sub { die "NOPE" }},
41 {regex => qr/^ (?: not \s )? in $/ix, handler => sub { die "NOPE" }},
87c8e45b 42 {regex => qr/^ is (?: \s+ not )? $/ix, handler => sub { die "NOPE" }},
96449e8e 43);
44
45#======================================================================
46# DEBUGGING AND ERROR REPORTING
47#======================================================================
48
49sub _debug {
50 return unless $_[0]->{debug}; shift; # a little faster
51 my $func = (caller(1))[3];
52 warn "[$func] ", @_, "\n";
53}
54
55sub belch (@) {
56 my($func) = (caller(1))[3];
9d9d5bd6 57 Carp::carp "[$func] Warning: ", @_;
96449e8e 58}
59
60sub puke (@) {
61 my($func) = (caller(1))[3];
9d9d5bd6 62 Carp::croak "[$func] Fatal: ", @_;
96449e8e 63}
64
0da0fe34 65sub is_literal_value ($) {
66 ref $_[0] eq 'SCALAR' ? [ ${$_[0]} ]
67 : ( ref $_[0] eq 'REF' and ref ${$_[0]} eq 'ARRAY' ) ? [ @${ $_[0] } ]
0da0fe34 68 : undef;
69}
70
6d7a39b3 71sub is_undef_value ($) {
72 !defined($_[0])
73 or (
74 ref($_[0]) eq 'HASH'
75 and exists $_[0]->{-value}
76 and not defined $_[0]->{-value}
77 );
78}
79
0da0fe34 80# FIXME XSify - this can be done so much more efficiently
81sub is_plain_value ($) {
82 no strict 'refs';
966200cc 83 ! length ref $_[0] ? \($_[0])
0da0fe34 84 : (
85 ref $_[0] eq 'HASH' and keys %{$_[0]} == 1
86 and
87 exists $_[0]->{-value}
966200cc 88 ) ? \($_[0]->{-value})
0da0fe34 89 : (
a1c9e0ff 90 # reuse @_ for even moar speedz
91 defined ( $_[1] = Scalar::Util::blessed $_[0] )
0da0fe34 92 and
93 # deliberately not using Devel::OverloadInfo - the checks we are
94 # intersted in are much more limited than the fullblown thing, and
95 # this is a very hot piece of code
96 (
e8d729d4 97 # simply using ->can('(""') can leave behind stub methods that
98 # break actually using the overload later (see L<perldiag/Stub
99 # found while resolving method "%s" overloading "%s" in package
100 # "%s"> and the source of overload::mycan())
44e54b41 101 #
0da0fe34 102 # either has stringification which DBI SHOULD prefer out of the box
a1c9e0ff 103 grep { *{ (qq[${_}::(""]) }{CODE} } @{ $_[2] = mro::get_linear_isa( $_[1] ) }
0da0fe34 104 or
20e178a8 105 # has nummification or boolification, AND fallback is *not* disabled
0da0fe34 106 (
843a94b5 107 SQL::Abstract::_ENV_::DETECT_AUTOGENERATED_STRINGIFICATION
108 and
20e178a8 109 (
110 grep { *{"${_}::(0+"}{CODE} } @{$_[2]}
111 or
112 grep { *{"${_}::(bool"}{CODE} } @{$_[2]}
113 )
0da0fe34 114 and
115 (
116 # no fallback specified at all
a1c9e0ff 117 ! ( ($_[3]) = grep { *{"${_}::()"}{CODE} } @{$_[2]} )
0da0fe34 118 or
119 # fallback explicitly undef
a1c9e0ff 120 ! defined ${"$_[3]::()"}
0da0fe34 121 or
122 # explicitly true
a1c9e0ff 123 !! ${"$_[3]::()"}
0da0fe34 124 )
125 )
126 )
966200cc 127 ) ? \($_[0])
0da0fe34 128 : undef;
129}
130
131
96449e8e 132
133#======================================================================
134# NEW
135#======================================================================
136
137sub new {
138 my $self = shift;
139 my $class = ref($self) || $self;
140 my %opt = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
141
142 # choose our case by keeping an option around
143 delete $opt{case} if $opt{case} && $opt{case} ne 'lower';
144
145 # default logic for interpreting arrayrefs
ef559da3 146 $opt{logic} = $opt{logic} ? uc $opt{logic} : 'OR';
96449e8e 147
148 # how to return bind vars
96449e8e 149 $opt{bindtype} ||= 'normal';
150
151 # default comparison is "=", but can be overridden
152 $opt{cmp} ||= '=';
153
3af02ccb 154 # try to recognize which are the 'equality' and 'inequality' ops
3cdadcbe 155 # (temporary quickfix (in 2007), should go through a more seasoned API)
156 $opt{equality_op} = qr/^( \Q$opt{cmp}\E | \= )$/ix;
157 $opt{inequality_op} = qr/^( != | <> )$/ix;
158
159 $opt{like_op} = qr/^ (is\s+)? r?like $/xi;
160 $opt{not_like_op} = qr/^ (is\s+)? not \s+ r?like $/xi;
96449e8e 161
162 # SQL booleans
163 $opt{sqltrue} ||= '1=1';
164 $opt{sqlfalse} ||= '0=1';
165
9d48860e 166 # special operators
30af97c5 167 $opt{special_ops} ||= [];
168
b6251592 169 # regexes are applied in order, thus push after user-defines
96449e8e 170 push @{$opt{special_ops}}, @BUILTIN_SPECIAL_OPS;
171
cf06e9dc 172 if ($class->isa('DBIx::Class::SQLMaker')) {
dd1d0dbf 173 push @{$opt{special_ops}}, our $DBIC_Compat_Op ||= {
174 regex => qr/^(?:ident|value)$/i, handler => sub { die "NOPE" }
175 };
cf06e9dc 176 $opt{is_dbic_sqlmaker} = 1;
dd1d0dbf 177 }
178
9d48860e 179 # unary operators
59f23b3d 180 $opt{unary_ops} ||= [];
59f23b3d 181
3af02ccb 182 # rudimentary sanity-check for user supplied bits treated as functions/operators
b6251592 183 # If a purported function matches this regular expression, an exception is thrown.
184 # Literal SQL is *NOT* subject to this check, only functions (and column names
185 # when quoting is not in effect)
96449e8e 186
b6251592 187 # FIXME
188 # need to guard against ()'s in column names too, but this will break tons of
189 # hacks... ideas anyone?
190 $opt{injection_guard} ||= qr/
191 \;
192 |
193 ^ \s* go \s
194 /xmi;
96449e8e 195
ec19b759 196 $opt{expand_unary} = {};
197
767b62e4 198 $opt{expand} = {
2a238661 199 -not => '_expand_not',
05d37f9c 200 -bool => '_expand_bool',
d6ac0cfb 201 -and => '_expand_op_andor',
202 -or => '_expand_op_andor',
5c633220 203 -nest => '_expand_nest',
cd90d4f0 204 -bind => sub { shift; +{ @_ } },
767b62e4 205 };
206
143f50df 207 $opt{expand_op} = {
208 'between' => '_expand_between',
209 'not between' => '_expand_between',
416026a9 210 'in' => '_expand_in',
211 'not in' => '_expand_in',
5c633220 212 'nest' => '_expand_nest',
f49b02a0 213 (map +($_ => '_expand_op_andor'), ('and', 'or')),
214 (map +($_ => '_expand_op_is'), ('is', 'is not')),
143f50df 215 };
ca158918 216
771e7f69 217 # placeholder for _expand_unop system
218 {
219 my %unops = (-ident => '_expand_ident', -value => '_expand_value');
220 foreach my $name (keys %unops) {
221 $opt{expand}{$name} = $unops{$name};
222 my ($op) = $name =~ /^-(.*)$/;
223 $opt{expand_op}{$op} = sub {
224 my ($self, $op, $arg, $k) = @_;
efcd97c3 225 return $self->_expand_expr_hashpair_cmp(
226 $k, { "-${op}" => $arg }
9bb6374d 227 );
771e7f69 228 };
229 }
230 }
231
ca158918 232 $opt{render} = {
233 (map +("-$_", "_render_$_"), qw(op func bind ident literal list)),
234 %{$opt{render}||{}}
235 };
236
9159df95 237 $opt{render_op} = {
238 (map +($_ => '_render_op_between'), 'between', 'not between'),
239 (map +($_ => '_render_op_in'), 'in', 'not in'),
240 (map +($_ => '_render_unop_postfix'),
241 'is null', 'is not null', 'asc', 'desc',
242 ),
243 (not => '_render_op_not'),
244 (map +($_ => '_render_op_andor'), qw(and or)),
245 };
143f50df 246
b6251592 247 return bless \%opt, $class;
248}
96449e8e 249
e175845b 250sub sqltrue { +{ -literal => [ $_[0]->{sqltrue} ] } }
251sub sqlfalse { +{ -literal => [ $_[0]->{sqlfalse} ] } }
170e6c33 252
253sub _assert_pass_injection_guard {
254 if ($_[1] =~ $_[0]->{injection_guard}) {
255 my $class = ref $_[0];
256 puke "Possible SQL injection attempt '$_[1]'. If this is indeed a part of the "
257 . "desired SQL use literal SQL ( \'...' or \[ '...' ] ) or supply your own "
258 . "{injection_guard} attribute to ${class}->new()"
259 }
260}
261
262
96449e8e 263#======================================================================
264# INSERT methods
265#======================================================================
266
267sub insert {
02288357 268 my $self = shift;
269 my $table = $self->_table(shift);
270 my $data = shift || return;
271 my $options = shift;
96449e8e 272
273 my $method = $self->_METHOD_FOR_refkind("_insert", $data);
02288357 274 my ($sql, @bind) = $self->$method($data);
96449e8e 275 $sql = join " ", $self->_sqlcase('insert into'), $table, $sql;
02288357 276
e82e648a 277 if ($options->{returning}) {
ca4f826a 278 my ($s, @b) = $self->_insert_returning($options);
e82e648a 279 $sql .= $s;
280 push @bind, @b;
02288357 281 }
282
96449e8e 283 return wantarray ? ($sql, @bind) : $sql;
284}
285
60f3fd3f 286# So that subclasses can override INSERT ... RETURNING separately from
287# UPDATE and DELETE (e.g. DBIx::Class::SQLMaker::Oracle does this)
b17a3ece 288sub _insert_returning { shift->_returning(@_) }
289
95904db5 290sub _returning {
e82e648a 291 my ($self, $options) = @_;
6b1fe79d 292
e82e648a 293 my $f = $options->{returning};
294
79d310f2 295 my ($sql, @bind) = $self->render_aqt(
ff96fdd4 296 $self->_expand_maybe_list_expr($f, undef, -ident)
297 );
298 return wantarray
299 ? $self->_sqlcase(' returning ') . $sql
300 : ($self->_sqlcase(' returning ').$sql, @bind);
6b1fe79d 301}
302
96449e8e 303sub _insert_HASHREF { # explicit list of fields and then values
304 my ($self, $data) = @_;
305
306 my @fields = sort keys %$data;
307
fe3ae272 308 my ($sql, @bind) = $self->_insert_values($data);
96449e8e 309
310 # assemble SQL
311 $_ = $self->_quote($_) foreach @fields;
312 $sql = "( ".join(", ", @fields).") ".$sql;
313
314 return ($sql, @bind);
315}
316
317sub _insert_ARRAYREF { # just generate values(?,?) part (no list of fields)
318 my ($self, $data) = @_;
319
320 # no names (arrayref) so can't generate bindtype
321 $self->{bindtype} ne 'columns'
322 or belch "can't do 'columns' bindtype when called with arrayref";
323
19b6ccce 324 my (@values, @all_bind);
325 foreach my $value (@$data) {
326 my ($values, @bind) = $self->_insert_value(undef, $value);
327 push @values, $values;
328 push @all_bind, @bind;
329 }
330 my $sql = $self->_sqlcase('values')." ( ".join(", ", @values)." )";
331 return ($sql, @all_bind);
fe3ae272 332}
333
334sub _insert_ARRAYREFREF { # literal SQL with bind
335 my ($self, $data) = @_;
336
337 my ($sql, @bind) = @${$data};
338 $self->_assert_bindval_matches_bindtype(@bind);
339
340 return ($sql, @bind);
341}
342
343
344sub _insert_SCALARREF { # literal SQL without bind
345 my ($self, $data) = @_;
346
347 return ($$data);
348}
349
350sub _insert_values {
351 my ($self, $data) = @_;
352
96449e8e 353 my (@values, @all_bind);
fe3ae272 354 foreach my $column (sort keys %$data) {
19b6ccce 355 my ($values, @bind) = $self->_insert_value($column, $data->{$column});
356 push @values, $values;
357 push @all_bind, @bind;
358 }
359 my $sql = $self->_sqlcase('values')." ( ".join(", ", @values)." )";
360 return ($sql, @all_bind);
361}
96449e8e 362
19b6ccce 363sub _insert_value {
364 my ($self, $column, $v) = @_;
96449e8e 365
79d310f2 366 return $self->render_aqt(
720ca4f7 367 $self->_expand_insert_value($column, $v)
368 );
369}
96449e8e 370
720ca4f7 371sub _expand_insert_value {
372 my ($self, $column, $v) = @_;
96449e8e 373
720ca4f7 374 if (ref($v) eq 'ARRAY') {
375 if ($self->{array_datatypes}) {
376 return +{ -bind => [ $column, $v ] };
377 }
378 my ($sql, @bind) = @$v;
379 $self->_assert_bindval_matches_bindtype(@bind);
380 return +{ -literal => $v };
381 }
382 if (ref($v) eq 'HASH') {
383 if (grep !/^-/, keys %$v) {
384 belch "HASH ref as bind value in insert is not supported";
385 return +{ -bind => [ $column, $v ] };
386 }
387 }
388 if (!defined($v)) {
389 return +{ -bind => [ $column, undef ] };
390 }
391 local our $Cur_Col_Meta = $column;
79d310f2 392 return $self->expand_expr($v);
96449e8e 393}
394
395
96449e8e 396
397#======================================================================
398# UPDATE methods
399#======================================================================
400
401
402sub update {
95904db5 403 my $self = shift;
404 my $table = $self->_table(shift);
405 my $data = shift || return;
406 my $where = shift;
407 my $options = shift;
96449e8e 408
409 # first build the 'SET' part of the sql statement
96449e8e 410 puke "Unsupported data type specified to \$sql->update"
411 unless ref $data eq 'HASH';
412
9ade906e 413 my ($sql, @all_bind) = $self->_update_set_values($data);
a9e94508 414 $sql = $self->_sqlcase('update ') . $table . $self->_sqlcase(' set ')
9ade906e 415 . $sql;
416
417 if ($where) {
418 my($where_sql, @where_bind) = $self->where($where);
419 $sql .= $where_sql;
420 push @all_bind, @where_bind;
421 }
422
423 if ($options->{returning}) {
424 my ($returning_sql, @returning_bind) = $self->_update_returning($options);
425 $sql .= $returning_sql;
426 push @all_bind, @returning_bind;
427 }
428
429 return wantarray ? ($sql, @all_bind) : $sql;
430}
431
432sub _update_set_values {
433 my ($self, $data) = @_;
434
79d310f2 435 return $self->render_aqt(
89690da2 436 $self->_expand_update_set_values($data),
437 );
438}
96449e8e 439
89690da2 440sub _expand_update_set_values {
441 my ($self, $data) = @_;
442 $self->_expand_maybe_list_expr( [
443 map {
444 my ($k, $set) = @$_;
c4ed66f4 445 $set = { -bind => $_ } unless defined $set;
9103bd14 446 +{ -op => [ '=', $self->_expand_ident(-ident => $k), $set ] };
89690da2 447 }
448 map {
449 my $k = $_;
450 my $v = $data->{$k};
451 (ref($v) eq 'ARRAY'
452 ? ($self->{array_datatypes}
453 ? [ $k, +{ -bind => [ $k, $v ] } ]
454 : [ $k, +{ -literal => $v } ])
455 : do {
456 local our $Cur_Col_Meta = $k;
457 [ $k, $self->_expand_expr($v) ]
458 }
459 );
460 } sort keys %$data
461 ] );
96449e8e 462}
463
60f3fd3f 464# So that subclasses can override UPDATE ... RETURNING separately from
465# INSERT and DELETE
20bb2ad5 466sub _update_returning { shift->_returning(@_) }
96449e8e 467
468
469
470#======================================================================
471# SELECT
472#======================================================================
473
474
475sub select {
476 my $self = shift;
477 my $table = $self->_table(shift);
478 my $fields = shift || '*';
479 my $where = shift;
480 my $order = shift;
481
daa4ccdd 482 my ($fields_sql, @bind) = $self->_select_fields($fields);
96449e8e 483
daa4ccdd 484 my ($where_sql, @where_bind) = $self->where($where, $order);
485 push @bind, @where_bind;
486
487 my $sql = join(' ', $self->_sqlcase('select'), $fields_sql,
96449e8e 488 $self->_sqlcase('from'), $table)
489 . $where_sql;
490
9d48860e 491 return wantarray ? ($sql, @bind) : $sql;
96449e8e 492}
493
daa4ccdd 494sub _select_fields {
495 my ($self, $fields) = @_;
de63ce57 496 return $fields unless ref($fields);
79d310f2 497 return $self->render_aqt(
27592e2b 498 $self->_expand_maybe_list_expr($fields, undef, '-ident')
499 );
daa4ccdd 500}
501
96449e8e 502#======================================================================
503# DELETE
504#======================================================================
505
506
507sub delete {
85327cd5 508 my $self = shift;
509 my $table = $self->_table(shift);
510 my $where = shift;
511 my $options = shift;
96449e8e 512
513 my($where_sql, @bind) = $self->where($where);
a9e94508 514 my $sql = $self->_sqlcase('delete from ') . $table . $where_sql;
96449e8e 515
85327cd5 516 if ($options->{returning}) {
ca4f826a 517 my ($returning_sql, @returning_bind) = $self->_delete_returning($options);
85327cd5 518 $sql .= $returning_sql;
519 push @bind, @returning_bind;
520 }
521
9d48860e 522 return wantarray ? ($sql, @bind) : $sql;
96449e8e 523}
524
60f3fd3f 525# So that subclasses can override DELETE ... RETURNING separately from
526# INSERT and UPDATE
85327cd5 527sub _delete_returning { shift->_returning(@_) }
528
529
96449e8e 530
531#======================================================================
532# WHERE: entry point
533#======================================================================
534
535
536
537# Finally, a separate routine just to handle WHERE clauses
538sub where {
539 my ($self, $where, $order) = @_;
540
7ad12721 541 local $self->{convert_where} = $self->{convert};
542
96449e8e 543 # where ?
e175845b 544 my ($sql, @bind) = defined($where)
545 ? $self->_recurse_where($where)
546 : (undef);
417dd15e 547 $sql = (defined $sql and length $sql) ? $self->_sqlcase(' where ') . "( $sql )" : '';
96449e8e 548
549 # order by?
550 if ($order) {
26fe4d30 551 my ($order_sql, @order_bind) = $self->_order_by($order);
552 $sql .= $order_sql;
553 push @bind, @order_bind;
96449e8e 554 }
555
9d48860e 556 return wantarray ? ($sql, @bind) : $sql;
96449e8e 557}
558
79d310f2 559sub expand_expr {
54d3140f 560 my ($self, $expr, $default_scalar_to) = @_;
561 local our $Default_Scalar_To = $default_scalar_to if $default_scalar_to;
7d93797d 562 $self->_expand_expr($expr);
79d310f2 563}
564
565sub render_aqt {
566 my ($self, $aqt) = @_;
567 my ($k, $v, @rest) = %$aqt;
568 die "No" if @rest;
21225d32 569 if (my $meth = $self->{render}{$k}) {
79d310f2 570 return $self->$meth($v);
571 }
572 die "notreached: $k";
573}
574
6082a464 575sub render_expr {
576 my ($self, $expr) = @_;
577 $self->render_aqt($self->expand_expr($expr));
578}
579
a2cd381d 580sub _expand_expr {
3a10d914 581 my ($self, $expr) = @_;
3ae10d16 582 our $Expand_Depth ||= 0; local $Expand_Depth = $Expand_Depth + 1;
252518da 583 return undef unless defined($expr);
59588695 584 if (ref($expr) eq 'HASH') {
767b62e4 585 return undef unless my $kc = keys %$expr;
586 if ($kc > 1) {
d6ac0cfb 587 return $self->_expand_op_andor(-and => $expr);
59588695 588 }
767b62e4 589 my ($key, $value) = %$expr;
70f98e4b 590 if ($key =~ /^-/ and $key =~ s/ [_\s]? \d+ $//x ) {
591 belch 'Use of [and|or|nest]_N modifiers is deprecated and will be removed in SQLA v2.0. '
592 . "You probably wanted ...-and => [ $key => COND1, $key => COND2 ... ]";
593 }
767b62e4 594 if (my $exp = $self->{expand}{$key}) {
d1aabfe4 595 return $self->$exp($key, $value);
767b62e4 596 }
3a10d914 597 return $self->_expand_expr_hashpair($key, $value);
a2cd381d 598 }
08264f40 599 if (ref($expr) eq 'ARRAY') {
124b41ca 600 my $logic = '-'.lc($self->{logic});
d6ac0cfb 601 return $self->_expand_op_andor($logic, $expr);
08264f40 602 }
ca3da680 603 if (my $literal = is_literal_value($expr)) {
604 return +{ -literal => $literal };
605 }
99a65fa8 606 if (!ref($expr) or Scalar::Util::blessed($expr)) {
cd90d4f0 607 return $self->_expand_expr_scalar($expr);
252518da 608 }
252518da 609 die "notreached";
a2cd381d 610}
96449e8e 611
59588695 612sub _expand_expr_hashpair {
124b41ca 613 my ($self, $k, $v) = @_;
d13725da 614 unless (defined($k) and length($k)) {
2d64004f 615 if (defined($k) and my $literal = is_literal_value($v)) {
d13725da 616 belch 'Hash-pairs consisting of an empty string with a literal are deprecated, and will be removed in 2.0: use -and => [ $literal ] instead';
2d64004f 617 return { -literal => $literal };
d13725da 618 }
619 puke "Supplying an empty left hand side argument is not supported";
620 }
ef071fad 621 if ($k =~ /^-/) {
d0ae57ad 622 return $self->_expand_expr_hashpair_op($k, $v);
99a65fa8 623 }
1cc1e937 624 return $self->_expand_expr_hashpair_ident($k, $v);
625}
626
627sub _expand_expr_hashpair_ident {
628 my ($self, $k, $v) = @_;
710cdeed 629
cd90d4f0 630 local our $Cur_Col_Meta = $k;
631
2e670469 632 # hash with multiple or no elements is andor
633
634 if (ref($v) eq 'HASH' and keys %$v != 1) {
635 return $self->_expand_op_andor(-and => $v, $k);
636 }
637
710cdeed 638 # undef needs to be re-sent with cmp to achieve IS/IS NOT NULL
639
6d7a39b3 640 if (is_undef_value($v)) {
efcd97c3 641 return $self->_expand_expr_hashpair_cmp($k => undef);
99a65fa8 642 }
710cdeed 643
710cdeed 644 # scalars and objects get expanded as whatever requested or values
645
99a65fa8 646 if (!ref($v) or Scalar::Util::blessed($v)) {
cd90d4f0 647 return $self->_expand_expr_hashpair_scalar($k, $v);
99a65fa8 648 }
0cdafc4b 649
650 # single key hashref is a hashtriple
651
99a65fa8 652 if (ref($v) eq 'HASH') {
0b2789b3 653 return $self->_expand_expr_hashtriple($k, %$v);
99a65fa8 654 }
0cdafc4b 655
656 # arrayref needs re-engineering over the elements
657
99a65fa8 658 if (ref($v) eq 'ARRAY') {
e175845b 659 return $self->sqlfalse unless @$v;
99a65fa8 660 $self->_debug("ARRAY($k) means distribute over elements");
124b41ca 661 my $logic = lc(
70f98e4b 662 $v->[0] =~ /^-(and|or)$/i
663 ? shift(@{$v = [ @$v ]})
124b41ca 664 : '-'.lc($self->{logic} || 'OR')
99a65fa8 665 );
d6ac0cfb 666 return $self->_expand_op_andor(
6393fa8e 667 $logic => $v, $k
66e362e4 668 );
99a65fa8 669 }
0cdafc4b 670
99a65fa8 671 if (my $literal = is_literal_value($v)) {
672 unless (length $k) {
673 belch 'Hash-pairs consisting of an empty string with a literal are deprecated, and will be removed in 2.0: use -and => [ $literal ] instead';
674 return \$literal;
675 }
676 my ($sql, @bind) = @$literal;
677 if ($self->{bindtype} eq 'columns') {
678 for (@bind) {
6fb2bd90 679 $self->_assert_bindval_matches_bindtype($_);
aa8d7bdb 680 }
331e2209 681 }
99a65fa8 682 return +{ -literal => [ $self->_quote($k).' '.$sql, @bind ] };
331e2209 683 }
99a65fa8 684 die "notreached";
59588695 685}
686
cd90d4f0 687sub _expand_expr_scalar {
688 my ($self, $expr) = @_;
689
690 if (my $d = our $Default_Scalar_To) {
691 return $self->_expand_expr({ $d => $expr });
692 }
693 return $self->_expand_value(-value => $expr);
694}
695
696sub _expand_expr_hashpair_scalar {
697 my ($self, $k, $v) = @_;
698
699 return $self->_expand_expr_hashpair_cmp(
700 $k, $self->_expand_expr_scalar($v),
701 );
702}
703
d0ae57ad 704sub _expand_expr_hashpair_op {
705 my ($self, $k, $v) = @_;
710cdeed 706
315f078d 707 my $op = $k;
708 $op =~ s/^-// if length($op) > 1;
709 $self->_assert_pass_injection_guard($op);
710cdeed 710
711 # Ops prefixed with -not_ get converted
712
315f078d 713 if (my ($rest) = $op =~/^not[_ ](.*)$/) {
d0ae57ad 714 return +{ -op => [
715 'not',
716 $self->_expand_expr({ "-${rest}", $v })
315f078d 717 ] };
d0ae57ad 718 }
710cdeed 719
710cdeed 720
8e73de4b 721 { # Old SQLA compat
722
723 # the old special op system requires illegality for top-level use
724
725 if (
726 (our $Expand_Depth) == 1
727 and List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}}
728 ) {
729 puke "Illegal use of top-level '-$op'"
730 }
710cdeed 731
8e73de4b 732 # the old unary op system means we should touch nothing and let it work
710cdeed 733
8e73de4b 734 if (my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{unary_ops}}) {
735 return { -op => [ $op, $v ] };
736 }
d0ae57ad 737 }
710cdeed 738
739 # an explicit node type is currently assumed to be expanded (this is almost
740 # certainly wrong and there should be expansion anyway)
741
d0ae57ad 742 if ($self->{render}{$k}) {
743 return { $k => $v };
744 }
710cdeed 745
746 # hashref RHS values get expanded and used as op/func args
747
d0ae57ad 748 if (
749 ref($v) eq 'HASH'
750 and keys %$v == 1
751 and (keys %$v)[0] =~ /^-/
752 ) {
753 my ($func) = $k =~ /^-(.*)$/;
8e73de4b 754 { # Old SQLA compat
755 if (List::Util::first { $func =~ $_->{regex} } @{$self->{special_ops}}) {
756 return +{ -op => [ $func, $self->_expand_expr($v) ] };
757 }
d0ae57ad 758 }
759 return +{ -func => [ $func, $self->_expand_expr($v) ] };
760 }
710cdeed 761
762 # scalars and literals get simply expanded
763
d0ae57ad 764 if (!ref($v) or is_literal_value($v)) {
315f078d 765 return +{ -op => [ $op, $self->_expand_expr($v) ] };
d0ae57ad 766 }
710cdeed 767
d0ae57ad 768 die "notreached";
769}
770
efcd97c3 771sub _expand_expr_hashpair_cmp {
772 my ($self, $k, $v) = @_;
773 $self->_expand_expr_hashtriple($k, $self->{cmp}, $v);
774}
775
0b2789b3 776sub _expand_expr_hashtriple {
777 my ($self, $k, $vk, $vv) = @_;
778
779 my $ik = $self->_expand_ident(-ident => $k);
780
781 my $op = join ' ', split '_', (map lc, $vk =~ /^-?(.*)$/)[0];
782 $self->_assert_pass_injection_guard($op);
783 if ($op =~ s/ [_\s]? \d+ $//x ) {
784 return $self->_expand_expr($k, { $vk, $vv });
785 }
786 if (my $x = $self->{expand_op}{$op}) {
787 local our $Cur_Col_Meta = $k;
788 return $self->$x($op, $vv, $k);
789 }
8e73de4b 790 { # Old SQLA compat
791 if (my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}}) {
792 return { -op => [ $op, $ik, $vv ] };
793 }
794 if (my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{unary_ops}}) {
795 return { -op => [
796 $self->{cmp},
797 $ik,
798 { -op => [ $op, $vv ] }
799 ] };
800 }
0b2789b3 801 }
802 if (ref($vv) eq 'ARRAY') {
803 my @raw = @$vv;
804 my $logic = (defined($raw[0]) and $raw[0] =~ /^-(and|or)$/i)
805 ? shift @raw : '-or';
806 my @values = map +{ $vk => $_ }, @raw;
807 if (
808 $op =~ $self->{inequality_op}
809 or $op =~ $self->{not_like_op}
810 ) {
811 if (lc($logic) eq '-or' and @values > 1) {
812 belch "A multi-element arrayref as an argument to the inequality op '${\uc($op)}' "
813 . 'is technically equivalent to an always-true 1=1 (you probably wanted '
814 . "to say ...{ \$inequality_op => [ -and => \@values ] }... instead)"
815 ;
816 }
817 }
818 unless (@values) {
819 # try to DWIM on equality operators
a4009a84 820 return ($self->_dwim_op_to_is($op,
821 "Supplying an empty arrayref to '%s' is deprecated",
822 "operator '%s' applied on an empty array (field '$k')"
823 ) ? $self->sqlfalse : $self->sqltrue);
0b2789b3 824 }
825 return $self->_expand_op_andor($logic => \@values, $k);
826 }
6d7a39b3 827 if (is_undef_value($vv)) {
a4009a84 828 my $is = ($self->_dwim_op_to_is($op,
5f2c2f1e 829 "Supplying an undefined argument to '%s' is deprecated",
830 "unexpected operator '%s' with undef operand",
a4009a84 831 ) ? 'is' : 'is not');
0b2789b3 832
833 return $self->_expand_expr_hashpair($k => { $is, undef });
834 }
835 local our $Cur_Col_Meta = $k;
836 return +{ -op => [
837 $op,
838 $ik,
839 $self->_expand_expr($vv)
840 ] };
841}
842
5f2c2f1e 843sub _dwim_op_to_is {
844 my ($self, $op, $empty, $fail) = @_;
845 if ($op =~ /^not$/i) {
a4009a84 846 return 0;
5f2c2f1e 847 }
848 if ($op =~ $self->{equality_op}) {
a4009a84 849 return 1;
5f2c2f1e 850 }
851 if ($op =~ $self->{like_op}) {
852 belch(sprintf $empty, uc($op));
a4009a84 853 return 1;
5f2c2f1e 854 }
855 if ($op =~ $self->{inequality_op}) {
a4009a84 856 return 0;
5f2c2f1e 857 }
858 if ($op =~ $self->{not_like_op}) {
859 belch(sprintf $empty, uc($op));
a4009a84 860 return 0;
5f2c2f1e 861 }
862 puke(sprintf $fail, $op);
863}
864
9103bd14 865sub _expand_ident {
83de255f 866 my ($self, $op, $body) = @_;
867 unless (defined($body) or (ref($body) and ref($body) eq 'ARRAY')) {
868 puke "$op requires a single plain scalar argument (a quotable identifier) or an arrayref of identifier parts";
869 }
9103bd14 870 my @parts = map split(/\Q${\($self->{name_sep}||'.')}\E/, $_),
871 ref($body) ? @$body : $body;
944f2c7b 872 return { -ident => $parts[-1] } if $self->{_dequalify_idents};
873 unless ($self->{quote_char}) {
874 $self->_assert_pass_injection_guard($_) for @parts;
875 }
9103bd14 876 return +{ -ident => \@parts };
877}
878
71f1364b 879sub _expand_value {
880 +{ -bind => [ our $Cur_Col_Meta, $_[2] ] };
881}
882
2a238661 883sub _expand_not {
884 +{ -op => [ 'not', $_[0]->_expand_expr($_[2]) ] };
885}
886
05d37f9c 887sub _expand_bool {
888 my ($self, undef, $v) = @_;
889 if (ref($v)) {
890 return $self->_expand_expr($v);
891 }
892 puke "-bool => undef not supported" unless defined($v);
893 return $self->_expand_ident(-ident => $v);
894}
895
d6ac0cfb 896sub _expand_op_andor {
9194eb8f 897 my ($self, $logic, $v, $k) = @_;
898 if (defined $k) {
5ce9d71b 899 $v = [ map +{ $k, $_ },
900 (ref($v) eq 'HASH')
901 ? (map +{ $_ => $v->{$_} }, sort keys %$v)
902 : @$v,
903 ];
9194eb8f 904 }
905 my ($logop) = $logic =~ /^-?(.*)$/;
70f98e4b 906 if (ref($v) eq 'HASH') {
2e670469 907 return undef unless keys %$v;
70f98e4b 908 return +{ -op => [
124b41ca 909 $logop,
0a8de350 910 map $self->_expand_expr({ $_ => $v->{$_} }),
70f98e4b 911 sort keys %$v
912 ] };
913 }
914 if (ref($v) eq 'ARRAY') {
124b41ca 915 $logop eq 'and' or $logop eq 'or' or puke "unknown logic: $logop";
70f98e4b 916
917 my @expr = grep {
918 (ref($_) eq 'ARRAY' and @$_)
919 or (ref($_) eq 'HASH' and %$_)
920 or 1
921 } @$v;
922
923 my @res;
924
925 while (my ($el) = splice @expr, 0, 1) {
926 puke "Supplying an empty left hand side argument is not supported in array-pairs"
927 unless defined($el) and length($el);
928 my $elref = ref($el);
929 if (!$elref) {
930 local our $Expand_Depth = 0;
931 push(@res, grep defined, $self->_expand_expr({ $el, shift(@expr) }));
932 } elsif ($elref eq 'ARRAY') {
933 push(@res, grep defined, $self->_expand_expr($el)) if @$el;
934 } elsif (my $l = is_literal_value($el)) {
935 push @res, { -literal => $l };
936 } elsif ($elref eq 'HASH') {
937 local our $Expand_Depth = 0;
938 push @res, grep defined, $self->_expand_expr($el) if %$el;
939 } else {
940 die "notreached";
941 }
942 }
943 # ???
944 # return $res[0] if @res == 1;
124b41ca 945 return { -op => [ $logop, @res ] };
70f98e4b 946 }
947 die "notreached";
948}
949
f49b02a0 950sub _expand_op_is {
951 my ($self, $op, $vv, $k) = @_;
952 puke "$op can only take undef as argument"
953 if defined($vv)
954 and not (
955 ref($vv) eq 'HASH'
956 and exists($vv->{-value})
957 and !defined($vv->{-value})
958 );
959 return +{ -op => [ $op.' null', $self->_expand_ident(-ident => $k) ] };
960}
961
143f50df 962sub _expand_between {
963 my ($self, $op, $vv, $k) = @_;
964 local our $Cur_Col_Meta = $k;
965 my @rhs = map $self->_expand_expr($_),
966 ref($vv) eq 'ARRAY' ? @$vv : $vv;
967 unless (
968 (@rhs == 1 and ref($rhs[0]) eq 'HASH' and $rhs[0]->{-literal})
969 or
970 (@rhs == 2 and defined($rhs[0]) and defined($rhs[1]))
971 ) {
972 puke "Operator '${\uc($op)}' requires either an arrayref with two defined values or expressions, or a single literal scalarref/arrayref-ref";
973 }
974 return +{ -op => [
975 $op,
976 $self->_expand_ident(-ident => $k),
977 @rhs
978 ] }
979}
980
416026a9 981sub _expand_in {
982 my ($self, $op, $vv, $k) = @_;
983 if (my $literal = is_literal_value($vv)) {
984 my ($sql, @bind) = @$literal;
985 my $opened_sql = $self->_open_outer_paren($sql);
986 return +{ -op => [
987 $op, $self->_expand_ident(-ident => $k),
988 [ { -literal => [ $opened_sql, @bind ] } ]
989 ] };
990 }
991 my $undef_err =
992 'SQL::Abstract before v1.75 used to generate incorrect SQL when the '
993 . "-${\uc($op)} operator was given an undef-containing list: !!!AUDIT YOUR CODE "
994 . 'AND DATA!!! (the upcoming Data::Query-based version of SQL::Abstract '
995 . 'will emit the logically correct SQL instead of raising this exception)'
996 ;
997 puke("Argument passed to the '${\uc($op)}' operator can not be undefined")
998 if !defined($vv);
999 my @rhs = map $self->_expand_expr($_),
1000 map { ref($_) ? $_ : { -bind => [ $k, $_ ] } }
1001 map { defined($_) ? $_: puke($undef_err) }
1002 (ref($vv) eq 'ARRAY' ? @$vv : $vv);
1003 return $self->${\($op =~ /^not/ ? 'sqltrue' : 'sqlfalse')} unless @rhs;
1004
1005 return +{ -op => [
1006 $op,
1007 $self->_expand_ident(-ident => $k),
1008 \@rhs
1009 ] };
1010}
1011
5c633220 1012sub _expand_nest {
1013 my ($self, $op, $v) = @_;
1014 # DBIx::Class requires a nest warning to be emitted once but the private
1015 # method it overrode to do so no longer exists
1016 if ($self->{is_dbic_sqlmaker}) {
1017 unless (our $Nest_Warned) {
1018 belch(
1019 "-nest in search conditions is deprecated, you most probably wanted:\n"
1020 .q|{..., -and => [ \%cond0, \@cond1, \'cond2', \[ 'cond3', [ col => bind ] ], etc. ], ... }|
1021 );
1022 $Nest_Warned = 1;
1023 }
1024 }
1025 return $self->_expand_expr($v);
1026}
1027
96449e8e 1028sub _recurse_where {
1029 my ($self, $where, $logic) = @_;
1030
5492d4c2 1031 # Special case: top level simple string treated as literal
1032
1033 my $where_exp = (ref($where)
ae56a156 1034 ? $self->_expand_expr($where, $logic)
5492d4c2 1035 : { -literal => [ $where ] });
e175845b 1036
e3e27543 1037 # dispatch expanded expression
311b2151 1038
79d310f2 1039 my ($sql, @bind) = defined($where_exp) ? $self->render_aqt($where_exp) : (undef);
abe1a491 1040 # DBIx::Class used to call _recurse_where in scalar context
1041 # something else might too...
1042 if (wantarray) {
1043 return ($sql, @bind);
1044 }
1045 else {
1046 belch "Calling _recurse_where in scalar context is deprecated and will go away before 2.0";
1047 return $sql;
1048 }
96449e8e 1049}
1050
181dcebf 1051sub _render_ident {
1052 my ($self, $ident) = @_;
cc422895 1053
9cf28dfb 1054 return $self->_convert($self->_quote($ident));
cc422895 1055}
1056
ca158918 1057sub _render_list {
1058 my ($self, $list) = @_;
1059 my @parts = grep length($_->[0]), map [ $self->render_aqt($_) ], @$list;
1060 return join(', ', map $_->[0], @parts), map @{$_}[1..$#$_], @parts;
1061}
1062
1063sub _render_func {
1064 my ($self, $rest) = @_;
1065 my ($func, @args) = @$rest;
1066 my @arg_sql;
1067 my @bind = map {
1068 my @x = @$_;
1069 push @arg_sql, shift @x;
1070 @x
1071 } map [ $self->render_aqt($_) ], @args;
1072 return ($self->_sqlcase($func).'('.join(', ', @arg_sql).')', @bind);
1073}
d13725da 1074
ca158918 1075sub _render_bind {
1076 my ($self, $bind) = @_;
1077 return ($self->_convert('?'), $self->_bindtype(@$bind));
1078}
1079
1080sub _render_literal {
1081 my ($self, $literal) = @_;
1082 $self->_assert_bindval_matches_bindtype(@{$literal}[1..$#$literal]);
1083 return @$literal;
1084}
1085
5305e436 1086sub _render_op {
1087 my ($self, $v) = @_;
1088 my ($op, @args) = @$v;
1089 if (my $r = $self->{render_op}{$op}) {
1090 return $self->$r($op, \@args);
1091 }
1092
1093 { # Old SQLA compat
1094
1095 my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}};
1096 if ($us and @args > 1) {
1097 puke "Special op '${op}' requires first value to be identifier"
1098 unless my ($ident) = map $_->{-ident}, grep ref($_) eq 'HASH', $args[0];
1099 my $k = join(($self->{name_sep}||'.'), @$ident);
1100 local our $Expand_Depth = 1;
1101 return $self->${\($us->{handler})}($k, $op, $args[1]);
1102 }
1103 if (my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{unary_ops}}) {
1104 return $self->${\($us->{handler})}($op, $args[0]);
1105 }
1106
1107 }
1108 if (@args == 1) {
1109 return $self->_render_unop_prefix($op, \@args);
1110 } else {
1111 return $self->_render_op_multop($op, \@args);
1112 }
1113 die "notreached";
1114}
1115
1116
e748969f 1117sub _render_op_between {
1118 my ($self, $op, $args) = @_;
1119 my ($left, $low, $high) = @$args;
1120 my ($rhsql, @rhbind) = do {
1121 if (@$args == 2) {
1122 puke "Single arg to between must be a literal"
1123 unless $low->{-literal};
1124 @{$low->{-literal}}
1125 } else {
1126 my ($l, $h) = map [ $self->render_aqt($_) ], $low, $high;
1127 (join(' ', $l->[0], $self->_sqlcase('and'), $h->[0]),
1128 @{$l}[1..$#$l], @{$h}[1..$#$h])
1129 }
1130 };
1131 my ($lhsql, @lhbind) = $self->render_aqt($left);
1132 return (
1133 join(' ', '(', $lhsql, $self->_sqlcase($op), $rhsql, ')'),
1134 @lhbind, @rhbind
1135 );
1136}
1137
7dda9b27 1138sub _render_op_in {
1139 my ($self, $op, $args) = @_;
1140 my ($lhs, $rhs) = @$args;
1141 my @in_bind;
1142 my @in_sql = map {
1143 my ($sql, @bind) = $self->render_aqt($_);
1144 push @in_bind, @bind;
1145 $sql;
1146 } @$rhs;
1147 my ($lhsql, @lbind) = $self->render_aqt($lhs);
1148 return (
1149 $lhsql.' '.$self->_sqlcase($op).' ( '
1150 .join(', ', @in_sql)
1151 .' )',
1152 @lbind, @in_bind
1153 );
1154}
1155
5edafff8 1156sub _render_op_andor {
1157 my ($self, $op, $args) = @_;
1158 my @parts = grep length($_->[0]), map [ $self->render_aqt($_) ], @$args;
1159 return '' unless @parts;
1160 return @{$parts[0]} if @parts == 1;
3f51d831 1161 my ($sql, @bind) = $self->_render_op_multop($op, $args);
1162 return '( '.$sql.' )', @bind;
1163}
1164
1165sub _render_op_multop {
1166 my ($self, $op, $args) = @_;
1167 my @parts = grep length($_->[0]), map [ $self->render_aqt($_) ], @$args;
1168 return '' unless @parts;
1169 return @{$parts[0]} if @parts == 1;
5edafff8 1170 my ($final_sql) = join(
1171 ' '.$self->_sqlcase($op).' ',
1172 map $_->[0], @parts
1173 );
1174 return (
3f51d831 1175 $final_sql,
5edafff8 1176 map @{$_}[1..$#$_], @parts
1177 );
1178}
2ddaa002 1179sub _render_op_not {
1180 my ($self, $op, $v) = @_;
1181 my ($sql, @bind) = $self->_render_unop_prefix($op, $v);
1182 return "(${sql})", @bind;
1183}
1184
1185sub _render_unop_prefix {
1186 my ($self, $op, $v) = @_;
1187 my ($expr_sql, @bind) = $self->render_aqt($v->[0]);
1188 my $op_sql = $self->_sqlcase($op);
1189 return ("${op_sql} ${expr_sql}", @bind);
1190}
1191
b23fd5ff 1192sub _render_unop_postfix {
1193 my ($self, $op, $v) = @_;
715b4e6a 1194 my ($expr_sql, @bind) = $self->render_aqt($v->[0]);
b23fd5ff 1195 my $op_sql = $self->_sqlcase($op);
1196 return ($expr_sql.' '.$op_sql, @bind);
1197}
1198
4a1f01a3 1199# Some databases (SQLite) treat col IN (1, 2) different from
1200# col IN ( (1, 2) ). Use this to strip all outer parens while
1201# adding them back in the corresponding method
1202sub _open_outer_paren {
1203 my ($self, $sql) = @_;
a5f91feb 1204
ca4f826a 1205 while (my ($inner) = $sql =~ /^ \s* \( (.*) \) \s* $/xs) {
a5f91feb 1206
1207 # there are closing parens inside, need the heavy duty machinery
1208 # to reevaluate the extraction starting from $sql (full reevaluation)
ca4f826a 1209 if ($inner =~ /\)/) {
a5f91feb 1210 require Text::Balanced;
1211
1212 my (undef, $remainder) = do {
1213 # idiotic design - writes to $@ but *DOES NOT* throw exceptions
1214 local $@;
ca4f826a 1215 Text::Balanced::extract_bracketed($sql, '()', qr/\s*/);
a5f91feb 1216 };
1217
1218 # the entire expression needs to be a balanced bracketed thing
1219 # (after an extract no remainder sans trailing space)
1220 last if defined $remainder and $remainder =~ /\S/;
1221 }
1222
1223 $sql = $inner;
1224 }
1225
1226 $sql;
4a1f01a3 1227}
1228
96449e8e 1229
96449e8e 1230#======================================================================
1231# ORDER BY
1232#======================================================================
1233
33177570 1234sub _expand_order_by {
96449e8e 1235 my ($self, $arg) = @_;
1236
33177570 1237 return unless defined($arg) and not (ref($arg) eq 'ARRAY' and !@$arg);
2b6158af 1238
4325df6a 1239 my $expander = sub {
1240 my ($self, $dir, $expr) = @_;
52ca537e 1241 my @to_expand = ref($expr) eq 'ARRAY' ? @$expr : $expr;
1242 foreach my $arg (@to_expand) {
1243 if (
1244 ref($arg) eq 'HASH'
1245 and keys %$arg > 1
1246 and grep /^-(asc|desc)$/, keys %$arg
1247 ) {
1248 puke "ordering direction hash passed to order by must have exactly one key (-asc or -desc)";
1249 }
1250 }
7384c311 1251 my @exp = map +(
1252 defined($dir) ? { -op => [ $dir =~ /^-?(.*)$/ ,=> $_ ] } : $_
1253 ),
79d310f2 1254 map $self->expand_expr($_, -ident),
74156ee9 1255 map ref($_) eq 'ARRAY' ? @$_ : $_, @to_expand;
352d74bc 1256 return (@exp > 1 ? { -list => \@exp } : $exp[0]);
4325df6a 1257 };
18c743c8 1258
7384c311 1259 local @{$self->{expand}}{qw(-asc -desc)} = (($expander) x 2);
f267b646 1260
33177570 1261 return $self->$expander(undef, $arg);
1262}
1263
1264sub _order_by {
1265 my ($self, $arg) = @_;
1266
1267 return '' unless defined(my $expanded = $self->_expand_order_by($arg));
4325df6a 1268
79d310f2 1269 my ($sql, @bind) = $self->render_aqt($expanded);
4325df6a 1270
13cd9220 1271 return '' unless length($sql);
1272
4325df6a 1273 my $final_sql = $self->_sqlcase(' order by ').$sql;
1274
1275 return wantarray ? ($final_sql, @bind) : $final_sql;
f267b646 1276}
1277
2e3cc357 1278# _order_by no longer needs to call this so doesn't but DBIC uses it.
1279
33177570 1280sub _order_by_chunks {
1281 my ($self, $arg) = @_;
1282
1283 return () unless defined(my $expanded = $self->_expand_order_by($arg));
1284
2e3cc357 1285 return $self->_chunkify_order_by($expanded);
1286}
1287
1288sub _chunkify_order_by {
1289 my ($self, $expanded) = @_;
1b630cfe 1290
79d310f2 1291 return grep length, $self->render_aqt($expanded)
1b630cfe 1292 if $expanded->{-ident} or @{$expanded->{-literal}||[]} == 1;
1293
33177570 1294 for ($expanded) {
352d74bc 1295 if (ref() eq 'HASH' and my $l = $_->{-list}) {
1296 return map $self->_chunkify_order_by($_), @$l;
33177570 1297 }
79d310f2 1298 return [ $self->render_aqt($_) ];
33177570 1299 }
1300}
1301
96449e8e 1302#======================================================================
1303# DATASOURCE (FOR NOW, JUST PLAIN TABLE OR LIST OF TABLES)
1304#======================================================================
1305
1306sub _table {
1307 my $self = shift;
1308 my $from = shift;
79d310f2 1309 ($self->render_aqt(
8476c6a3 1310 $self->_expand_maybe_list_expr($from, undef, -ident)
7ad12721 1311 ))[0];
96449e8e 1312}
1313
1314
1315#======================================================================
1316# UTILITY FUNCTIONS
1317#======================================================================
1318
8476c6a3 1319sub _expand_maybe_list_expr {
1320 my ($self, $expr, $logic, $default) = @_;
bba04f52 1321 my $e = do {
1322 if (ref($expr) eq 'ARRAY') {
352d74bc 1323 return { -list => [
4ee3313d 1324 map $self->expand_expr($_, $default), @$expr
bba04f52 1325 ] } if @$expr > 1;
1326 $expr->[0]
1327 } else {
1328 $expr
1329 }
1330 };
4ee3313d 1331 return $self->expand_expr($e, $default);
8476c6a3 1332}
1333
955e77ca 1334# highly optimized, as it's called way too often
96449e8e 1335sub _quote {
955e77ca 1336 # my ($self, $label) = @_;
96449e8e 1337
955e77ca 1338 return '' unless defined $_[1];
955e77ca 1339 return ${$_[1]} if ref($_[1]) eq 'SCALAR';
d3162b5c 1340 puke 'Identifier cannot be hashref' if ref($_[1]) eq 'HASH';
96449e8e 1341
d3162b5c 1342 unless ($_[0]->{quote_char}) {
1343 if (ref($_[1]) eq 'ARRAY') {
1344 return join($_[0]->{name_sep}||'.', @{$_[1]});
1345 } else {
1346 $_[0]->_assert_pass_injection_guard($_[1]);
1347 return $_[1];
1348 }
1349 }
96449e8e 1350
07d7c35c 1351 my $qref = ref $_[0]->{quote_char};
439834d3 1352 my ($l, $r) =
1353 !$qref ? ($_[0]->{quote_char}, $_[0]->{quote_char})
1354 : ($qref eq 'ARRAY') ? @{$_[0]->{quote_char}}
1355 : puke "Unsupported quote_char format: $_[0]->{quote_char}";
1356
46be4313 1357 my $esc = $_[0]->{escape_char} || $r;
96449e8e 1358
07d7c35c 1359 # parts containing * are naturally unquoted
d3162b5c 1360 return join(
1361 $_[0]->{name_sep}||'',
1362 map +(
1363 $_ eq '*'
1364 ? $_
1365 : do { (my $n = $_) =~ s/(\Q$esc\E|\Q$r\E)/$esc$1/g; $l . $n . $r }
1366 ),
1367 (ref($_[1]) eq 'ARRAY'
1368 ? @{$_[1]}
1369 : (
1370 $_[0]->{name_sep}
1371 ? split (/\Q$_[0]->{name_sep}\E/, $_[1] )
1372 : $_[1]
1373 )
1374 )
955e77ca 1375 );
96449e8e 1376}
1377
1378
1379# Conversion, if applicable
d7c862e0 1380sub _convert {
07d7c35c 1381 #my ($self, $arg) = @_;
7ad12721 1382 if ($_[0]->{convert_where}) {
1383 return $_[0]->_sqlcase($_[0]->{convert_where}) .'(' . $_[1] . ')';
96449e8e 1384 }
07d7c35c 1385 return $_[1];
96449e8e 1386}
1387
1388# And bindtype
d7c862e0 1389sub _bindtype {
07d7c35c 1390 #my ($self, $col, @vals) = @_;
07d7c35c 1391 # called often - tighten code
1392 return $_[0]->{bindtype} eq 'columns'
1393 ? map {[$_[1], $_]} @_[2 .. $#_]
1394 : @_[2 .. $#_]
1395 ;
96449e8e 1396}
1397
fe3ae272 1398# Dies if any element of @bind is not in [colname => value] format
1399# if bindtype is 'columns'.
1400sub _assert_bindval_matches_bindtype {
c94a6c93 1401# my ($self, @bind) = @_;
1402 my $self = shift;
fe3ae272 1403 if ($self->{bindtype} eq 'columns') {
c94a6c93 1404 for (@_) {
1405 if (!defined $_ || ref($_) ne 'ARRAY' || @$_ != 2) {
3a06278c 1406 puke "bindtype 'columns' selected, you need to pass: [column_name => bind_value]"
fe3ae272 1407 }
1408 }
1409 }
1410}
1411
96449e8e 1412sub _join_sql_clauses {
1413 my ($self, $logic, $clauses_aref, $bind_aref) = @_;
1414
1415 if (@$clauses_aref > 1) {
1416 my $join = " " . $self->_sqlcase($logic) . " ";
1417 my $sql = '( ' . join($join, @$clauses_aref) . ' )';
1418 return ($sql, @$bind_aref);
1419 }
1420 elsif (@$clauses_aref) {
1421 return ($clauses_aref->[0], @$bind_aref); # no parentheses
1422 }
1423 else {
1424 return (); # if no SQL, ignore @$bind_aref
1425 }
1426}
1427
1428
1429# Fix SQL case, if so requested
1430sub _sqlcase {
96449e8e 1431 # LDNOTE: if $self->{case} is true, then it contains 'lower', so we
1432 # don't touch the argument ... crooked logic, but let's not change it!
07d7c35c 1433 return $_[0]->{case} ? $_[1] : uc($_[1]);
96449e8e 1434}
1435
1436
1437#======================================================================
1438# DISPATCHING FROM REFKIND
1439#======================================================================
1440
1441sub _refkind {
1442 my ($self, $data) = @_;
96449e8e 1443
955e77ca 1444 return 'UNDEF' unless defined $data;
1445
1446 # blessed objects are treated like scalars
1447 my $ref = (Scalar::Util::blessed $data) ? '' : ref $data;
1448
1449 return 'SCALAR' unless $ref;
1450
1451 my $n_steps = 1;
1452 while ($ref eq 'REF') {
96449e8e 1453 $data = $$data;
955e77ca 1454 $ref = (Scalar::Util::blessed $data) ? '' : ref $data;
1455 $n_steps++ if $ref;
96449e8e 1456 }
1457
848556bc 1458 return ($ref||'SCALAR') . ('REF' x $n_steps);
96449e8e 1459}
1460
1461sub _try_refkind {
1462 my ($self, $data) = @_;
1463 my @try = ($self->_refkind($data));
1464 push @try, 'SCALAR_or_UNDEF' if $try[0] eq 'SCALAR' || $try[0] eq 'UNDEF';
1465 push @try, 'FALLBACK';
955e77ca 1466 return \@try;
96449e8e 1467}
1468
1469sub _METHOD_FOR_refkind {
1470 my ($self, $meth_prefix, $data) = @_;
f39eaa60 1471
1472 my $method;
955e77ca 1473 for (@{$self->_try_refkind($data)}) {
f39eaa60 1474 $method = $self->can($meth_prefix."_".$_)
1475 and last;
1476 }
1477
1478 return $method || puke "cannot dispatch on '$meth_prefix' for ".$self->_refkind($data);
96449e8e 1479}
1480
1481
1482sub _SWITCH_refkind {
1483 my ($self, $data, $dispatch_table) = @_;
1484
f39eaa60 1485 my $coderef;
955e77ca 1486 for (@{$self->_try_refkind($data)}) {
f39eaa60 1487 $coderef = $dispatch_table->{$_}
1488 and last;
1489 }
1490
1491 puke "no dispatch entry for ".$self->_refkind($data)
1492 unless $coderef;
1493
96449e8e 1494 $coderef->();
1495}
1496
1497
1498
1499
1500#======================================================================
1501# VALUES, GENERATE, AUTOLOAD
1502#======================================================================
1503
1504# LDNOTE: original code from nwiger, didn't touch code in that section
1505# I feel the AUTOLOAD stuff should not be the default, it should
1506# only be activated on explicit demand by user.
1507
1508sub values {
1509 my $self = shift;
1510 my $data = shift || return;
1511 puke "Argument to ", __PACKAGE__, "->values must be a \\%hash"
1512 unless ref $data eq 'HASH';
bab725ce 1513
1514 my @all_bind;
ca4f826a 1515 foreach my $k (sort keys %$data) {
bab725ce 1516 my $v = $data->{$k};
1517 $self->_SWITCH_refkind($v, {
9d48860e 1518 ARRAYREF => sub {
bab725ce 1519 if ($self->{array_datatypes}) { # array datatype
1520 push @all_bind, $self->_bindtype($k, $v);
1521 }
1522 else { # literal SQL with bind
1523 my ($sql, @bind) = @$v;
1524 $self->_assert_bindval_matches_bindtype(@bind);
1525 push @all_bind, @bind;
1526 }
1527 },
1528 ARRAYREFREF => sub { # literal SQL with bind
1529 my ($sql, @bind) = @${$v};
1530 $self->_assert_bindval_matches_bindtype(@bind);
1531 push @all_bind, @bind;
1532 },
1533 SCALARREF => sub { # literal SQL without bind
1534 },
1535 SCALAR_or_UNDEF => sub {
1536 push @all_bind, $self->_bindtype($k, $v);
1537 },
1538 });
1539 }
1540
1541 return @all_bind;
96449e8e 1542}
1543
1544sub generate {
1545 my $self = shift;
1546
1547 my(@sql, @sqlq, @sqlv);
1548
1549 for (@_) {
1550 my $ref = ref $_;
1551 if ($ref eq 'HASH') {
1552 for my $k (sort keys %$_) {
1553 my $v = $_->{$k};
1554 my $r = ref $v;
1555 my $label = $self->_quote($k);
1556 if ($r eq 'ARRAY') {
fe3ae272 1557 # literal SQL with bind
1558 my ($sql, @bind) = @$v;
1559 $self->_assert_bindval_matches_bindtype(@bind);
96449e8e 1560 push @sqlq, "$label = $sql";
fe3ae272 1561 push @sqlv, @bind;
96449e8e 1562 } elsif ($r eq 'SCALAR') {
fe3ae272 1563 # literal SQL without bind
96449e8e 1564 push @sqlq, "$label = $$v";
9d48860e 1565 } else {
96449e8e 1566 push @sqlq, "$label = ?";
1567 push @sqlv, $self->_bindtype($k, $v);
1568 }
1569 }
1570 push @sql, $self->_sqlcase('set'), join ', ', @sqlq;
1571 } elsif ($ref eq 'ARRAY') {
1572 # unlike insert(), assume these are ONLY the column names, i.e. for SQL
1573 for my $v (@$_) {
1574 my $r = ref $v;
fe3ae272 1575 if ($r eq 'ARRAY') { # literal SQL with bind
1576 my ($sql, @bind) = @$v;
1577 $self->_assert_bindval_matches_bindtype(@bind);
1578 push @sqlq, $sql;
1579 push @sqlv, @bind;
1580 } elsif ($r eq 'SCALAR') { # literal SQL without bind
96449e8e 1581 # embedded literal SQL
1582 push @sqlq, $$v;
9d48860e 1583 } else {
96449e8e 1584 push @sqlq, '?';
1585 push @sqlv, $v;
1586 }
1587 }
1588 push @sql, '(' . join(', ', @sqlq) . ')';
1589 } elsif ($ref eq 'SCALAR') {
1590 # literal SQL
1591 push @sql, $$_;
1592 } else {
1593 # strings get case twiddled
1594 push @sql, $self->_sqlcase($_);
1595 }
1596 }
1597
1598 my $sql = join ' ', @sql;
1599
1600 # this is pretty tricky
1601 # if ask for an array, return ($stmt, @bind)
1602 # otherwise, s/?/shift @sqlv/ to put it inline
1603 if (wantarray) {
1604 return ($sql, @sqlv);
1605 } else {
1606 1 while $sql =~ s/\?/my $d = shift(@sqlv);
1607 ref $d ? $d->[1] : $d/e;
1608 return $sql;
1609 }
1610}
1611
1612
1613sub DESTROY { 1 }
1614
1615sub AUTOLOAD {
1616 # This allows us to check for a local, then _form, attr
1617 my $self = shift;
1618 my($name) = $AUTOLOAD =~ /.*::(.+)/;
1619 return $self->generate($name, @_);
1620}
1621
16221;
1623
1624
1625
1626__END__
32eab2da 1627
1628=head1 NAME
1629
1630SQL::Abstract - Generate SQL from Perl data structures
1631
1632=head1 SYNOPSIS
1633
1634 use SQL::Abstract;
1635
1636 my $sql = SQL::Abstract->new;
1637
85783f3c 1638 my($stmt, @bind) = $sql->select($source, \@fields, \%where, $order);
32eab2da 1639
1640 my($stmt, @bind) = $sql->insert($table, \%fieldvals || \@values);
1641
1642 my($stmt, @bind) = $sql->update($table, \%fieldvals, \%where);
1643
1644 my($stmt, @bind) = $sql->delete($table, \%where);
1645
1646 # Then, use these in your DBI statements
1647 my $sth = $dbh->prepare($stmt);
1648 $sth->execute(@bind);
1649
1650 # Just generate the WHERE clause
85783f3c 1651 my($stmt, @bind) = $sql->where(\%where, $order);
32eab2da 1652
1653 # Return values in the same order, for hashed queries
1654 # See PERFORMANCE section for more details
1655 my @bind = $sql->values(\%fieldvals);
1656
1657=head1 DESCRIPTION
1658
1659This module was inspired by the excellent L<DBIx::Abstract>.
1660However, in using that module I found that what I really wanted
1661to do was generate SQL, but still retain complete control over my
1662statement handles and use the DBI interface. So, I set out to
1663create an abstract SQL generation module.
1664
1665While based on the concepts used by L<DBIx::Abstract>, there are
1666several important differences, especially when it comes to WHERE
1667clauses. I have modified the concepts used to make the SQL easier
1668to generate from Perl data structures and, IMO, more intuitive.
1669The underlying idea is for this module to do what you mean, based
1670on the data structures you provide it. The big advantage is that
1671you don't have to modify your code every time your data changes,
1672as this module figures it out.
1673
1674To begin with, an SQL INSERT is as easy as just specifying a hash
1675of C<key=value> pairs:
1676
1677 my %data = (
1678 name => 'Jimbo Bobson',
1679 phone => '123-456-7890',
1680 address => '42 Sister Lane',
1681 city => 'St. Louis',
1682 state => 'Louisiana',
1683 );
1684
1685The SQL can then be generated with this:
1686
1687 my($stmt, @bind) = $sql->insert('people', \%data);
1688
1689Which would give you something like this:
1690
1691 $stmt = "INSERT INTO people
1692 (address, city, name, phone, state)
1693 VALUES (?, ?, ?, ?, ?)";
1694 @bind = ('42 Sister Lane', 'St. Louis', 'Jimbo Bobson',
1695 '123-456-7890', 'Louisiana');
1696
1697These are then used directly in your DBI code:
1698
1699 my $sth = $dbh->prepare($stmt);
1700 $sth->execute(@bind);
1701
96449e8e 1702=head2 Inserting and Updating Arrays
1703
1704If your database has array types (like for example Postgres),
1705activate the special option C<< array_datatypes => 1 >>
9d48860e 1706when creating the C<SQL::Abstract> object.
96449e8e 1707Then you may use an arrayref to insert and update database array types:
1708
1709 my $sql = SQL::Abstract->new(array_datatypes => 1);
1710 my %data = (
1711 planets => [qw/Mercury Venus Earth Mars/]
1712 );
9d48860e 1713
96449e8e 1714 my($stmt, @bind) = $sql->insert('solar_system', \%data);
1715
1716This results in:
1717
1718 $stmt = "INSERT INTO solar_system (planets) VALUES (?)"
1719
1720 @bind = (['Mercury', 'Venus', 'Earth', 'Mars']);
1721
1722
1723=head2 Inserting and Updating SQL
1724
1725In order to apply SQL functions to elements of your C<%data> you may
1726specify a reference to an arrayref for the given hash value. For example,
1727if you need to execute the Oracle C<to_date> function on a value, you can
1728say something like this:
32eab2da 1729
1730 my %data = (
1731 name => 'Bill',
3ae1c5e2 1732 date_entered => \[ "to_date(?,'MM/DD/YYYY')", "03/02/2003" ],
9d48860e 1733 );
32eab2da 1734
1735The first value in the array is the actual SQL. Any other values are
1736optional and would be included in the bind values array. This gives
1737you:
1738
1739 my($stmt, @bind) = $sql->insert('people', \%data);
1740
9d48860e 1741 $stmt = "INSERT INTO people (name, date_entered)
32eab2da 1742 VALUES (?, to_date(?,'MM/DD/YYYY'))";
1743 @bind = ('Bill', '03/02/2003');
1744
1745An UPDATE is just as easy, all you change is the name of the function:
1746
1747 my($stmt, @bind) = $sql->update('people', \%data);
1748
1749Notice that your C<%data> isn't touched; the module will generate
1750the appropriately quirky SQL for you automatically. Usually you'll
1751want to specify a WHERE clause for your UPDATE, though, which is
1752where handling C<%where> hashes comes in handy...
1753
96449e8e 1754=head2 Complex where statements
1755
32eab2da 1756This module can generate pretty complicated WHERE statements
1757easily. For example, simple C<key=value> pairs are taken to mean
1758equality, and if you want to see if a field is within a set
1759of values, you can use an arrayref. Let's say we wanted to
1760SELECT some data based on this criteria:
1761
1762 my %where = (
1763 requestor => 'inna',
1764 worker => ['nwiger', 'rcwe', 'sfz'],
1765 status => { '!=', 'completed' }
1766 );
1767
1768 my($stmt, @bind) = $sql->select('tickets', '*', \%where);
1769
1770The above would give you something like this:
1771
1772 $stmt = "SELECT * FROM tickets WHERE
1773 ( requestor = ? ) AND ( status != ? )
1774 AND ( worker = ? OR worker = ? OR worker = ? )";
1775 @bind = ('inna', 'completed', 'nwiger', 'rcwe', 'sfz');
1776
1777Which you could then use in DBI code like so:
1778
1779 my $sth = $dbh->prepare($stmt);
1780 $sth->execute(@bind);
1781
1782Easy, eh?
1783
0da0fe34 1784=head1 METHODS
32eab2da 1785
13cc86af 1786The methods are simple. There's one for every major SQL operation,
32eab2da 1787and a constructor you use first. The arguments are specified in a
13cc86af 1788similar order for each method (table, then fields, then a where
32eab2da 1789clause) to try and simplify things.
1790
32eab2da 1791=head2 new(option => 'value')
1792
1793The C<new()> function takes a list of options and values, and returns
1794a new B<SQL::Abstract> object which can then be used to generate SQL
1795through the methods below. The options accepted are:
1796
1797=over
1798
1799=item case
1800
1801If set to 'lower', then SQL will be generated in all lowercase. By
1802default SQL is generated in "textbook" case meaning something like:
1803
1804 SELECT a_field FROM a_table WHERE some_field LIKE '%someval%'
1805
96449e8e 1806Any setting other than 'lower' is ignored.
1807
32eab2da 1808=item cmp
1809
1810This determines what the default comparison operator is. By default
1811it is C<=>, meaning that a hash like this:
1812
1813 %where = (name => 'nwiger', email => 'nate@wiger.org');
1814
1815Will generate SQL like this:
1816
1817 WHERE name = 'nwiger' AND email = 'nate@wiger.org'
1818
1819However, you may want loose comparisons by default, so if you set
1820C<cmp> to C<like> you would get SQL such as:
1821
1822 WHERE name like 'nwiger' AND email like 'nate@wiger.org'
1823
3af02ccb 1824You can also override the comparison on an individual basis - see
32eab2da 1825the huge section on L</"WHERE CLAUSES"> at the bottom.
1826
96449e8e 1827=item sqltrue, sqlfalse
1828
1829Expressions for inserting boolean values within SQL statements.
6e0c6552 1830By default these are C<1=1> and C<1=0>. They are used
1831by the special operators C<-in> and C<-not_in> for generating
1832correct SQL even when the argument is an empty array (see below).
96449e8e 1833
32eab2da 1834=item logic
1835
1836This determines the default logical operator for multiple WHERE
7cac25e6 1837statements in arrays or hashes. If absent, the default logic is "or"
1838for arrays, and "and" for hashes. This means that a WHERE
32eab2da 1839array of the form:
1840
1841 @where = (
9d48860e 1842 event_date => {'>=', '2/13/99'},
1843 event_date => {'<=', '4/24/03'},
32eab2da 1844 );
1845
7cac25e6 1846will generate SQL like this:
32eab2da 1847
1848 WHERE event_date >= '2/13/99' OR event_date <= '4/24/03'
1849
1850This is probably not what you want given this query, though (look
1851at the dates). To change the "OR" to an "AND", simply specify:
1852
1853 my $sql = SQL::Abstract->new(logic => 'and');
1854
1855Which will change the above C<WHERE> to:
1856
1857 WHERE event_date >= '2/13/99' AND event_date <= '4/24/03'
1858
96449e8e 1859The logic can also be changed locally by inserting
be21dde3 1860a modifier in front of an arrayref:
96449e8e 1861
9d48860e 1862 @where = (-and => [event_date => {'>=', '2/13/99'},
7cac25e6 1863 event_date => {'<=', '4/24/03'} ]);
96449e8e 1864
1865See the L</"WHERE CLAUSES"> section for explanations.
1866
32eab2da 1867=item convert
1868
1869This will automatically convert comparisons using the specified SQL
1870function for both column and value. This is mostly used with an argument
1871of C<upper> or C<lower>, so that the SQL will have the effect of
1872case-insensitive "searches". For example, this:
1873
1874 $sql = SQL::Abstract->new(convert => 'upper');
1875 %where = (keywords => 'MaKe iT CAse inSeNSItive');
1876
1877Will turn out the following SQL:
1878
1879 WHERE upper(keywords) like upper('MaKe iT CAse inSeNSItive')
1880
1881The conversion can be C<upper()>, C<lower()>, or any other SQL function
1882that can be applied symmetrically to fields (actually B<SQL::Abstract> does
1883not validate this option; it will just pass through what you specify verbatim).
1884
1885=item bindtype
1886
1887This is a kludge because many databases suck. For example, you can't
1888just bind values using DBI's C<execute()> for Oracle C<CLOB> or C<BLOB> fields.
1889Instead, you have to use C<bind_param()>:
1890
1891 $sth->bind_param(1, 'reg data');
1892 $sth->bind_param(2, $lots, {ora_type => ORA_CLOB});
1893
1894The problem is, B<SQL::Abstract> will normally just return a C<@bind> array,
1895which loses track of which field each slot refers to. Fear not.
1896
1897If you specify C<bindtype> in new, you can determine how C<@bind> is returned.
1898Currently, you can specify either C<normal> (default) or C<columns>. If you
1899specify C<columns>, you will get an array that looks like this:
1900
1901 my $sql = SQL::Abstract->new(bindtype => 'columns');
1902 my($stmt, @bind) = $sql->insert(...);
1903
1904 @bind = (
1905 [ 'column1', 'value1' ],
1906 [ 'column2', 'value2' ],
1907 [ 'column3', 'value3' ],
1908 );
1909
1910You can then iterate through this manually, using DBI's C<bind_param()>.
e3f9dff4 1911
32eab2da 1912 $sth->prepare($stmt);
1913 my $i = 1;
1914 for (@bind) {
1915 my($col, $data) = @$_;
1916 if ($col eq 'details' || $col eq 'comments') {
1917 $sth->bind_param($i, $data, {ora_type => ORA_CLOB});
1918 } elsif ($col eq 'image') {
1919 $sth->bind_param($i, $data, {ora_type => ORA_BLOB});
1920 } else {
1921 $sth->bind_param($i, $data);
1922 }
1923 $i++;
1924 }
1925 $sth->execute; # execute without @bind now
1926
1927Now, why would you still use B<SQL::Abstract> if you have to do this crap?
1928Basically, the advantage is still that you don't have to care which fields
1929are or are not included. You could wrap that above C<for> loop in a simple
1930sub called C<bind_fields()> or something and reuse it repeatedly. You still
1931get a layer of abstraction over manual SQL specification.
1932
3ae1c5e2 1933Note that if you set L</bindtype> to C<columns>, the C<\[ $sql, @bind ]>
deb148a2 1934construct (see L</Literal SQL with placeholders and bind values (subqueries)>)
1935will expect the bind values in this format.
1936
32eab2da 1937=item quote_char
1938
1939This is the character that a table or column name will be quoted
9d48860e 1940with. By default this is an empty string, but you could set it to
32eab2da 1941the character C<`>, to generate SQL like this:
1942
1943 SELECT `a_field` FROM `a_table` WHERE `some_field` LIKE '%someval%'
1944
96449e8e 1945Alternatively, you can supply an array ref of two items, the first being the left
1946hand quote character, and the second the right hand quote character. For
1947example, you could supply C<['[',']']> for SQL Server 2000 compliant quotes
1948that generates SQL like this:
1949
1950 SELECT [a_field] FROM [a_table] WHERE [some_field] LIKE '%someval%'
1951
9d48860e 1952Quoting is useful if you have tables or columns names that are reserved
96449e8e 1953words in your database's SQL dialect.
32eab2da 1954
46be4313 1955=item escape_char
1956
1957This is the character that will be used to escape L</quote_char>s appearing
1958in an identifier before it has been quoted.
1959
80790166 1960The parameter default in case of a single L</quote_char> character is the quote
46be4313 1961character itself.
1962
1963When opening-closing-style quoting is used (L</quote_char> is an arrayref)
9de2bd86 1964this parameter defaults to the B<closing (right)> L</quote_char>. Occurrences
46be4313 1965of the B<opening (left)> L</quote_char> within the identifier are currently left
1966untouched. The default for opening-closing-style quotes may change in future
1967versions, thus you are B<strongly encouraged> to specify the escape character
1968explicitly.
1969
32eab2da 1970=item name_sep
1971
1972This is the character that separates a table and column name. It is
1973necessary to specify this when the C<quote_char> option is selected,
1974so that tables and column names can be individually quoted like this:
1975
1976 SELECT `table`.`one_field` FROM `table` WHERE `table`.`other_field` = 1
1977
b6251592 1978=item injection_guard
1979
1980A regular expression C<qr/.../> that is applied to any C<-function> and unquoted
1981column name specified in a query structure. This is a safety mechanism to avoid
1982injection attacks when mishandling user input e.g.:
1983
1984 my %condition_as_column_value_pairs = get_values_from_user();
1985 $sqla->select( ... , \%condition_as_column_value_pairs );
1986
1987If the expression matches an exception is thrown. Note that literal SQL
1988supplied via C<\'...'> or C<\['...']> is B<not> checked in any way.
1989
1990Defaults to checking for C<;> and the C<GO> keyword (TransactSQL)
1991
96449e8e 1992=item array_datatypes
32eab2da 1993
9d48860e 1994When this option is true, arrayrefs in INSERT or UPDATE are
1995interpreted as array datatypes and are passed directly
96449e8e 1996to the DBI layer.
1997When this option is false, arrayrefs are interpreted
1998as literal SQL, just like refs to arrayrefs
1999(but this behavior is for backwards compatibility; when writing
2000new queries, use the "reference to arrayref" syntax
2001for literal SQL).
32eab2da 2002
32eab2da 2003
96449e8e 2004=item special_ops
32eab2da 2005
9d48860e 2006Takes a reference to a list of "special operators"
96449e8e 2007to extend the syntax understood by L<SQL::Abstract>.
2008See section L</"SPECIAL OPERATORS"> for details.
32eab2da 2009
59f23b3d 2010=item unary_ops
2011
9d48860e 2012Takes a reference to a list of "unary operators"
59f23b3d 2013to extend the syntax understood by L<SQL::Abstract>.
2014See section L</"UNARY OPERATORS"> for details.
2015
32eab2da 2016
32eab2da 2017
96449e8e 2018=back
32eab2da 2019
02288357 2020=head2 insert($table, \@values || \%fieldvals, \%options)
32eab2da 2021
2022This is the simplest function. You simply give it a table name
2023and either an arrayref of values or hashref of field/value pairs.
2024It returns an SQL INSERT statement and a list of bind values.
96449e8e 2025See the sections on L</"Inserting and Updating Arrays"> and
2026L</"Inserting and Updating SQL"> for information on how to insert
2027with those data types.
32eab2da 2028
02288357 2029The optional C<\%options> hash reference may contain additional
2030options to generate the insert SQL. Currently supported options
2031are:
2032
2033=over 4
2034
2035=item returning
2036
2037Takes either a scalar of raw SQL fields, or an array reference of
2038field names, and adds on an SQL C<RETURNING> statement at the end.
2039This allows you to return data generated by the insert statement
2040(such as row IDs) without performing another C<SELECT> statement.
2041Note, however, this is not part of the SQL standard and may not
2042be supported by all database engines.
2043
2044=back
2045
95904db5 2046=head2 update($table, \%fieldvals, \%where, \%options)
32eab2da 2047
2048This takes a table, hashref of field/value pairs, and an optional
86298391 2049hashref L<WHERE clause|/WHERE CLAUSES>. It returns an SQL UPDATE function and a list
32eab2da 2050of bind values.
96449e8e 2051See the sections on L</"Inserting and Updating Arrays"> and
2052L</"Inserting and Updating SQL"> for information on how to insert
2053with those data types.
32eab2da 2054
95904db5 2055The optional C<\%options> hash reference may contain additional
2056options to generate the update SQL. Currently supported options
2057are:
2058
2059=over 4
2060
2061=item returning
2062
2063See the C<returning> option to
2064L<insert|/insert($table, \@values || \%fieldvals, \%options)>.
2065
2066=back
2067
96449e8e 2068=head2 select($source, $fields, $where, $order)
32eab2da 2069
9d48860e 2070This returns a SQL SELECT statement and associated list of bind values, as
be21dde3 2071specified by the arguments:
32eab2da 2072
96449e8e 2073=over
32eab2da 2074
96449e8e 2075=item $source
32eab2da 2076
9d48860e 2077Specification of the 'FROM' part of the statement.
96449e8e 2078The argument can be either a plain scalar (interpreted as a table
2079name, will be quoted), or an arrayref (interpreted as a list
2080of table names, joined by commas, quoted), or a scalarref
063097a3 2081(literal SQL, not quoted).
32eab2da 2082
96449e8e 2083=item $fields
32eab2da 2084
9d48860e 2085Specification of the list of fields to retrieve from
96449e8e 2086the source.
2087The argument can be either an arrayref (interpreted as a list
9d48860e 2088of field names, will be joined by commas and quoted), or a
96449e8e 2089plain scalar (literal SQL, not quoted).
521647e7 2090Please observe that this API is not as flexible as that of
2091the first argument C<$source>, for backwards compatibility reasons.
32eab2da 2092
96449e8e 2093=item $where
32eab2da 2094
96449e8e 2095Optional argument to specify the WHERE part of the query.
2096The argument is most often a hashref, but can also be
9d48860e 2097an arrayref or plain scalar --
96449e8e 2098see section L<WHERE clause|/"WHERE CLAUSES"> for details.
32eab2da 2099
96449e8e 2100=item $order
32eab2da 2101
96449e8e 2102Optional argument to specify the ORDER BY part of the query.
9d48860e 2103The argument can be a scalar, a hashref or an arrayref
96449e8e 2104-- see section L<ORDER BY clause|/"ORDER BY CLAUSES">
2105for details.
32eab2da 2106
96449e8e 2107=back
32eab2da 2108
32eab2da 2109
85327cd5 2110=head2 delete($table, \%where, \%options)
32eab2da 2111
86298391 2112This takes a table name and optional hashref L<WHERE clause|/WHERE CLAUSES>.
32eab2da 2113It returns an SQL DELETE statement and list of bind values.
2114
85327cd5 2115The optional C<\%options> hash reference may contain additional
2116options to generate the delete SQL. Currently supported options
2117are:
2118
2119=over 4
2120
2121=item returning
2122
2123See the C<returning> option to
2124L<insert|/insert($table, \@values || \%fieldvals, \%options)>.
2125
2126=back
2127
85783f3c 2128=head2 where(\%where, $order)
32eab2da 2129
2130This is used to generate just the WHERE clause. For example,
2131if you have an arbitrary data structure and know what the
2132rest of your SQL is going to look like, but want an easy way
2133to produce a WHERE clause, use this. It returns an SQL WHERE
2134clause and list of bind values.
2135
32eab2da 2136
2137=head2 values(\%data)
2138
2139This just returns the values from the hash C<%data>, in the same
2140order that would be returned from any of the other above queries.
2141Using this allows you to markedly speed up your queries if you
2142are affecting lots of rows. See below under the L</"PERFORMANCE"> section.
2143
32eab2da 2144=head2 generate($any, 'number', $of, \@data, $struct, \%types)
2145
2146Warning: This is an experimental method and subject to change.
2147
2148This returns arbitrarily generated SQL. It's a really basic shortcut.
2149It will return two different things, depending on return context:
2150
2151 my($stmt, @bind) = $sql->generate('create table', \$table, \@fields);
2152 my $stmt_and_val = $sql->generate('create table', \$table, \@fields);
2153
2154These would return the following:
2155
2156 # First calling form
2157 $stmt = "CREATE TABLE test (?, ?)";
2158 @bind = (field1, field2);
2159
2160 # Second calling form
2161 $stmt_and_val = "CREATE TABLE test (field1, field2)";
2162
2163Depending on what you're trying to do, it's up to you to choose the correct
2164format. In this example, the second form is what you would want.
2165
2166By the same token:
2167
2168 $sql->generate('alter session', { nls_date_format => 'MM/YY' });
2169
2170Might give you:
2171
2172 ALTER SESSION SET nls_date_format = 'MM/YY'
2173
2174You get the idea. Strings get their case twiddled, but everything
2175else remains verbatim.
2176
0da0fe34 2177=head1 EXPORTABLE FUNCTIONS
2178
2179=head2 is_plain_value
2180
2181Determines if the supplied argument is a plain value as understood by this
2182module:
2183
2184=over
2185
2186=item * The value is C<undef>
2187
2188=item * The value is a non-reference
2189
2190=item * The value is an object with stringification overloading
2191
2192=item * The value is of the form C<< { -value => $anything } >>
2193
2194=back
2195
9de2bd86 2196On failure returns C<undef>, on success returns a B<scalar> reference
966200cc 2197to the original supplied argument.
0da0fe34 2198
843a94b5 2199=over
2200
2201=item * Note
2202
2203The stringification overloading detection is rather advanced: it takes
2204into consideration not only the presence of a C<""> overload, but if that
2205fails also checks for enabled
2206L<autogenerated versions of C<"">|overload/Magic Autogeneration>, based
2207on either C<0+> or C<bool>.
2208
2209Unfortunately testing in the field indicates that this
2210detection B<< may tickle a latent bug in perl versions before 5.018 >>,
2211but only when very large numbers of stringifying objects are involved.
2212At the time of writing ( Sep 2014 ) there is no clear explanation of
2213the direct cause, nor is there a manageably small test case that reliably
2214reproduces the problem.
2215
2216If you encounter any of the following exceptions in B<random places within
2217your application stack> - this module may be to blame:
2218
2219 Operation "ne": no method found,
2220 left argument in overloaded package <something>,
2221 right argument in overloaded package <something>
2222
2223or perhaps even
2224
2225 Stub found while resolving method "???" overloading """" in package <something>
2226
2227If you fall victim to the above - please attempt to reduce the problem
2228to something that could be sent to the L<SQL::Abstract developers
1f490ae4 2229|DBIx::Class/GETTING HELP/SUPPORT>
843a94b5 2230(either publicly or privately). As a workaround in the meantime you can
2231set C<$ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION}> to a true
2232value, which will most likely eliminate your problem (at the expense of
2233not being able to properly detect exotic forms of stringification).
2234
2235This notice and environment variable will be removed in a future version,
2236as soon as the underlying problem is found and a reliable workaround is
2237devised.
2238
2239=back
2240
0da0fe34 2241=head2 is_literal_value
2242
2243Determines if the supplied argument is a literal value as understood by this
2244module:
2245
2246=over
2247
2248=item * C<\$sql_string>
2249
2250=item * C<\[ $sql_string, @bind_values ]>
2251
0da0fe34 2252=back
2253
9de2bd86 2254On failure returns C<undef>, on success returns an B<array> reference
966200cc 2255containing the unpacked version of the supplied literal SQL and bind values.
0da0fe34 2256
32eab2da 2257=head1 WHERE CLAUSES
2258
96449e8e 2259=head2 Introduction
2260
32eab2da 2261This module uses a variation on the idea from L<DBIx::Abstract>. It
2262is B<NOT>, repeat I<not> 100% compatible. B<The main logic of this
2263module is that things in arrays are OR'ed, and things in hashes
2264are AND'ed.>
2265
2266The easiest way to explain is to show lots of examples. After
2267each C<%where> hash shown, it is assumed you used:
2268
2269 my($stmt, @bind) = $sql->where(\%where);
2270
2271However, note that the C<%where> hash can be used directly in any
2272of the other functions as well, as described above.
2273
96449e8e 2274=head2 Key-value pairs
2275
32eab2da 2276So, let's get started. To begin, a simple hash:
2277
2278 my %where = (
2279 user => 'nwiger',
2280 status => 'completed'
2281 );
2282
2283Is converted to SQL C<key = val> statements:
2284
2285 $stmt = "WHERE user = ? AND status = ?";
2286 @bind = ('nwiger', 'completed');
2287
2288One common thing I end up doing is having a list of values that
2289a field can be in. To do this, simply specify a list inside of
2290an arrayref:
2291
2292 my %where = (
2293 user => 'nwiger',
2294 status => ['assigned', 'in-progress', 'pending'];
2295 );
2296
2297This simple code will create the following:
9d48860e 2298
32eab2da 2299 $stmt = "WHERE user = ? AND ( status = ? OR status = ? OR status = ? )";
2300 @bind = ('nwiger', 'assigned', 'in-progress', 'pending');
2301
9d48860e 2302A field associated to an empty arrayref will be considered a
7cac25e6 2303logical false and will generate 0=1.
8a68b5be 2304
b864ba9b 2305=head2 Tests for NULL values
2306
2307If the value part is C<undef> then this is converted to SQL <IS NULL>
2308
2309 my %where = (
2310 user => 'nwiger',
2311 status => undef,
2312 );
2313
2314becomes:
2315
2316 $stmt = "WHERE user = ? AND status IS NULL";
2317 @bind = ('nwiger');
2318
e9614080 2319To test if a column IS NOT NULL:
2320
2321 my %where = (
2322 user => 'nwiger',
2323 status => { '!=', undef },
2324 );
cc422895 2325
6e0c6552 2326=head2 Specific comparison operators
96449e8e 2327
32eab2da 2328If you want to specify a different type of operator for your comparison,
2329you can use a hashref for a given column:
2330
2331 my %where = (
2332 user => 'nwiger',
2333 status => { '!=', 'completed' }
2334 );
2335
2336Which would generate:
2337
2338 $stmt = "WHERE user = ? AND status != ?";
2339 @bind = ('nwiger', 'completed');
2340
2341To test against multiple values, just enclose the values in an arrayref:
2342
96449e8e 2343 status => { '=', ['assigned', 'in-progress', 'pending'] };
2344
f2d5020d 2345Which would give you:
96449e8e 2346
2347 "WHERE status = ? OR status = ? OR status = ?"
2348
2349
2350The hashref can also contain multiple pairs, in which case it is expanded
32eab2da 2351into an C<AND> of its elements:
2352
2353 my %where = (
2354 user => 'nwiger',
2355 status => { '!=', 'completed', -not_like => 'pending%' }
2356 );
2357
2358 # Or more dynamically, like from a form
2359 $where{user} = 'nwiger';
2360 $where{status}{'!='} = 'completed';
2361 $where{status}{'-not_like'} = 'pending%';
2362
2363 # Both generate this
2364 $stmt = "WHERE user = ? AND status != ? AND status NOT LIKE ?";
2365 @bind = ('nwiger', 'completed', 'pending%');
2366
96449e8e 2367
32eab2da 2368To get an OR instead, you can combine it with the arrayref idea:
2369
2370 my %where => (
2371 user => 'nwiger',
1a6f2a03 2372 priority => [ { '=', 2 }, { '>', 5 } ]
32eab2da 2373 );
2374
2375Which would generate:
2376
1a6f2a03 2377 $stmt = "WHERE ( priority = ? OR priority > ? ) AND user = ?";
2378 @bind = ('2', '5', 'nwiger');
32eab2da 2379
44b9e502 2380If you want to include literal SQL (with or without bind values), just use a
13cc86af 2381scalar reference or reference to an arrayref as the value:
44b9e502 2382
2383 my %where = (
2384 date_entered => { '>' => \["to_date(?, 'MM/DD/YYYY')", "11/26/2008"] },
2385 date_expires => { '<' => \"now()" }
2386 );
2387
2388Which would generate:
2389
13cc86af 2390 $stmt = "WHERE date_entered > to_date(?, 'MM/DD/YYYY') AND date_expires < now()";
44b9e502 2391 @bind = ('11/26/2008');
2392
96449e8e 2393
2394=head2 Logic and nesting operators
2395
2396In the example above,
2397there is a subtle trap if you want to say something like
32eab2da 2398this (notice the C<AND>):
2399
2400 WHERE priority != ? AND priority != ?
2401
2402Because, in Perl you I<can't> do this:
2403
13cc86af 2404 priority => { '!=' => 2, '!=' => 1 }
32eab2da 2405
2406As the second C<!=> key will obliterate the first. The solution
2407is to use the special C<-modifier> form inside an arrayref:
2408
9d48860e 2409 priority => [ -and => {'!=', 2},
96449e8e 2410 {'!=', 1} ]
2411
32eab2da 2412
2413Normally, these would be joined by C<OR>, but the modifier tells it
2414to use C<AND> instead. (Hint: You can use this in conjunction with the
2415C<logic> option to C<new()> in order to change the way your queries
2416work by default.) B<Important:> Note that the C<-modifier> goes
2417B<INSIDE> the arrayref, as an extra first element. This will
2418B<NOT> do what you think it might:
2419
2420 priority => -and => [{'!=', 2}, {'!=', 1}] # WRONG!
2421
2422Here is a quick list of equivalencies, since there is some overlap:
2423
2424 # Same
2425 status => {'!=', 'completed', 'not like', 'pending%' }
2426 status => [ -and => {'!=', 'completed'}, {'not like', 'pending%'}]
2427
2428 # Same
2429 status => {'=', ['assigned', 'in-progress']}
2430 status => [ -or => {'=', 'assigned'}, {'=', 'in-progress'}]
2431 status => [ {'=', 'assigned'}, {'=', 'in-progress'} ]
2432
e3f9dff4 2433
2434
be21dde3 2435=head2 Special operators: IN, BETWEEN, etc.
96449e8e 2436
32eab2da 2437You can also use the hashref format to compare a list of fields using the
2438C<IN> comparison operator, by specifying the list as an arrayref:
2439
2440 my %where = (
2441 status => 'completed',
2442 reportid => { -in => [567, 2335, 2] }
2443 );
2444
2445Which would generate:
2446
2447 $stmt = "WHERE status = ? AND reportid IN (?,?,?)";
2448 @bind = ('completed', '567', '2335', '2');
2449
9d48860e 2450The reverse operator C<-not_in> generates SQL C<NOT IN> and is used in
96449e8e 2451the same way.
2452
6e0c6552 2453If the argument to C<-in> is an empty array, 'sqlfalse' is generated
be21dde3 2454(by default: C<1=0>). Similarly, C<< -not_in => [] >> generates
2455'sqltrue' (by default: C<1=1>).
6e0c6552 2456
e41c3bdd 2457In addition to the array you can supply a chunk of literal sql or
2458literal sql with bind:
6e0c6552 2459
e41c3bdd 2460 my %where = {
2461 customer => { -in => \[
2462 'SELECT cust_id FROM cust WHERE balance > ?',
2463 2000,
2464 ],
2465 status => { -in => \'SELECT status_codes FROM states' },
2466 };
6e0c6552 2467
e41c3bdd 2468would generate:
2469
2470 $stmt = "WHERE (
2471 customer IN ( SELECT cust_id FROM cust WHERE balance > ? )
2472 AND status IN ( SELECT status_codes FROM states )
2473 )";
2474 @bind = ('2000');
2475
0dfd2442 2476Finally, if the argument to C<-in> is not a reference, it will be
2477treated as a single-element array.
e41c3bdd 2478
2479Another pair of operators is C<-between> and C<-not_between>,
96449e8e 2480used with an arrayref of two values:
32eab2da 2481
2482 my %where = (
2483 user => 'nwiger',
2484 completion_date => {
2485 -not_between => ['2002-10-01', '2003-02-06']
2486 }
2487 );
2488
2489Would give you:
2490
2491 WHERE user = ? AND completion_date NOT BETWEEN ( ? AND ? )
2492
e41c3bdd 2493Just like with C<-in> all plausible combinations of literal SQL
2494are possible:
2495
2496 my %where = {
2497 start0 => { -between => [ 1, 2 ] },
2498 start1 => { -between => \["? AND ?", 1, 2] },
2499 start2 => { -between => \"lower(x) AND upper(y)" },
9d48860e 2500 start3 => { -between => [
e41c3bdd 2501 \"lower(x)",
2502 \["upper(?)", 'stuff' ],
2503 ] },
2504 };
2505
2506Would give you:
2507
2508 $stmt = "WHERE (
2509 ( start0 BETWEEN ? AND ? )
2510 AND ( start1 BETWEEN ? AND ? )
2511 AND ( start2 BETWEEN lower(x) AND upper(y) )
2512 AND ( start3 BETWEEN lower(x) AND upper(?) )
2513 )";
2514 @bind = (1, 2, 1, 2, 'stuff');
2515
2516
9d48860e 2517These are the two builtin "special operators"; but the
be21dde3 2518list can be expanded: see section L</"SPECIAL OPERATORS"> below.
96449e8e 2519
59f23b3d 2520=head2 Unary operators: bool
97a920ef 2521
2522If you wish to test against boolean columns or functions within your
2523database you can use the C<-bool> and C<-not_bool> operators. For
2524example to test the column C<is_user> being true and the column
827bb0eb 2525C<is_enabled> being false you would use:-
97a920ef 2526
2527 my %where = (
2528 -bool => 'is_user',
2529 -not_bool => 'is_enabled',
2530 );
2531
2532Would give you:
2533
277b5d3f 2534 WHERE is_user AND NOT is_enabled
97a920ef 2535
0b604e9d 2536If a more complex combination is required, testing more conditions,
2537then you should use the and/or operators:-
2538
2539 my %where = (
2540 -and => [
2541 -bool => 'one',
23401b81 2542 -not_bool => { two=> { -rlike => 'bar' } },
2543 -not_bool => { three => [ { '=', 2 }, { '>', 5 } ] },
0b604e9d 2544 ],
2545 );
2546
2547Would give you:
2548
23401b81 2549 WHERE
2550 one
2551 AND
2552 (NOT two RLIKE ?)
2553 AND
2554 (NOT ( three = ? OR three > ? ))
97a920ef 2555
2556
107b72f1 2557=head2 Nested conditions, -and/-or prefixes
96449e8e 2558
32eab2da 2559So far, we've seen how multiple conditions are joined with a top-level
2560C<AND>. We can change this by putting the different conditions we want in
2561hashes and then putting those hashes in an array. For example:
2562
2563 my @where = (
2564 {
2565 user => 'nwiger',
2566 status => { -like => ['pending%', 'dispatched'] },
2567 },
2568 {
2569 user => 'robot',
2570 status => 'unassigned',
2571 }
2572 );
2573
2574This data structure would create the following:
2575
2576 $stmt = "WHERE ( user = ? AND ( status LIKE ? OR status LIKE ? ) )
2577 OR ( user = ? AND status = ? ) )";
2578 @bind = ('nwiger', 'pending', 'dispatched', 'robot', 'unassigned');
2579
107b72f1 2580
48d9f5f8 2581Clauses in hashrefs or arrayrefs can be prefixed with an C<-and> or C<-or>
be21dde3 2582to change the logic inside:
32eab2da 2583
2584 my @where = (
2585 -and => [
2586 user => 'nwiger',
48d9f5f8 2587 [
2588 -and => [ workhrs => {'>', 20}, geo => 'ASIA' ],
2589 -or => { workhrs => {'<', 50}, geo => 'EURO' },
32eab2da 2590 ],
2591 ],
2592 );
2593
2594That would yield:
2595
13cc86af 2596 $stmt = "WHERE ( user = ?
2597 AND ( ( workhrs > ? AND geo = ? )
2598 OR ( workhrs < ? OR geo = ? ) ) )";
2599 @bind = ('nwiger', '20', 'ASIA', '50', 'EURO');
107b72f1 2600
cc422895 2601=head3 Algebraic inconsistency, for historical reasons
107b72f1 2602
7cac25e6 2603C<Important note>: when connecting several conditions, the C<-and->|C<-or>
2604operator goes C<outside> of the nested structure; whereas when connecting
2605several constraints on one column, the C<-and> operator goes
be21dde3 2606C<inside> the arrayref. Here is an example combining both features:
7cac25e6 2607
2608 my @where = (
2609 -and => [a => 1, b => 2],
2610 -or => [c => 3, d => 4],
2611 e => [-and => {-like => 'foo%'}, {-like => '%bar'} ]
2612 )
2613
2614yielding
2615
9d48860e 2616 WHERE ( ( ( a = ? AND b = ? )
2617 OR ( c = ? OR d = ? )
7cac25e6 2618 OR ( e LIKE ? AND e LIKE ? ) ) )
2619
107b72f1 2620This difference in syntax is unfortunate but must be preserved for
be21dde3 2621historical reasons. So be careful: the two examples below would
107b72f1 2622seem algebraically equivalent, but they are not
2623
a948b1fe 2624 { col => [ -and =>
2625 { -like => 'foo%' },
2626 { -like => '%bar' },
2627 ] }
be21dde3 2628 # yields: WHERE ( ( col LIKE ? AND col LIKE ? ) )
107b72f1 2629
a948b1fe 2630 [ -and =>
2631 { col => { -like => 'foo%' } },
2632 { col => { -like => '%bar' } },
2633 ]
be21dde3 2634 # yields: WHERE ( ( col LIKE ? OR col LIKE ? ) )
107b72f1 2635
7cac25e6 2636
cc422895 2637=head2 Literal SQL and value type operators
96449e8e 2638
cc422895 2639The basic premise of SQL::Abstract is that in WHERE specifications the "left
2640side" is a column name and the "right side" is a value (normally rendered as
2641a placeholder). This holds true for both hashrefs and arrayref pairs as you
2642see in the L</WHERE CLAUSES> examples above. Sometimes it is necessary to
2643alter this behavior. There are several ways of doing so.
e9614080 2644
cc422895 2645=head3 -ident
2646
2647This is a virtual operator that signals the string to its right side is an
2648identifier (a column name) and not a value. For example to compare two
2649columns you would write:
32eab2da 2650
e9614080 2651 my %where = (
2652 priority => { '<', 2 },
cc422895 2653 requestor => { -ident => 'submitter' },
e9614080 2654 );
2655
2656which creates:
2657
2658 $stmt = "WHERE priority < ? AND requestor = submitter";
2659 @bind = ('2');
2660
cc422895 2661If you are maintaining legacy code you may see a different construct as
2662described in L</Deprecated usage of Literal SQL>, please use C<-ident> in new
2663code.
2664
2665=head3 -value
e9614080 2666
cc422895 2667This is a virtual operator that signals that the construct to its right side
2668is a value to be passed to DBI. This is for example necessary when you want
2669to write a where clause against an array (for RDBMS that support such
2670datatypes). For example:
e9614080 2671
32eab2da 2672 my %where = (
cc422895 2673 array => { -value => [1, 2, 3] }
32eab2da 2674 );
2675
cc422895 2676will result in:
32eab2da 2677
cc422895 2678 $stmt = 'WHERE array = ?';
2679 @bind = ([1, 2, 3]);
32eab2da 2680
cc422895 2681Note that if you were to simply say:
32eab2da 2682
2683 my %where = (
cc422895 2684 array => [1, 2, 3]
32eab2da 2685 );
2686
3af02ccb 2687the result would probably not be what you wanted:
cc422895 2688
2689 $stmt = 'WHERE array = ? OR array = ? OR array = ?';
2690 @bind = (1, 2, 3);
2691
2692=head3 Literal SQL
96449e8e 2693
cc422895 2694Finally, sometimes only literal SQL will do. To include a random snippet
2695of SQL verbatim, you specify it as a scalar reference. Consider this only
2696as a last resort. Usually there is a better way. For example:
96449e8e 2697
2698 my %where = (
cc422895 2699 priority => { '<', 2 },
2700 requestor => { -in => \'(SELECT name FROM hitmen)' },
96449e8e 2701 );
2702
cc422895 2703Would create:
96449e8e 2704
cc422895 2705 $stmt = "WHERE priority < ? AND requestor IN (SELECT name FROM hitmen)"
2706 @bind = (2);
2707
2708Note that in this example, you only get one bind parameter back, since
2709the verbatim SQL is passed as part of the statement.
2710
2711=head4 CAVEAT
2712
2713 Never use untrusted input as a literal SQL argument - this is a massive
2714 security risk (there is no way to check literal snippets for SQL
2715 injections and other nastyness). If you need to deal with untrusted input
2716 use literal SQL with placeholders as described next.
96449e8e 2717
cc422895 2718=head3 Literal SQL with placeholders and bind values (subqueries)
96449e8e 2719
2720If the literal SQL to be inserted has placeholders and bind values,
2721use a reference to an arrayref (yes this is a double reference --
2722not so common, but perfectly legal Perl). For example, to find a date
2723in Postgres you can use something like this:
2724
2725 my %where = (
3ae1c5e2 2726 date_column => \[ "= date '2008-09-30' - ?::integer", 10 ]
96449e8e 2727 )
2728
2729This would create:
2730
d2a8fe1a 2731 $stmt = "WHERE ( date_column = date '2008-09-30' - ?::integer )"
96449e8e 2732 @bind = ('10');
2733
deb148a2 2734Note that you must pass the bind values in the same format as they are returned
85783f3c 2735by L<where|/where(\%where, $order)>. This means that if you set L</bindtype>
1f490ae4 2736to C<columns>, you must provide the bind values in the
2737C<< [ column_meta => value ] >> format, where C<column_meta> is an opaque
2738scalar value; most commonly the column name, but you can use any scalar value
2739(including references and blessed references), L<SQL::Abstract> will simply
2740pass it through intact. So if C<bindtype> is set to C<columns> the above
2741example will look like:
deb148a2 2742
2743 my %where = (
3ae1c5e2 2744 date_column => \[ "= date '2008-09-30' - ?::integer", [ {} => 10 ] ]
deb148a2 2745 )
96449e8e 2746
2747Literal SQL is especially useful for nesting parenthesized clauses in the
be21dde3 2748main SQL query. Here is a first example:
96449e8e 2749
2750 my ($sub_stmt, @sub_bind) = ("SELECT c1 FROM t1 WHERE c2 < ? AND c3 LIKE ?",
2751 100, "foo%");
2752 my %where = (
2753 foo => 1234,
2754 bar => \["IN ($sub_stmt)" => @sub_bind],
2755 );
2756
be21dde3 2757This yields:
96449e8e 2758
9d48860e 2759 $stmt = "WHERE (foo = ? AND bar IN (SELECT c1 FROM t1
96449e8e 2760 WHERE c2 < ? AND c3 LIKE ?))";
2761 @bind = (1234, 100, "foo%");
2762
9d48860e 2763Other subquery operators, like for example C<"E<gt> ALL"> or C<"NOT IN">,
96449e8e 2764are expressed in the same way. Of course the C<$sub_stmt> and
9d48860e 2765its associated bind values can be generated through a former call
96449e8e 2766to C<select()> :
2767
2768 my ($sub_stmt, @sub_bind)
9d48860e 2769 = $sql->select("t1", "c1", {c2 => {"<" => 100},
96449e8e 2770 c3 => {-like => "foo%"}});
2771 my %where = (
2772 foo => 1234,
2773 bar => \["> ALL ($sub_stmt)" => @sub_bind],
2774 );
2775
2776In the examples above, the subquery was used as an operator on a column;
9d48860e 2777but the same principle also applies for a clause within the main C<%where>
be21dde3 2778hash, like an EXISTS subquery:
96449e8e 2779
9d48860e 2780 my ($sub_stmt, @sub_bind)
96449e8e 2781 = $sql->select("t1", "*", {c1 => 1, c2 => \"> t0.c0"});
48d9f5f8 2782 my %where = ( -and => [
96449e8e 2783 foo => 1234,
48d9f5f8 2784 \["EXISTS ($sub_stmt)" => @sub_bind],
2785 ]);
96449e8e 2786
2787which yields
2788
9d48860e 2789 $stmt = "WHERE (foo = ? AND EXISTS (SELECT * FROM t1
96449e8e 2790 WHERE c1 = ? AND c2 > t0.c0))";
2791 @bind = (1234, 1);
2792
2793
9d48860e 2794Observe that the condition on C<c2> in the subquery refers to
be21dde3 2795column C<t0.c0> of the main query: this is I<not> a bind
9d48860e 2796value, so we have to express it through a scalar ref.
96449e8e 2797Writing C<< c2 => {">" => "t0.c0"} >> would have generated
2798C<< c2 > ? >> with bind value C<"t0.c0"> ... not exactly
2799what we wanted here.
2800
96449e8e 2801Finally, here is an example where a subquery is used
2802for expressing unary negation:
2803
9d48860e 2804 my ($sub_stmt, @sub_bind)
96449e8e 2805 = $sql->where({age => [{"<" => 10}, {">" => 20}]});
2806 $sub_stmt =~ s/^ where //i; # don't want "WHERE" in the subclause
2807 my %where = (
2808 lname => {like => '%son%'},
48d9f5f8 2809 \["NOT ($sub_stmt)" => @sub_bind],
96449e8e 2810 );
2811
2812This yields
2813
2814 $stmt = "lname LIKE ? AND NOT ( age < ? OR age > ? )"
2815 @bind = ('%son%', 10, 20)
2816
cc422895 2817=head3 Deprecated usage of Literal SQL
2818
2819Below are some examples of archaic use of literal SQL. It is shown only as
2820reference for those who deal with legacy code. Each example has a much
2821better, cleaner and safer alternative that users should opt for in new code.
2822
2823=over
2824
2825=item *
2826
2827 my %where = ( requestor => \'IS NOT NULL' )
2828
2829 $stmt = "WHERE requestor IS NOT NULL"
2830
2831This used to be the way of generating NULL comparisons, before the handling
2832of C<undef> got formalized. For new code please use the superior syntax as
2833described in L</Tests for NULL values>.
96449e8e 2834
cc422895 2835=item *
2836
2837 my %where = ( requestor => \'= submitter' )
2838
2839 $stmt = "WHERE requestor = submitter"
2840
2841This used to be the only way to compare columns. Use the superior L</-ident>
2842method for all new code. For example an identifier declared in such a way
2843will be properly quoted if L</quote_char> is properly set, while the legacy
2844form will remain as supplied.
2845
2846=item *
2847
2848 my %where = ( is_ready => \"", completed => { '>', '2012-12-21' } )
2849
2850 $stmt = "WHERE completed > ? AND is_ready"
2851 @bind = ('2012-12-21')
2852
2853Using an empty string literal used to be the only way to express a boolean.
2854For all new code please use the much more readable
2855L<-bool|/Unary operators: bool> operator.
2856
2857=back
96449e8e 2858
2859=head2 Conclusion
2860
32eab2da 2861These pages could go on for a while, since the nesting of the data
2862structures this module can handle are pretty much unlimited (the
2863module implements the C<WHERE> expansion as a recursive function
2864internally). Your best bet is to "play around" with the module a
2865little to see how the data structures behave, and choose the best
2866format for your data based on that.
2867
2868And of course, all the values above will probably be replaced with
2869variables gotten from forms or the command line. After all, if you
2870knew everything ahead of time, you wouldn't have to worry about
2871dynamically-generating SQL and could just hardwire it into your
2872script.
2873
86298391 2874=head1 ORDER BY CLAUSES
2875
9d48860e 2876Some functions take an order by clause. This can either be a scalar (just a
18710f60 2877column name), a hashref of C<< { -desc => 'col' } >> or C<< { -asc => 'col' }
2878>>, a scalarref, an arrayref-ref, or an arrayref of any of the previous
2879forms. Examples:
1cfa1db3 2880
8c15b421 2881 Given | Will Generate
18710f60 2882 ---------------------------------------------------------------
8c15b421 2883 |
2884 'colA' | ORDER BY colA
2885 |
2886 [qw/colA colB/] | ORDER BY colA, colB
2887 |
2888 {-asc => 'colA'} | ORDER BY colA ASC
2889 |
2890 {-desc => 'colB'} | ORDER BY colB DESC
2891 |
2892 ['colA', {-asc => 'colB'}] | ORDER BY colA, colB ASC
2893 |
2894 { -asc => [qw/colA colB/] } | ORDER BY colA ASC, colB ASC
2895 |
2896 \'colA DESC' | ORDER BY colA DESC
2897 |
2898 \[ 'FUNC(colA, ?)', $x ] | ORDER BY FUNC(colA, ?)
2899 | /* ...with $x bound to ? */
2900 |
bd805d85 2901 [ | ORDER BY
2902 { -asc => 'colA' }, | colA ASC,
2903 { -desc => [qw/colB/] }, | colB DESC,
2904 { -asc => [qw/colC colD/] },| colC ASC, colD ASC,
2905 \'colE DESC', | colE DESC,
2906 \[ 'FUNC(colF, ?)', $x ], | FUNC(colF, ?)
2907 ] | /* ...with $x bound to ? */
18710f60 2908 ===============================================================
86298391 2909
96449e8e 2910
2911
2912=head1 SPECIAL OPERATORS
2913
e3f9dff4 2914 my $sqlmaker = SQL::Abstract->new(special_ops => [
3a2e1a5e 2915 {
2916 regex => qr/.../,
e3f9dff4 2917 handler => sub {
2918 my ($self, $field, $op, $arg) = @_;
2919 ...
3a2e1a5e 2920 },
2921 },
2922 {
2923 regex => qr/.../,
2924 handler => 'method_name',
e3f9dff4 2925 },
2926 ]);
2927
9d48860e 2928A "special operator" is a SQL syntactic clause that can be
e3f9dff4 2929applied to a field, instead of a usual binary operator.
be21dde3 2930For example:
e3f9dff4 2931
2932 WHERE field IN (?, ?, ?)
2933 WHERE field BETWEEN ? AND ?
2934 WHERE MATCH(field) AGAINST (?, ?)
96449e8e 2935
e3f9dff4 2936Special operators IN and BETWEEN are fairly standard and therefore
3a2e1a5e 2937are builtin within C<SQL::Abstract> (as the overridable methods
2938C<_where_field_IN> and C<_where_field_BETWEEN>). For other operators,
2939like the MATCH .. AGAINST example above which is specific to MySQL,
2940you can write your own operator handlers - supply a C<special_ops>
2941argument to the C<new> method. That argument takes an arrayref of
2942operator definitions; each operator definition is a hashref with two
2943entries:
96449e8e 2944
e3f9dff4 2945=over
2946
2947=item regex
2948
2949the regular expression to match the operator
96449e8e 2950
e3f9dff4 2951=item handler
2952
3a2e1a5e 2953Either a coderef or a plain scalar method name. In both cases
2954the expected return is C<< ($sql, @bind) >>.
2955
2956When supplied with a method name, it is simply called on the
13cc86af 2957L<SQL::Abstract> object as:
3a2e1a5e 2958
ca4f826a 2959 $self->$method_name($field, $op, $arg)
3a2e1a5e 2960
2961 Where:
2962
3a2e1a5e 2963 $field is the LHS of the operator
13cc86af 2964 $op is the part that matched the handler regex
3a2e1a5e 2965 $arg is the RHS
2966
2967When supplied with a coderef, it is called as:
2968
2969 $coderef->($self, $field, $op, $arg)
2970
e3f9dff4 2971
2972=back
2973
9d48860e 2974For example, here is an implementation
e3f9dff4 2975of the MATCH .. AGAINST syntax for MySQL
2976
2977 my $sqlmaker = SQL::Abstract->new(special_ops => [
9d48860e 2978
e3f9dff4 2979 # special op for MySql MATCH (field) AGAINST(word1, word2, ...)
9d48860e 2980 {regex => qr/^match$/i,
e3f9dff4 2981 handler => sub {
2982 my ($self, $field, $op, $arg) = @_;
2983 $arg = [$arg] if not ref $arg;
2984 my $label = $self->_quote($field);
2985 my ($placeholder) = $self->_convert('?');
2986 my $placeholders = join ", ", (($placeholder) x @$arg);
2987 my $sql = $self->_sqlcase('match') . " ($label) "
2988 . $self->_sqlcase('against') . " ($placeholders) ";
2989 my @bind = $self->_bindtype($field, @$arg);
2990 return ($sql, @bind);
2991 }
2992 },
9d48860e 2993
e3f9dff4 2994 ]);
96449e8e 2995
2996
59f23b3d 2997=head1 UNARY OPERATORS
2998
112b5232 2999 my $sqlmaker = SQL::Abstract->new(unary_ops => [
59f23b3d 3000 {
3001 regex => qr/.../,
3002 handler => sub {
3003 my ($self, $op, $arg) = @_;
3004 ...
3005 },
3006 },
3007 {
3008 regex => qr/.../,
3009 handler => 'method_name',
3010 },
3011 ]);
3012
9d48860e 3013A "unary operator" is a SQL syntactic clause that can be
59f23b3d 3014applied to a field - the operator goes before the field
3015
3016You can write your own operator handlers - supply a C<unary_ops>
3017argument to the C<new> method. That argument takes an arrayref of
3018operator definitions; each operator definition is a hashref with two
3019entries:
3020
3021=over
3022
3023=item regex
3024
3025the regular expression to match the operator
3026
3027=item handler
3028
3029Either a coderef or a plain scalar method name. In both cases
3030the expected return is C<< $sql >>.
3031
3032When supplied with a method name, it is simply called on the
13cc86af 3033L<SQL::Abstract> object as:
59f23b3d 3034
ca4f826a 3035 $self->$method_name($op, $arg)
59f23b3d 3036
3037 Where:
3038
3039 $op is the part that matched the handler regex
3040 $arg is the RHS or argument of the operator
3041
3042When supplied with a coderef, it is called as:
3043
3044 $coderef->($self, $op, $arg)
3045
3046
3047=back
3048
3049
32eab2da 3050=head1 PERFORMANCE
3051
3052Thanks to some benchmarking by Mark Stosberg, it turns out that
3053this module is many orders of magnitude faster than using C<DBIx::Abstract>.
3054I must admit this wasn't an intentional design issue, but it's a
3055byproduct of the fact that you get to control your C<DBI> handles
3056yourself.
3057
3058To maximize performance, use a code snippet like the following:
3059
3060 # prepare a statement handle using the first row
3061 # and then reuse it for the rest of the rows
3062 my($sth, $stmt);
3063 for my $href (@array_of_hashrefs) {
3064 $stmt ||= $sql->insert('table', $href);
3065 $sth ||= $dbh->prepare($stmt);
3066 $sth->execute($sql->values($href));
3067 }
3068
3069The reason this works is because the keys in your C<$href> are sorted
3070internally by B<SQL::Abstract>. Thus, as long as your data retains
3071the same structure, you only have to generate the SQL the first time
3072around. On subsequent queries, simply use the C<values> function provided
3073by this module to return your values in the correct order.
3074
b864ba9b 3075However this depends on the values having the same type - if, for
3076example, the values of a where clause may either have values
3077(resulting in sql of the form C<column = ?> with a single bind
3078value), or alternatively the values might be C<undef> (resulting in
3079sql of the form C<column IS NULL> with no bind value) then the
3080caching technique suggested will not work.
96449e8e 3081
32eab2da 3082=head1 FORMBUILDER
3083
3084If you use my C<CGI::FormBuilder> module at all, you'll hopefully
3085really like this part (I do, at least). Building up a complex query
3086can be as simple as the following:
3087
3088 #!/usr/bin/perl
3089
46dc2f3e 3090 use warnings;
3091 use strict;
3092
32eab2da 3093 use CGI::FormBuilder;
3094 use SQL::Abstract;
3095
3096 my $form = CGI::FormBuilder->new(...);
3097 my $sql = SQL::Abstract->new;
3098
3099 if ($form->submitted) {
3100 my $field = $form->field;
3101 my $id = delete $field->{id};
3102 my($stmt, @bind) = $sql->update('table', $field, {id => $id});
3103 }
3104
3105Of course, you would still have to connect using C<DBI> to run the
3106query, but the point is that if you make your form look like your
3107table, the actual query script can be extremely simplistic.
3108
3109If you're B<REALLY> lazy (I am), check out C<HTML::QuickTable> for
9d48860e 3110a fast interface to returning and formatting data. I frequently
32eab2da 3111use these three modules together to write complex database query
3112apps in under 50 lines.
3113
af733667 3114=head1 HOW TO CONTRIBUTE
3115
3116Contributions are always welcome, in all usable forms (we especially
3117welcome documentation improvements). The delivery methods include git-
3118or unified-diff formatted patches, GitHub pull requests, or plain bug
3119reports either via RT or the Mailing list. Contributors are generally
3120granted full access to the official repository after their first several
3121patches pass successful review.
3122
3123This project is maintained in a git repository. The code and related tools are
3124accessible at the following locations:
d8cc1792 3125
3126=over
3127
af733667 3128=item * Official repo: L<git://git.shadowcat.co.uk/dbsrgits/SQL-Abstract.git>
3129
3130=item * Official gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/SQL-Abstract.git>
3131
3132=item * GitHub mirror: L<https://github.com/dbsrgits/sql-abstract>
d8cc1792 3133
af733667 3134=item * Authorized committers: L<ssh://dbsrgits@git.shadowcat.co.uk/SQL-Abstract.git>
d8cc1792 3135
3136=back
32eab2da 3137
96449e8e 3138=head1 CHANGES
3139
3140Version 1.50 was a major internal refactoring of C<SQL::Abstract>.
3141Great care has been taken to preserve the I<published> behavior
3142documented in previous versions in the 1.* family; however,
9d48860e 3143some features that were previously undocumented, or behaved
96449e8e 3144differently from the documentation, had to be changed in order
3145to clarify the semantics. Hence, client code that was relying
9d48860e 3146on some dark areas of C<SQL::Abstract> v1.*
96449e8e 3147B<might behave differently> in v1.50.
32eab2da 3148
be21dde3 3149The main changes are:
d2a8fe1a 3150
96449e8e 3151=over
32eab2da 3152
9d48860e 3153=item *
32eab2da 3154
3ae1c5e2 3155support for literal SQL through the C<< \ [ $sql, @bind ] >> syntax.
96449e8e 3156
3157=item *
3158
145fbfc8 3159support for the { operator => \"..." } construct (to embed literal SQL)
3160
3161=item *
3162
9c37b9c0 3163support for the { operator => \["...", @bind] } construct (to embed literal SQL with bind values)
3164
3165=item *
3166
96449e8e 3167optional support for L<array datatypes|/"Inserting and Updating Arrays">
3168
9d48860e 3169=item *
96449e8e 3170
be21dde3 3171defensive programming: check arguments
96449e8e 3172
3173=item *
3174
3175fixed bug with global logic, which was previously implemented
7cac25e6 3176through global variables yielding side-effects. Prior versions would
96449e8e 3177interpret C<< [ {cond1, cond2}, [cond3, cond4] ] >>
3178as C<< "(cond1 AND cond2) OR (cond3 AND cond4)" >>.
3179Now this is interpreted
3180as C<< "(cond1 AND cond2) OR (cond3 OR cond4)" >>.
3181
96449e8e 3182
3183=item *
3184
3185fixed semantics of _bindtype on array args
3186
9d48860e 3187=item *
96449e8e 3188
3189dropped the C<_anoncopy> of the %where tree. No longer necessary,
3190we just avoid shifting arrays within that tree.
3191
3192=item *
3193
3194dropped the C<_modlogic> function
3195
3196=back
32eab2da 3197
32eab2da 3198=head1 ACKNOWLEDGEMENTS
3199
3200There are a number of individuals that have really helped out with
3201this module. Unfortunately, most of them submitted bugs via CPAN
3202so I have no idea who they are! But the people I do know are:
3203
9d48860e 3204 Ash Berlin (order_by hash term support)
b643abe1 3205 Matt Trout (DBIx::Class support)
32eab2da 3206 Mark Stosberg (benchmarking)
3207 Chas Owens (initial "IN" operator support)
3208 Philip Collins (per-field SQL functions)
3209 Eric Kolve (hashref "AND" support)
3210 Mike Fragassi (enhancements to "BETWEEN" and "LIKE")
3211 Dan Kubb (support for "quote_char" and "name_sep")
f5aab26e 3212 Guillermo Roditi (patch to cleanup "IN" and "BETWEEN", fix and tests for _order_by)
48d9f5f8 3213 Laurent Dami (internal refactoring, extensible list of special operators, literal SQL)
dbdf7648 3214 Norbert Buchmuller (support for literal SQL in hashpair, misc. fixes & tests)
e96c510a 3215 Peter Rabbitson (rewrite of SQLA::Test, misc. fixes & tests)
02288357 3216 Oliver Charles (support for "RETURNING" after "INSERT")
32eab2da 3217
3218Thanks!
3219
32eab2da 3220=head1 SEE ALSO
3221
86298391 3222L<DBIx::Class>, L<DBIx::Abstract>, L<CGI::FormBuilder>, L<HTML::QuickTable>.
32eab2da 3223
32eab2da 3224=head1 AUTHOR
3225
b643abe1 3226Copyright (c) 2001-2007 Nathan Wiger <nwiger@cpan.org>. All Rights Reserved.
3227
3228This module is actively maintained by Matt Trout <mst@shadowcatsystems.co.uk>
32eab2da 3229
abe72f94 3230For support, your best bet is to try the C<DBIx::Class> users mailing list.
3231While not an official support venue, C<DBIx::Class> makes heavy use of
3232C<SQL::Abstract>, and as such list members there are very familiar with
3233how to create queries.
3234
0d067ded 3235=head1 LICENSE
3236
d988ab87 3237This module is free software; you may copy this under the same
3238terms as perl itself (either the GNU General Public License or
3239the Artistic License)
32eab2da 3240
3241=cut