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