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