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