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