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