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