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