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