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