handle scalarref in arrayref of table names
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract.pm
1 package SQL::Abstract; # see doc at end of file
2
3 # LDNOTE : this code is heavy refactoring from original SQLA.
4 # Several design decisions will need discussion during
5 # the test / diffusion / acceptance phase; those are marked with flag
6 # 'LDNOTE' (note by laurent.dami AT free.fr)
7
8 use strict;
9 use Carp ();
10 use warnings FATAL => 'all';
11 use List::Util ();
12 use Scalar::Util ();
13 use Data::Query::Constants qw(
14   DQ_IDENTIFIER DQ_OPERATOR DQ_VALUE DQ_LITERAL DQ_JOIN DQ_SELECT DQ_ORDER
15   DQ_WHERE DQ_DELETE DQ_UPDATE DQ_INSERT
16 );
17 use Data::Query::ExprHelpers qw(perl_scalar_value);
18
19 #======================================================================
20 # GLOBALS
21 #======================================================================
22
23 our $VERSION  = '1.72';
24
25 # This would confuse some packagers
26 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
27
28 our $AUTOLOAD;
29
30 # special operators (-in, -between). May be extended/overridden by user.
31 # See section WHERE: BUILTIN SPECIAL OPERATORS below for implementation
32 my @BUILTIN_SPECIAL_OPS = ();
33
34 # unaryish operators - key maps to handler
35 my @BUILTIN_UNARY_OPS = ();
36
37 #======================================================================
38 # DEBUGGING AND ERROR REPORTING
39 #======================================================================
40
41 sub _debug {
42   return unless $_[0]->{debug}; shift; # a little faster
43   my $func = (caller(1))[3];
44   warn "[$func] ", @_, "\n";
45 }
46
47 sub belch (@) {
48   my($func) = (caller(1))[3];
49   Carp::carp "[$func] Warning: ", @_;
50 }
51
52 sub puke (@) {
53   my($func) = (caller(1))[3];
54   Carp::croak "[$func] Fatal: ", @_;
55 }
56
57
58 #======================================================================
59 # NEW
60 #======================================================================
61
62 sub new {
63   my $self = shift;
64   my $class = ref($self) || $self;
65   my %opt = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
66
67   # choose our case by keeping an option around
68   delete $opt{case} if $opt{case} && $opt{case} ne 'lower';
69
70   # default logic for interpreting arrayrefs
71   $opt{logic} = $opt{logic} ? uc $opt{logic} : 'OR';
72
73   # how to return bind vars
74   # LDNOTE: changed nwiger code : why this 'delete' ??
75   # $opt{bindtype} ||= delete($opt{bind_type}) || 'normal';
76   $opt{bindtype} ||= 'normal';
77
78   # default comparison is "=", but can be overridden
79   $opt{cmp} ||= '=';
80
81   # try to recognize which are the 'equality' and 'unequality' ops
82   # (temporary quickfix, should go through a more seasoned API)
83   $opt{equality_op}   = qr/^(\Q$opt{cmp}\E|is|(is\s+)?like)$/i;
84   $opt{inequality_op} = qr/^(!=|<>|(is\s+)?not(\s+like)?)$/i;
85
86   # SQL booleans
87   $opt{sqltrue}  ||= '1=1';
88   $opt{sqlfalse} ||= '0=1';
89
90   # special operators
91   $opt{special_ops} ||= [];
92   # regexes are applied in order, thus push after user-defines
93   push @{$opt{special_ops}}, @BUILTIN_SPECIAL_OPS;
94
95   # unary operators
96   $opt{unary_ops} ||= [];
97   push @{$opt{unary_ops}}, @BUILTIN_UNARY_OPS;
98
99   # rudimentary saniy-check for user supplied bits treated as functions/operators
100   # If a purported  function matches this regular expression, an exception is thrown.
101   # Literal SQL is *NOT* subject to this check, only functions (and column names
102   # when quoting is not in effect)
103
104   # FIXME
105   # need to guard against ()'s in column names too, but this will break tons of
106   # hacks... ideas anyone?
107   $opt{injection_guard} ||= qr/
108     \;
109       |
110     ^ \s* go \s
111   /xmi;
112
113   $opt{name_sep} ||= '.';
114
115   $opt{renderer} ||= do {
116     require Data::Query::Renderer::SQL::Naive;
117     my ($always, $chars);
118     for ($opt{quote_char}) {
119       $chars = defined() ? (ref() ? $_ : [$_]) : ['',''];
120       $always = defined;
121     }
122     Data::Query::Renderer::SQL::Naive->new({
123       quote_chars => $chars, always_quote => $always,
124       ($opt{case} ? (lc_keywords => 1) : ()), # always 'lower' if it exists
125     });
126   };
127
128   return bless \%opt, $class;
129 }
130
131 sub _render_dq {
132   my ($self, $dq) = @_;
133   if (!$dq) {
134     return '';
135   }
136   my ($sql, @bind) = @{$self->{renderer}->render($dq)};
137   wantarray ?
138     ($self->{bindtype} eq 'normal'
139       ? ($sql, map $_->{value}, @bind)
140       : ($sql, map [ $_->{value_meta}, $_->{value} ], @bind)
141     )
142     : $sql;
143 }
144
145 sub _literal_to_dq {
146   my ($self, $literal) = @_;
147   my @bind;
148   ($literal, @bind) = @$literal if ref($literal) eq 'ARRAY';
149   +{
150     type => DQ_LITERAL,
151     subtype => 'SQL',
152     literal => $literal,
153     (@bind ? (values => [ $self->_bind_to_dq(@bind) ]) : ()),
154   };
155 }
156
157 sub _bind_to_dq {
158   my ($self, @bind) = @_;
159   return unless @bind;
160   $self->{bindtype} eq 'normal'
161     ? map perl_scalar_value($_), @bind
162     : do {
163         $self->_assert_bindval_matches_bindtype(@bind);
164         map perl_scalar_value(reverse @$_), @bind
165       }
166 }
167
168 sub _value_to_dq {
169   my ($self, $value) = @_;
170   $self->_maybe_convert_dq(perl_scalar_value($value, our $Cur_Col_Meta));
171 }
172
173 sub _ident_to_dq {
174   my ($self, $ident) = @_;
175   $self->_assert_pass_injection_guard($ident)
176     unless $self->{renderer}{always_quote};
177   $self->_maybe_convert_dq({
178     type => DQ_IDENTIFIER,
179     elements => [ split /\Q$self->{name_sep}/, $ident ],
180   });
181 }
182
183 sub _maybe_convert_dq {
184   my ($self, $dq) = @_;
185   if (my $c = $self->{where_convert}) {
186     +{
187        type => DQ_OPERATOR,
188        operator => { 'SQL.Naive' => 'apply' },
189        args => [
190          { type => DQ_IDENTIFIER, elements => [ $self->_sqlcase($c) ] },
191          $dq
192        ]
193      };
194   } else {
195     $dq;
196   }
197 }
198
199 sub _op_to_dq {
200   my ($self, $op, @args) = @_;
201   $self->_assert_pass_injection_guard($op);
202   +{
203     type => DQ_OPERATOR,
204     operator => { 'SQL.Naive' => $op },
205     args => \@args
206   };
207 }
208
209 sub _assert_pass_injection_guard {
210   if ($_[1] =~ $_[0]->{injection_guard}) {
211     my $class = ref $_[0];
212     puke "Possible SQL injection attempt '$_[1]'. If this is indeed a part of the "
213      . "desired SQL use literal SQL ( \'...' or \[ '...' ] ) or supply your own "
214      . "{injection_guard} attribute to ${class}->new()"
215   }
216 }
217
218
219 #======================================================================
220 # INSERT methods
221 #======================================================================
222
223 sub insert {
224   my $self = shift;
225   $self->_render_dq($self->_insert_to_dq(@_));
226 }
227
228 sub _insert_to_dq {
229   my ($self, $table, $data, $options) = @_;
230   my (@names, @values);
231   if (ref($data) eq 'HASH') {
232     @names = sort keys %$data;
233     foreach my $k (@names) {
234       local our $Cur_Col_Meta = $k;
235       push @values, $self->_mutation_rhs_to_dq($data->{$k});
236     }
237   } elsif (ref($data) eq 'ARRAY') {
238     local our $Cur_Col_Meta;
239     @values = map $self->_mutation_rhs_to_dq($_), @$data;
240   } else {
241     die "Not handled yet";
242   }
243   my $returning;
244   if (my $r_source = $options->{returning}) {
245     $returning = [
246       map +(ref($_) ? $self->_expr_to_dq($_) : $self->_ident_to_dq($_)),
247         (ref($r_source) eq 'ARRAY' ? @$r_source : $r_source),
248     ];
249   }
250   +{
251     type => DQ_INSERT,
252     target => $self->_ident_to_dq($table),
253     (@names ? (names => [ map $self->_ident_to_dq($_), @names ]) : ()),
254     values => [ \@values ],
255     ($returning ? (returning => $returning) : ()),
256   };
257 }
258
259 sub _mutation_rhs_to_dq {
260   my ($self, $v) = @_;
261   if (ref($v) eq 'ARRAY') {
262     if ($self->{array_datatypes}) {
263       return $self->_value_to_dq($v);
264     }
265     $v = \do { my $x = $v };
266   }
267   if (ref($v) eq 'HASH') {
268     my ($op, $arg, @rest) = %$v;
269
270     puke 'Operator calls in update/insert must be in the form { -op => $arg }'
271       if (@rest or not $op =~ /^\-(.+)/);
272   }
273   return $self->_expr_to_dq($v);
274 }
275
276 #======================================================================
277 # UPDATE methods
278 #======================================================================
279
280
281 sub update {
282   my $self = shift;
283   $self->_render_dq($self->_update_to_dq(@_));
284 }
285
286 sub _update_to_dq {
287   my ($self, $table, $data, $where) = @_;
288
289   puke "Unsupported data type specified to \$sql->update"
290     unless ref $data eq 'HASH';
291
292   my @set;
293
294   foreach my $k (sort keys %$data) {
295     my $v = $data->{$k};
296     local our $Cur_Col_Meta = $k;
297     push @set, [ $self->_ident_to_dq($k), $self->_mutation_rhs_to_dq($v) ];
298   }
299
300   return +{
301     type => DQ_UPDATE,
302     target => $self->_ident_to_dq($table),
303     set => \@set,
304     where => $self->_where_to_dq($where),
305   };
306 }
307
308
309 #======================================================================
310 # SELECT
311 #======================================================================
312
313 sub _source_to_dq {
314   my ($self, $table, $where) = @_;
315
316   my $source_dq = $self->_table_to_dq($table);
317
318   if (my $where_dq = $self->_where_to_dq($where)) {
319     $source_dq = {
320       type => DQ_WHERE,
321       from => $source_dq,
322       where => $where_dq,
323     };
324   }
325
326   $source_dq;
327 }
328
329 sub select {
330   my $self   = shift;
331   return $self->_render_dq($self->_select_to_dq(@_));
332 }
333
334 sub _select_to_dq {
335   my ($self, $table, $fields, $where, $order) = @_;
336   $fields ||= '*';
337
338   my $source_dq = $self->_source_to_dq($table, $where);
339
340   my $final_dq = {
341     type => DQ_SELECT,
342     select => [
343       map $self->_ident_to_dq($_),
344         ref($fields) eq 'ARRAY' ? @$fields : $fields
345     ],
346     from => $source_dq,
347   };
348
349   if ($order) {
350     $final_dq = $self->_order_by_to_dq($order, undef, $final_dq);
351   }
352
353   return $final_dq;
354 }
355
356 #======================================================================
357 # DELETE
358 #======================================================================
359
360
361 sub delete {
362   my $self  = shift;
363   $self->_render_dq($self->_delete_to_dq(@_));
364 }
365
366 sub _delete_to_dq {
367   my ($self, $table, $where) = @_;
368   +{
369     type => DQ_DELETE,
370     target => $self->_table_to_dq($table),
371     where => $self->_where_to_dq($where),
372   }
373 }
374
375
376 #======================================================================
377 # WHERE: entry point
378 #======================================================================
379
380
381
382 # Finally, a separate routine just to handle WHERE clauses
383 sub where {
384   my ($self, $where, $order) = @_;
385
386   my $sql = '';
387   my @bind;
388
389   # where ?
390   ($sql, @bind) = $self->_recurse_where($where) if defined($where);
391   $sql = $sql ? $self->_sqlcase(' where ') . "( $sql )" : '';
392
393   # order by?
394   if ($order) {
395     $sql .= $self->_order_by($order);
396   }
397
398   return wantarray ? ($sql, @bind) : $sql;
399 }
400
401 sub _recurse_where {
402   my ($self, $where, $logic) = @_;
403
404   return $self->_render_dq($self->_where_to_dq($where, $logic));
405 }
406
407 sub _where_to_dq {
408   my ($self, $where, $logic) = @_;
409
410   return undef unless defined($where);
411
412   # turn the convert misfeature on - only used in WHERE clauses
413   local $self->{where_convert} = $self->{convert};
414
415   return $self->_expr_to_dq($where, $logic);
416 }
417
418 sub _expr_to_dq {
419   my ($self, $where, $logic) = @_;
420
421   if (ref($where) eq 'ARRAY') {
422     return $self->_expr_to_dq_ARRAYREF($where, $logic);
423   } elsif (ref($where) eq 'HASH') {
424     return $self->_expr_to_dq_HASHREF($where, $logic);
425   } elsif (
426     ref($where) eq 'SCALAR'
427     or (ref($where) eq 'REF' and ref($$where) eq 'ARRAY')
428   ) {
429     return $self->_literal_to_dq($$where);
430   } elsif (!ref($where) or Scalar::Util::blessed($where)) {
431     return $self->_value_to_dq($where);
432   }
433   die "Can't handle $where";
434 }
435
436 sub _expr_to_dq_ARRAYREF {
437   my ($self, $where, $logic) = @_;
438
439   $logic = uc($logic || $self->{logic} || 'OR');
440   $logic eq 'AND' or $logic eq 'OR' or puke "unknown logic: $logic";
441
442   return unless @$where;
443
444   my ($first, @rest) = @$where;
445
446   return $self->_expr_to_dq($first) unless @rest;
447
448   my $first_dq = do {
449     if (!ref($first)) {
450       $self->_where_hashpair_to_dq($first => shift(@rest));
451     } else {
452       $self->_expr_to_dq($first);
453     }
454   };
455
456   return $self->_expr_to_dq_ARRAYREF(\@rest, $logic) unless $first_dq;
457
458   $self->_op_to_dq(
459     $logic, $first_dq, $self->_expr_to_dq_ARRAYREF(\@rest, $logic)
460   );
461 }
462
463 sub _expr_to_dq_HASHREF {
464   my ($self, $where, $logic) = @_;
465
466   $logic = uc($logic) if $logic;
467
468   my @dq = map {
469     $self->_where_hashpair_to_dq($_ => $where->{$_}, $logic)
470   } sort keys %$where;
471
472   return $dq[0] unless @dq > 1;
473
474   my $final = pop(@dq);
475
476   foreach my $dq (reverse @dq) {
477     $final = $self->_op_to_dq($logic||'AND', $dq, $final);
478   }
479
480   return $final;
481 }
482
483 sub _where_to_dq_SCALAR {
484   shift->_value_to_dq(@_);
485 }
486
487 sub _where_op_IDENT {
488   my $self = shift;
489   my ($op, $rhs) = splice @_, -2;
490   if (ref $rhs) {
491     puke "-$op takes a single scalar argument (a quotable identifier)";
492   }
493
494   # in case we are called as a top level special op (no '=')
495   my $lhs = shift;
496
497   $_ = $self->_convert($self->_quote($_)) for ($lhs, $rhs);
498
499   return $lhs
500     ? "$lhs = $rhs"
501     : $rhs
502   ;
503 }
504
505 sub _where_op_VALUE {
506   my $self = shift;
507   my ($op, $rhs) = splice @_, -2;
508
509   # in case we are called as a top level special op (no '=')
510   my $lhs = shift;
511
512   my @bind =
513     $self->_bindtype (
514       ($lhs || $self->{_nested_func_lhs}),
515       $rhs,
516     )
517   ;
518
519   return $lhs
520     ? (
521       $self->_convert($self->_quote($lhs)) . ' = ' . $self->_convert('?'),
522       @bind
523     )
524     : (
525       $self->_convert('?'),
526       @bind,
527     )
528   ;
529 }
530
531 sub _where_hashpair_to_dq {
532   my ($self, $k, $v, $logic) = @_;
533
534   if ($k =~ /^-(.*)/s) {
535     my $op = uc($1);
536     if ($op eq 'AND' or $op eq 'OR') {
537       return $self->_expr_to_dq($v, $op);
538     } elsif ($op eq 'NEST') {
539       return $self->_expr_to_dq($v);
540     } elsif ($op eq 'NOT') {
541       return $self->_op_to_dq(NOT => $self->_expr_to_dq($v));
542     } elsif ($op eq 'BOOL') {
543       return ref($v) ? $self->_expr_to_dq($v) : $self->_ident_to_dq($v);
544     } elsif ($op eq 'NOT_BOOL') {
545       return $self->_op_to_dq(
546         NOT => ref($v) ? $self->_expr_to_dq($v) : $self->_ident_to_dq($v)
547       );
548     } elsif ($op =~ /^(?:AND|OR|NEST)_?\d+/) {
549       die "Use of [and|or|nest]_N modifiers is no longer supported";
550     } else {
551       my @args = do {
552         if (ref($v) eq 'HASH' and keys(%$v) == 1 and (keys %$v)[0] =~ /^-(.*)/s) {
553           my $op = uc($1);
554           my ($inner) = values %$v;
555           $self->_op_to_dq(
556             $op,
557             (map $self->_expr_to_dq($_),
558               (ref($inner) eq 'ARRAY' ? @$inner : $inner))
559           );
560         } else {
561           (map $self->_expr_to_dq($_), (ref($v) eq 'ARRAY' ? @$v : $v))
562         }
563       };
564       $self->_assert_pass_injection_guard($op);
565       return $self->_op_to_dq(
566         apply => $self->_ident_to_dq($op), @args
567       );
568     }
569   } else {
570     local our $Cur_Col_Meta = $k;
571     if (ref($v) eq 'ARRAY') {
572       if (!@$v) {
573         return $self->_literal_to_dq($self->{sqlfalse});
574       } elsif (defined($v->[0]) && $v->[0] =~ /-(and|or)/i) {
575         return $self->_expr_to_dq_ARRAYREF([
576           map +{ $k => $_ }, @{$v}[1..$#$v]
577         ], uc($1));
578       }
579       return $self->_expr_to_dq_ARRAYREF([
580         map +{ $k => $_ }, @$v
581       ], $logic);
582     } elsif (ref($v) eq 'SCALAR' or (ref($v) eq 'REF' and ref($$v) eq 'ARRAY')) {
583       return +{
584         type => DQ_LITERAL,
585         subtype => 'SQL',
586         parts => [ $self->_ident_to_dq($k), $self->_literal_to_dq($$v) ]
587       };
588     }
589     my ($op, $rhs) = do {
590       if (ref($v) eq 'HASH') {
591         if (keys %$v > 1) {
592           return $self->_expr_to_dq_ARRAYREF([
593             map +{ $k => { $_ => $v->{$_} } }, sort keys %$v
594           ], $logic||'AND');
595         }
596         my ($op, $value) = %$v;
597         s/^-//, s/_/ /g for $op;
598         if ($op =~ /^(and|or)$/i) {
599           return $self->_expr_to_dq({ $k => $value }, $op);
600         } elsif (
601           my $special_op = List::Util::first {$op =~ $_->{regex}}
602                              @{$self->{special_ops}}
603         ) {
604           return $self->_literal_to_dq(
605             [ $self->${\$special_op->{handler}}($k, $op, $value) ]
606           );;
607         } elsif ($op =~ /^(?:AND|OR|NEST)_?\d+$/i) {
608           die "Use of [and|or|nest]_N modifiers is no longer supported";
609         }
610         (uc($op), $value);
611       } else {
612         ($self->{cmp}, $v);
613       }
614     };
615     if ($op eq 'BETWEEN' or $op eq 'IN' or $op eq 'NOT IN' or $op eq 'NOT BETWEEN') {
616       if (ref($rhs) ne 'ARRAY') {
617         if ($op =~ /IN$/) {
618           # have to add parens if none present because -in => \"SELECT ..."
619           # got documented. mst hates everything.
620           if (ref($rhs) eq 'SCALAR') {
621             my $x = $$rhs;
622             1 while ($x =~ s/\A\s*\((.*)\)\s*\Z/$1/s);
623             $rhs = \$x;
624           } else {
625             my ($x, @rest) = @{$$rhs};
626             1 while ($x =~ s/\A\s*\((.*)\)\s*\Z/$1/s);
627             $rhs = \[ $x, @rest ];
628           }
629         }
630         return $self->_op_to_dq(
631           $op, $self->_ident_to_dq($k), $self->_literal_to_dq($$rhs)
632         );
633       }
634       return $self->_literal_to_dq($self->{sqlfalse}) unless @$rhs;
635       return $self->_op_to_dq(
636         $op, $self->_ident_to_dq($k), map $self->_expr_to_dq($_), @$rhs
637       )
638     } elsif ($op =~ s/^NOT (?!LIKE)//) {
639       return $self->_where_hashpair_to_dq(-not => { $k => { $op => $rhs } });
640     } elsif (!defined($rhs)) {
641       my $null_op = do {
642         if ($op eq '=' or $op eq 'LIKE') {
643           'IS NULL'
644         } elsif ($op eq '!=') {
645           'IS NOT NULL'
646         } else {
647           die "Can't do undef -> NULL transform for operator ${op}";
648         }
649       };
650       return $self->_op_to_dq($null_op, $self->_ident_to_dq($k));
651     }
652     if (ref($rhs) eq 'ARRAY') {
653       if (!@$rhs) {
654         return $self->_literal_to_dq(
655           $op eq '!=' ? $self->{sqltrue} : $self->{sqlfalse}
656         );
657       } elsif (defined($rhs->[0]) and $rhs->[0] =~ /^-(and|or)$/i) {
658         return $self->_expr_to_dq_ARRAYREF([
659           map +{ $k => { $op => $_ } }, @{$rhs}[1..$#$rhs]
660         ], uc($1));
661       } elsif ($op =~ /^-(?:AND|OR|NEST)_?\d+/) {
662         die "Use of [and|or|nest]_N modifiers is no longer supported";
663       }
664       return $self->_expr_to_dq_ARRAYREF([
665         map +{ $k => { $op => $_ } }, @$rhs
666       ]);
667     }
668     return $self->_op_to_dq(
669       $op, $self->_ident_to_dq($k), $self->_expr_to_dq($rhs)
670     );
671   }
672 }
673
674 #======================================================================
675 # ORDER BY
676 #======================================================================
677
678 sub _order_by {
679   my ($self, $arg) = @_;
680   if (my $dq = $self->_order_by_to_dq($arg)) {
681     # SQLA generates ' ORDER BY foo'. The hilarity.
682     wantarray
683       ? do { my @r = $self->_render_dq($dq); $r[0] = ' '.$r[0]; @r }
684       : ' '.$self->_render_dq($dq);
685   } else {
686     '';
687   }
688 }
689
690 sub _order_by_to_dq {
691   my ($self, $arg, $dir, $from) = @_;
692
693   return unless $arg;
694
695   my $dq = {
696     type => DQ_ORDER,
697     ($dir ? (direction => $dir) : ()),
698     ($from ? (from => $from) : ()),
699   };
700
701   if (!ref($arg)) {
702     $dq->{by} = $self->_ident_to_dq($arg);
703   } elsif (ref($arg) eq 'ARRAY') {
704     return unless @$arg;
705     local our $Order_Inner unless our $Order_Recursing;
706     local $Order_Recursing = 1;
707     my ($outer, $inner);
708     foreach my $member (@$arg) {
709       local $Order_Inner;
710       my $next = $self->_order_by_to_dq($member, $dir, $from);
711       $outer ||= $next;
712       $inner->{from} = $next if $inner;
713       $inner = $Order_Inner || $next;
714     }
715     $Order_Inner = $inner;
716     return $outer;
717   } elsif (ref($arg) eq 'REF' and ref($$arg) eq 'ARRAY') {
718     $dq->{by} = $self->_literal_to_dq($$arg);
719   } elsif (ref($arg) eq 'SCALAR') {
720     $dq->{by} = $self->_literal_to_dq($$arg);
721   } elsif (ref($arg) eq 'HASH') {
722     my ($key, $val, @rest) = %$arg;
723
724     return unless $key;
725
726     if (@rest or not $key =~ /^-(desc|asc)/i) {
727       puke "hash passed to _order_by must have exactly one key (-desc or -asc)";
728     }
729     my $dir = uc $1;
730     return $self->_order_by_to_dq($val, $dir, $from);
731   } else {
732     die "Can't handle $arg in _order_by_to_dq";
733   }
734   return $dq;
735 }
736
737 #======================================================================
738 # DATASOURCE (FOR NOW, JUST PLAIN TABLE OR LIST OF TABLES)
739 #======================================================================
740
741 sub _table  {
742   my ($self, $from) = @_;
743   $self->_render_dq($self->_table_to_dq($from));
744 }
745
746 sub _table_to_dq {
747   my ($self, $from) = @_;
748   if (ref($from) eq 'ARRAY') {
749     die "Empty FROM list" unless my @f = @$from;
750     my $dq = $self->_table_to_dq(shift @f);
751     while (my $x = shift @f) {
752       $dq = {
753         type => DQ_JOIN,
754         join => [ $dq, $self->_table_to_dq($x) ]
755       };
756     }
757     $dq;
758   } elsif (ref($from) eq 'SCALAR') {
759     +{
760       type => DQ_LITERAL,
761       subtype => 'SQL',
762       literal => $$from
763     }
764   } else {
765     $self->_ident_to_dq($from);
766   }
767 }
768
769
770 #======================================================================
771 # UTILITY FUNCTIONS
772 #======================================================================
773
774 # highly optimized, as it's called way too often
775 sub _quote {
776   # my ($self, $label) = @_;
777
778   return '' unless defined $_[1];
779   return ${$_[1]} if ref($_[1]) eq 'SCALAR';
780
781   unless ($_[0]->{quote_char}) {
782     $_[0]->_assert_pass_injection_guard($_[1]);
783     return $_[1];
784   }
785
786   my $qref = ref $_[0]->{quote_char};
787   my ($l, $r);
788   if (!$qref) {
789     ($l, $r) = ( $_[0]->{quote_char}, $_[0]->{quote_char} );
790   }
791   elsif ($qref eq 'ARRAY') {
792     ($l, $r) = @{$_[0]->{quote_char}};
793   }
794   else {
795     puke "Unsupported quote_char format: $_[0]->{quote_char}";
796   }
797
798   # parts containing * are naturally unquoted
799   return join( $_[0]->{name_sep}||'', map
800     { $_ eq '*' ? $_ : $l . $_ . $r }
801     ( $_[0]->{name_sep} ? split (/\Q$_[0]->{name_sep}\E/, $_[1] ) : $_[1] )
802   );
803 }
804
805
806 # Conversion, if applicable
807 sub _convert ($) {
808   #my ($self, $arg) = @_;
809
810 # LDNOTE : modified the previous implementation below because
811 # it was not consistent : the first "return" is always an array,
812 # the second "return" is context-dependent. Anyway, _convert
813 # seems always used with just a single argument, so make it a
814 # scalar function.
815 #     return @_ unless $self->{convert};
816 #     my $conv = $self->_sqlcase($self->{convert});
817 #     my @ret = map { $conv.'('.$_.')' } @_;
818 #     return wantarray ? @ret : $ret[0];
819   if ($_[0]->{convert}) {
820     return $_[0]->_sqlcase($_[0]->{convert}) .'(' . $_[1] . ')';
821   }
822   return $_[1];
823 }
824
825 # And bindtype
826 sub _bindtype (@) {
827   #my ($self, $col, @vals) = @_;
828
829   #LDNOTE : changed original implementation below because it did not make
830   # sense when bindtype eq 'columns' and @vals > 1.
831 #  return $self->{bindtype} eq 'columns' ? [ $col, @vals ] : @vals;
832
833   # called often - tighten code
834   return $_[0]->{bindtype} eq 'columns'
835     ? map {[$_[1], $_]} @_[2 .. $#_]
836     : @_[2 .. $#_]
837   ;
838 }
839
840 # Dies if any element of @bind is not in [colname => value] format
841 # if bindtype is 'columns'.
842 sub _assert_bindval_matches_bindtype {
843 #  my ($self, @bind) = @_;
844   my $self = shift;
845   if ($self->{bindtype} eq 'columns') {
846     for (@_) {
847       if (!defined $_ || ref($_) ne 'ARRAY' || @$_ != 2) {
848         puke "bindtype 'columns' selected, you need to pass: [column_name => bind_value]"
849       }
850     }
851   }
852 }
853
854 # Fix SQL case, if so requested
855 sub _sqlcase {
856   # LDNOTE: if $self->{case} is true, then it contains 'lower', so we
857   # don't touch the argument ... crooked logic, but let's not change it!
858   return $_[0]->{case} ? $_[1] : uc($_[1]);
859 }
860
861 #======================================================================
862 # VALUES, GENERATE, AUTOLOAD
863 #======================================================================
864
865 # LDNOTE: original code from nwiger, didn't touch code in that section
866 # I feel the AUTOLOAD stuff should not be the default, it should
867 # only be activated on explicit demand by user.
868
869 sub values {
870     my $self = shift;
871     my $data = shift || return;
872     puke "Argument to ", __PACKAGE__, "->values must be a \\%hash"
873         unless ref $data eq 'HASH';
874
875     my @all_bind;
876     foreach my $k ( sort keys %$data ) {
877         my $v = $data->{$k};
878         local our $Cur_Col_Meta = $k;
879         my ($sql, @bind) = $self->_render_dq(
880             $self->_mutation_rhs_to_dq($v)
881         );
882         push @all_bind, @bind;
883     }
884
885     return @all_bind;
886 }
887
888 sub generate {
889     my $self  = shift;
890
891     my(@sql, @sqlq, @sqlv);
892
893     for (@_) {
894         my $ref = ref $_;
895         if ($ref eq 'HASH') {
896             for my $k (sort keys %$_) {
897                 my $v = $_->{$k};
898                 my $r = ref $v;
899                 my $label = $self->_quote($k);
900                 if ($r eq 'ARRAY') {
901                     # literal SQL with bind
902                     my ($sql, @bind) = @$v;
903                     $self->_assert_bindval_matches_bindtype(@bind);
904                     push @sqlq, "$label = $sql";
905                     push @sqlv, @bind;
906                 } elsif ($r eq 'SCALAR') {
907                     # literal SQL without bind
908                     push @sqlq, "$label = $$v";
909                 } else {
910                     push @sqlq, "$label = ?";
911                     push @sqlv, $self->_bindtype($k, $v);
912                 }
913             }
914             push @sql, $self->_sqlcase('set'), join ', ', @sqlq;
915         } elsif ($ref eq 'ARRAY') {
916             # unlike insert(), assume these are ONLY the column names, i.e. for SQL
917             for my $v (@$_) {
918                 my $r = ref $v;
919                 if ($r eq 'ARRAY') {   # literal SQL with bind
920                     my ($sql, @bind) = @$v;
921                     $self->_assert_bindval_matches_bindtype(@bind);
922                     push @sqlq, $sql;
923                     push @sqlv, @bind;
924                 } elsif ($r eq 'SCALAR') {  # literal SQL without bind
925                     # embedded literal SQL
926                     push @sqlq, $$v;
927                 } else {
928                     push @sqlq, '?';
929                     push @sqlv, $v;
930                 }
931             }
932             push @sql, '(' . join(', ', @sqlq) . ')';
933         } elsif ($ref eq 'SCALAR') {
934             # literal SQL
935             push @sql, $$_;
936         } else {
937             # strings get case twiddled
938             push @sql, $self->_sqlcase($_);
939         }
940     }
941
942     my $sql = join ' ', @sql;
943
944     # this is pretty tricky
945     # if ask for an array, return ($stmt, @bind)
946     # otherwise, s/?/shift @sqlv/ to put it inline
947     if (wantarray) {
948         return ($sql, @sqlv);
949     } else {
950         1 while $sql =~ s/\?/my $d = shift(@sqlv);
951                              ref $d ? $d->[1] : $d/e;
952         return $sql;
953     }
954 }
955
956
957 sub DESTROY { 1 }
958
959 #sub AUTOLOAD {
960 #    # This allows us to check for a local, then _form, attr
961 #    my $self = shift;
962 #    my($name) = $AUTOLOAD =~ /.*::(.+)/;
963 #    return $self->generate($name, @_);
964 #}
965
966 1;
967
968
969
970 __END__
971
972 =head1 NAME
973
974 SQL::Abstract - Generate SQL from Perl data structures
975
976 =head1 SYNOPSIS
977
978     use SQL::Abstract;
979
980     my $sql = SQL::Abstract->new;
981
982     my($stmt, @bind) = $sql->select($table, \@fields, \%where, \@order);
983
984     my($stmt, @bind) = $sql->insert($table, \%fieldvals || \@values);
985
986     my($stmt, @bind) = $sql->update($table, \%fieldvals, \%where);
987
988     my($stmt, @bind) = $sql->delete($table, \%where);
989
990     # Then, use these in your DBI statements
991     my $sth = $dbh->prepare($stmt);
992     $sth->execute(@bind);
993
994     # Just generate the WHERE clause
995     my($stmt, @bind) = $sql->where(\%where, \@order);
996
997     # Return values in the same order, for hashed queries
998     # See PERFORMANCE section for more details
999     my @bind = $sql->values(\%fieldvals);
1000
1001 =head1 DESCRIPTION
1002
1003 This module was inspired by the excellent L<DBIx::Abstract>.
1004 However, in using that module I found that what I really wanted
1005 to do was generate SQL, but still retain complete control over my
1006 statement handles and use the DBI interface. So, I set out to
1007 create an abstract SQL generation module.
1008
1009 While based on the concepts used by L<DBIx::Abstract>, there are
1010 several important differences, especially when it comes to WHERE
1011 clauses. I have modified the concepts used to make the SQL easier
1012 to generate from Perl data structures and, IMO, more intuitive.
1013 The underlying idea is for this module to do what you mean, based
1014 on the data structures you provide it. The big advantage is that
1015 you don't have to modify your code every time your data changes,
1016 as this module figures it out.
1017
1018 To begin with, an SQL INSERT is as easy as just specifying a hash
1019 of C<key=value> pairs:
1020
1021     my %data = (
1022         name => 'Jimbo Bobson',
1023         phone => '123-456-7890',
1024         address => '42 Sister Lane',
1025         city => 'St. Louis',
1026         state => 'Louisiana',
1027     );
1028
1029 The SQL can then be generated with this:
1030
1031     my($stmt, @bind) = $sql->insert('people', \%data);
1032
1033 Which would give you something like this:
1034
1035     $stmt = "INSERT INTO people
1036                     (address, city, name, phone, state)
1037                     VALUES (?, ?, ?, ?, ?)";
1038     @bind = ('42 Sister Lane', 'St. Louis', 'Jimbo Bobson',
1039              '123-456-7890', 'Louisiana');
1040
1041 These are then used directly in your DBI code:
1042
1043     my $sth = $dbh->prepare($stmt);
1044     $sth->execute(@bind);
1045
1046 =head2 Inserting and Updating Arrays
1047
1048 If your database has array types (like for example Postgres),
1049 activate the special option C<< array_datatypes => 1 >>
1050 when creating the C<SQL::Abstract> object.
1051 Then you may use an arrayref to insert and update database array types:
1052
1053     my $sql = SQL::Abstract->new(array_datatypes => 1);
1054     my %data = (
1055         planets => [qw/Mercury Venus Earth Mars/]
1056     );
1057
1058     my($stmt, @bind) = $sql->insert('solar_system', \%data);
1059
1060 This results in:
1061
1062     $stmt = "INSERT INTO solar_system (planets) VALUES (?)"
1063
1064     @bind = (['Mercury', 'Venus', 'Earth', 'Mars']);
1065
1066
1067 =head2 Inserting and Updating SQL
1068
1069 In order to apply SQL functions to elements of your C<%data> you may
1070 specify a reference to an arrayref for the given hash value. For example,
1071 if you need to execute the Oracle C<to_date> function on a value, you can
1072 say something like this:
1073
1074     my %data = (
1075         name => 'Bill',
1076         date_entered => \["to_date(?,'MM/DD/YYYY')", "03/02/2003"],
1077     );
1078
1079 The first value in the array is the actual SQL. Any other values are
1080 optional and would be included in the bind values array. This gives
1081 you:
1082
1083     my($stmt, @bind) = $sql->insert('people', \%data);
1084
1085     $stmt = "INSERT INTO people (name, date_entered)
1086                 VALUES (?, to_date(?,'MM/DD/YYYY'))";
1087     @bind = ('Bill', '03/02/2003');
1088
1089 An UPDATE is just as easy, all you change is the name of the function:
1090
1091     my($stmt, @bind) = $sql->update('people', \%data);
1092
1093 Notice that your C<%data> isn't touched; the module will generate
1094 the appropriately quirky SQL for you automatically. Usually you'll
1095 want to specify a WHERE clause for your UPDATE, though, which is
1096 where handling C<%where> hashes comes in handy...
1097
1098 =head2 Complex where statements
1099
1100 This module can generate pretty complicated WHERE statements
1101 easily. For example, simple C<key=value> pairs are taken to mean
1102 equality, and if you want to see if a field is within a set
1103 of values, you can use an arrayref. Let's say we wanted to
1104 SELECT some data based on this criteria:
1105
1106     my %where = (
1107        requestor => 'inna',
1108        worker => ['nwiger', 'rcwe', 'sfz'],
1109        status => { '!=', 'completed' }
1110     );
1111
1112     my($stmt, @bind) = $sql->select('tickets', '*', \%where);
1113
1114 The above would give you something like this:
1115
1116     $stmt = "SELECT * FROM tickets WHERE
1117                 ( requestor = ? ) AND ( status != ? )
1118                 AND ( worker = ? OR worker = ? OR worker = ? )";
1119     @bind = ('inna', 'completed', 'nwiger', 'rcwe', 'sfz');
1120
1121 Which you could then use in DBI code like so:
1122
1123     my $sth = $dbh->prepare($stmt);
1124     $sth->execute(@bind);
1125
1126 Easy, eh?
1127
1128 =head1 FUNCTIONS
1129
1130 The functions are simple. There's one for each major SQL operation,
1131 and a constructor you use first. The arguments are specified in a
1132 similar order to each function (table, then fields, then a where
1133 clause) to try and simplify things.
1134
1135
1136
1137
1138 =head2 new(option => 'value')
1139
1140 The C<new()> function takes a list of options and values, and returns
1141 a new B<SQL::Abstract> object which can then be used to generate SQL
1142 through the methods below. The options accepted are:
1143
1144 =over
1145
1146 =item case
1147
1148 If set to 'lower', then SQL will be generated in all lowercase. By
1149 default SQL is generated in "textbook" case meaning something like:
1150
1151     SELECT a_field FROM a_table WHERE some_field LIKE '%someval%'
1152
1153 Any setting other than 'lower' is ignored.
1154
1155 =item cmp
1156
1157 This determines what the default comparison operator is. By default
1158 it is C<=>, meaning that a hash like this:
1159
1160     %where = (name => 'nwiger', email => 'nate@wiger.org');
1161
1162 Will generate SQL like this:
1163
1164     WHERE name = 'nwiger' AND email = 'nate@wiger.org'
1165
1166 However, you may want loose comparisons by default, so if you set
1167 C<cmp> to C<like> you would get SQL such as:
1168
1169     WHERE name like 'nwiger' AND email like 'nate@wiger.org'
1170
1171 You can also override the comparsion on an individual basis - see
1172 the huge section on L</"WHERE CLAUSES"> at the bottom.
1173
1174 =item sqltrue, sqlfalse
1175
1176 Expressions for inserting boolean values within SQL statements.
1177 By default these are C<1=1> and C<1=0>. They are used
1178 by the special operators C<-in> and C<-not_in> for generating
1179 correct SQL even when the argument is an empty array (see below).
1180
1181 =item logic
1182
1183 This determines the default logical operator for multiple WHERE
1184 statements in arrays or hashes. If absent, the default logic is "or"
1185 for arrays, and "and" for hashes. This means that a WHERE
1186 array of the form:
1187
1188     @where = (
1189         event_date => {'>=', '2/13/99'},
1190         event_date => {'<=', '4/24/03'},
1191     );
1192
1193 will generate SQL like this:
1194
1195     WHERE event_date >= '2/13/99' OR event_date <= '4/24/03'
1196
1197 This is probably not what you want given this query, though (look
1198 at the dates). To change the "OR" to an "AND", simply specify:
1199
1200     my $sql = SQL::Abstract->new(logic => 'and');
1201
1202 Which will change the above C<WHERE> to:
1203
1204     WHERE event_date >= '2/13/99' AND event_date <= '4/24/03'
1205
1206 The logic can also be changed locally by inserting
1207 a modifier in front of an arrayref :
1208
1209     @where = (-and => [event_date => {'>=', '2/13/99'},
1210                        event_date => {'<=', '4/24/03'} ]);
1211
1212 See the L</"WHERE CLAUSES"> section for explanations.
1213
1214 =item convert
1215
1216 This will automatically convert comparisons using the specified SQL
1217 function for both column and value. This is mostly used with an argument
1218 of C<upper> or C<lower>, so that the SQL will have the effect of
1219 case-insensitive "searches". For example, this:
1220
1221     $sql = SQL::Abstract->new(convert => 'upper');
1222     %where = (keywords => 'MaKe iT CAse inSeNSItive');
1223
1224 Will turn out the following SQL:
1225
1226     WHERE upper(keywords) like upper('MaKe iT CAse inSeNSItive')
1227
1228 The conversion can be C<upper()>, C<lower()>, or any other SQL function
1229 that can be applied symmetrically to fields (actually B<SQL::Abstract> does
1230 not validate this option; it will just pass through what you specify verbatim).
1231
1232 =item bindtype
1233
1234 This is a kludge because many databases suck. For example, you can't
1235 just bind values using DBI's C<execute()> for Oracle C<CLOB> or C<BLOB> fields.
1236 Instead, you have to use C<bind_param()>:
1237
1238     $sth->bind_param(1, 'reg data');
1239     $sth->bind_param(2, $lots, {ora_type => ORA_CLOB});
1240
1241 The problem is, B<SQL::Abstract> will normally just return a C<@bind> array,
1242 which loses track of which field each slot refers to. Fear not.
1243
1244 If you specify C<bindtype> in new, you can determine how C<@bind> is returned.
1245 Currently, you can specify either C<normal> (default) or C<columns>. If you
1246 specify C<columns>, you will get an array that looks like this:
1247
1248     my $sql = SQL::Abstract->new(bindtype => 'columns');
1249     my($stmt, @bind) = $sql->insert(...);
1250
1251     @bind = (
1252         [ 'column1', 'value1' ],
1253         [ 'column2', 'value2' ],
1254         [ 'column3', 'value3' ],
1255     );
1256
1257 You can then iterate through this manually, using DBI's C<bind_param()>.
1258
1259     $sth->prepare($stmt);
1260     my $i = 1;
1261     for (@bind) {
1262         my($col, $data) = @$_;
1263         if ($col eq 'details' || $col eq 'comments') {
1264             $sth->bind_param($i, $data, {ora_type => ORA_CLOB});
1265         } elsif ($col eq 'image') {
1266             $sth->bind_param($i, $data, {ora_type => ORA_BLOB});
1267         } else {
1268             $sth->bind_param($i, $data);
1269         }
1270         $i++;
1271     }
1272     $sth->execute;      # execute without @bind now
1273
1274 Now, why would you still use B<SQL::Abstract> if you have to do this crap?
1275 Basically, the advantage is still that you don't have to care which fields
1276 are or are not included. You could wrap that above C<for> loop in a simple
1277 sub called C<bind_fields()> or something and reuse it repeatedly. You still
1278 get a layer of abstraction over manual SQL specification.
1279
1280 Note that if you set L</bindtype> to C<columns>, the C<\[$sql, @bind]>
1281 construct (see L</Literal SQL with placeholders and bind values (subqueries)>)
1282 will expect the bind values in this format.
1283
1284 =item quote_char
1285
1286 This is the character that a table or column name will be quoted
1287 with.  By default this is an empty string, but you could set it to
1288 the character C<`>, to generate SQL like this:
1289
1290   SELECT `a_field` FROM `a_table` WHERE `some_field` LIKE '%someval%'
1291
1292 Alternatively, you can supply an array ref of two items, the first being the left
1293 hand quote character, and the second the right hand quote character. For
1294 example, you could supply C<['[',']']> for SQL Server 2000 compliant quotes
1295 that generates SQL like this:
1296
1297   SELECT [a_field] FROM [a_table] WHERE [some_field] LIKE '%someval%'
1298
1299 Quoting is useful if you have tables or columns names that are reserved
1300 words in your database's SQL dialect.
1301
1302 =item name_sep
1303
1304 This is the character that separates a table and column name.  It is
1305 necessary to specify this when the C<quote_char> option is selected,
1306 so that tables and column names can be individually quoted like this:
1307
1308   SELECT `table`.`one_field` FROM `table` WHERE `table`.`other_field` = 1
1309
1310 =item injection_guard
1311
1312 A regular expression C<qr/.../> that is applied to any C<-function> and unquoted
1313 column name specified in a query structure. This is a safety mechanism to avoid
1314 injection attacks when mishandling user input e.g.:
1315
1316   my %condition_as_column_value_pairs = get_values_from_user();
1317   $sqla->select( ... , \%condition_as_column_value_pairs );
1318
1319 If the expression matches an exception is thrown. Note that literal SQL
1320 supplied via C<\'...'> or C<\['...']> is B<not> checked in any way.
1321
1322 Defaults to checking for C<;> and the C<GO> keyword (TransactSQL)
1323
1324 =item array_datatypes
1325
1326 When this option is true, arrayrefs in INSERT or UPDATE are
1327 interpreted as array datatypes and are passed directly
1328 to the DBI layer.
1329 When this option is false, arrayrefs are interpreted
1330 as literal SQL, just like refs to arrayrefs
1331 (but this behavior is for backwards compatibility; when writing
1332 new queries, use the "reference to arrayref" syntax
1333 for literal SQL).
1334
1335
1336 =item special_ops
1337
1338 Takes a reference to a list of "special operators"
1339 to extend the syntax understood by L<SQL::Abstract>.
1340 See section L</"SPECIAL OPERATORS"> for details.
1341
1342 =item unary_ops
1343
1344 Takes a reference to a list of "unary operators"
1345 to extend the syntax understood by L<SQL::Abstract>.
1346 See section L</"UNARY OPERATORS"> for details.
1347
1348
1349
1350 =back
1351
1352 =head2 insert($table, \@values || \%fieldvals, \%options)
1353
1354 This is the simplest function. You simply give it a table name
1355 and either an arrayref of values or hashref of field/value pairs.
1356 It returns an SQL INSERT statement and a list of bind values.
1357 See the sections on L</"Inserting and Updating Arrays"> and
1358 L</"Inserting and Updating SQL"> for information on how to insert
1359 with those data types.
1360
1361 The optional C<\%options> hash reference may contain additional
1362 options to generate the insert SQL. Currently supported options
1363 are:
1364
1365 =over 4
1366
1367 =item returning
1368
1369 Takes either a scalar of raw SQL fields, or an array reference of
1370 field names, and adds on an SQL C<RETURNING> statement at the end.
1371 This allows you to return data generated by the insert statement
1372 (such as row IDs) without performing another C<SELECT> statement.
1373 Note, however, this is not part of the SQL standard and may not
1374 be supported by all database engines.
1375
1376 =back
1377
1378 =head2 update($table, \%fieldvals, \%where)
1379
1380 This takes a table, hashref of field/value pairs, and an optional
1381 hashref L<WHERE clause|/WHERE CLAUSES>. It returns an SQL UPDATE function and a list
1382 of bind values.
1383 See the sections on L</"Inserting and Updating Arrays"> and
1384 L</"Inserting and Updating SQL"> for information on how to insert
1385 with those data types.
1386
1387 =head2 select($source, $fields, $where, $order)
1388
1389 This returns a SQL SELECT statement and associated list of bind values, as
1390 specified by the arguments  :
1391
1392 =over
1393
1394 =item $source
1395
1396 Specification of the 'FROM' part of the statement.
1397 The argument can be either a plain scalar (interpreted as a table
1398 name, will be quoted), or an arrayref (interpreted as a list
1399 of table names, joined by commas, quoted), or a scalarref
1400 (literal table name, not quoted), or a ref to an arrayref
1401 (list of literal table names, joined by commas, not quoted).
1402
1403 =item $fields
1404
1405 Specification of the list of fields to retrieve from
1406 the source.
1407 The argument can be either an arrayref (interpreted as a list
1408 of field names, will be joined by commas and quoted), or a
1409 plain scalar (literal SQL, not quoted).
1410 Please observe that this API is not as flexible as for
1411 the first argument C<$table>, for backwards compatibility reasons.
1412
1413 =item $where
1414
1415 Optional argument to specify the WHERE part of the query.
1416 The argument is most often a hashref, but can also be
1417 an arrayref or plain scalar --
1418 see section L<WHERE clause|/"WHERE CLAUSES"> for details.
1419
1420 =item $order
1421
1422 Optional argument to specify the ORDER BY part of the query.
1423 The argument can be a scalar, a hashref or an arrayref
1424 -- see section L<ORDER BY clause|/"ORDER BY CLAUSES">
1425 for details.
1426
1427 =back
1428
1429
1430 =head2 delete($table, \%where)
1431
1432 This takes a table name and optional hashref L<WHERE clause|/WHERE CLAUSES>.
1433 It returns an SQL DELETE statement and list of bind values.
1434
1435 =head2 where(\%where, \@order)
1436
1437 This is used to generate just the WHERE clause. For example,
1438 if you have an arbitrary data structure and know what the
1439 rest of your SQL is going to look like, but want an easy way
1440 to produce a WHERE clause, use this. It returns an SQL WHERE
1441 clause and list of bind values.
1442
1443
1444 =head2 values(\%data)
1445
1446 This just returns the values from the hash C<%data>, in the same
1447 order that would be returned from any of the other above queries.
1448 Using this allows you to markedly speed up your queries if you
1449 are affecting lots of rows. See below under the L</"PERFORMANCE"> section.
1450
1451 =head2 generate($any, 'number', $of, \@data, $struct, \%types)
1452
1453 Warning: This is an experimental method and subject to change.
1454
1455 This returns arbitrarily generated SQL. It's a really basic shortcut.
1456 It will return two different things, depending on return context:
1457
1458     my($stmt, @bind) = $sql->generate('create table', \$table, \@fields);
1459     my $stmt_and_val = $sql->generate('create table', \$table, \@fields);
1460
1461 These would return the following:
1462
1463     # First calling form
1464     $stmt = "CREATE TABLE test (?, ?)";
1465     @bind = (field1, field2);
1466
1467     # Second calling form
1468     $stmt_and_val = "CREATE TABLE test (field1, field2)";
1469
1470 Depending on what you're trying to do, it's up to you to choose the correct
1471 format. In this example, the second form is what you would want.
1472
1473 By the same token:
1474
1475     $sql->generate('alter session', { nls_date_format => 'MM/YY' });
1476
1477 Might give you:
1478
1479     ALTER SESSION SET nls_date_format = 'MM/YY'
1480
1481 You get the idea. Strings get their case twiddled, but everything
1482 else remains verbatim.
1483
1484 =head1 WHERE CLAUSES
1485
1486 =head2 Introduction
1487
1488 This module uses a variation on the idea from L<DBIx::Abstract>. It
1489 is B<NOT>, repeat I<not> 100% compatible. B<The main logic of this
1490 module is that things in arrays are OR'ed, and things in hashes
1491 are AND'ed.>
1492
1493 The easiest way to explain is to show lots of examples. After
1494 each C<%where> hash shown, it is assumed you used:
1495
1496     my($stmt, @bind) = $sql->where(\%where);
1497
1498 However, note that the C<%where> hash can be used directly in any
1499 of the other functions as well, as described above.
1500
1501 =head2 Key-value pairs
1502
1503 So, let's get started. To begin, a simple hash:
1504
1505     my %where  = (
1506         user   => 'nwiger',
1507         status => 'completed'
1508     );
1509
1510 Is converted to SQL C<key = val> statements:
1511
1512     $stmt = "WHERE user = ? AND status = ?";
1513     @bind = ('nwiger', 'completed');
1514
1515 One common thing I end up doing is having a list of values that
1516 a field can be in. To do this, simply specify a list inside of
1517 an arrayref:
1518
1519     my %where  = (
1520         user   => 'nwiger',
1521         status => ['assigned', 'in-progress', 'pending'];
1522     );
1523
1524 This simple code will create the following:
1525
1526     $stmt = "WHERE user = ? AND ( status = ? OR status = ? OR status = ? )";
1527     @bind = ('nwiger', 'assigned', 'in-progress', 'pending');
1528
1529 A field associated to an empty arrayref will be considered a
1530 logical false and will generate 0=1.
1531
1532 =head2 Tests for NULL values
1533
1534 If the value part is C<undef> then this is converted to SQL <IS NULL>
1535
1536     my %where  = (
1537         user   => 'nwiger',
1538         status => undef,
1539     );
1540
1541 becomes:
1542
1543     $stmt = "WHERE user = ? AND status IS NULL";
1544     @bind = ('nwiger');
1545
1546 To test if a column IS NOT NULL:
1547
1548     my %where  = (
1549         user   => 'nwiger',
1550         status => { '!=', undef },
1551     );
1552
1553 =head2 Specific comparison operators
1554
1555 If you want to specify a different type of operator for your comparison,
1556 you can use a hashref for a given column:
1557
1558     my %where  = (
1559         user   => 'nwiger',
1560         status => { '!=', 'completed' }
1561     );
1562
1563 Which would generate:
1564
1565     $stmt = "WHERE user = ? AND status != ?";
1566     @bind = ('nwiger', 'completed');
1567
1568 To test against multiple values, just enclose the values in an arrayref:
1569
1570     status => { '=', ['assigned', 'in-progress', 'pending'] };
1571
1572 Which would give you:
1573
1574     "WHERE status = ? OR status = ? OR status = ?"
1575
1576
1577 The hashref can also contain multiple pairs, in which case it is expanded
1578 into an C<AND> of its elements:
1579
1580     my %where  = (
1581         user   => 'nwiger',
1582         status => { '!=', 'completed', -not_like => 'pending%' }
1583     );
1584
1585     # Or more dynamically, like from a form
1586     $where{user} = 'nwiger';
1587     $where{status}{'!='} = 'completed';
1588     $where{status}{'-not_like'} = 'pending%';
1589
1590     # Both generate this
1591     $stmt = "WHERE user = ? AND status != ? AND status NOT LIKE ?";
1592     @bind = ('nwiger', 'completed', 'pending%');
1593
1594
1595 To get an OR instead, you can combine it with the arrayref idea:
1596
1597     my %where => (
1598          user => 'nwiger',
1599          priority => [ { '=', 2 }, { '>', 5 } ]
1600     );
1601
1602 Which would generate:
1603
1604     $stmt = "WHERE ( priority = ? OR priority > ? ) AND user = ?";
1605     @bind = ('2', '5', 'nwiger');
1606
1607 If you want to include literal SQL (with or without bind values), just use a
1608 scalar reference or array reference as the value:
1609
1610     my %where  = (
1611         date_entered => { '>' => \["to_date(?, 'MM/DD/YYYY')", "11/26/2008"] },
1612         date_expires => { '<' => \"now()" }
1613     );
1614
1615 Which would generate:
1616
1617     $stmt = "WHERE date_entered > "to_date(?, 'MM/DD/YYYY') AND date_expires < now()";
1618     @bind = ('11/26/2008');
1619
1620
1621 =head2 Logic and nesting operators
1622
1623 In the example above,
1624 there is a subtle trap if you want to say something like
1625 this (notice the C<AND>):
1626
1627     WHERE priority != ? AND priority != ?
1628
1629 Because, in Perl you I<can't> do this:
1630
1631     priority => { '!=', 2, '!=', 1 }
1632
1633 As the second C<!=> key will obliterate the first. The solution
1634 is to use the special C<-modifier> form inside an arrayref:
1635
1636     priority => [ -and => {'!=', 2},
1637                           {'!=', 1} ]
1638
1639
1640 Normally, these would be joined by C<OR>, but the modifier tells it
1641 to use C<AND> instead. (Hint: You can use this in conjunction with the
1642 C<logic> option to C<new()> in order to change the way your queries
1643 work by default.) B<Important:> Note that the C<-modifier> goes
1644 B<INSIDE> the arrayref, as an extra first element. This will
1645 B<NOT> do what you think it might:
1646
1647     priority => -and => [{'!=', 2}, {'!=', 1}]   # WRONG!
1648
1649 Here is a quick list of equivalencies, since there is some overlap:
1650
1651     # Same
1652     status => {'!=', 'completed', 'not like', 'pending%' }
1653     status => [ -and => {'!=', 'completed'}, {'not like', 'pending%'}]
1654
1655     # Same
1656     status => {'=', ['assigned', 'in-progress']}
1657     status => [ -or => {'=', 'assigned'}, {'=', 'in-progress'}]
1658     status => [ {'=', 'assigned'}, {'=', 'in-progress'} ]
1659
1660
1661
1662 =head2 Special operators : IN, BETWEEN, etc.
1663
1664 You can also use the hashref format to compare a list of fields using the
1665 C<IN> comparison operator, by specifying the list as an arrayref:
1666
1667     my %where  = (
1668         status   => 'completed',
1669         reportid => { -in => [567, 2335, 2] }
1670     );
1671
1672 Which would generate:
1673
1674     $stmt = "WHERE status = ? AND reportid IN (?,?,?)";
1675     @bind = ('completed', '567', '2335', '2');
1676
1677 The reverse operator C<-not_in> generates SQL C<NOT IN> and is used in
1678 the same way.
1679
1680 If the argument to C<-in> is an empty array, 'sqlfalse' is generated
1681 (by default : C<1=0>). Similarly, C<< -not_in => [] >> generates
1682 'sqltrue' (by default : C<1=1>).
1683
1684 In addition to the array you can supply a chunk of literal sql or
1685 literal sql with bind:
1686
1687     my %where = {
1688       customer => { -in => \[
1689         'SELECT cust_id FROM cust WHERE balance > ?',
1690         2000,
1691       ],
1692       status => { -in => \'SELECT status_codes FROM states' },
1693     };
1694
1695 would generate:
1696
1697     $stmt = "WHERE (
1698           customer IN ( SELECT cust_id FROM cust WHERE balance > ? )
1699       AND status IN ( SELECT status_codes FROM states )
1700     )";
1701     @bind = ('2000');
1702
1703
1704
1705 Another pair of operators is C<-between> and C<-not_between>,
1706 used with an arrayref of two values:
1707
1708     my %where  = (
1709         user   => 'nwiger',
1710         completion_date => {
1711            -not_between => ['2002-10-01', '2003-02-06']
1712         }
1713     );
1714
1715 Would give you:
1716
1717     WHERE user = ? AND completion_date NOT BETWEEN ( ? AND ? )
1718
1719 Just like with C<-in> all plausible combinations of literal SQL
1720 are possible:
1721
1722     my %where = {
1723       start0 => { -between => [ 1, 2 ] },
1724       start1 => { -between => \["? AND ?", 1, 2] },
1725       start2 => { -between => \"lower(x) AND upper(y)" },
1726       start3 => { -between => [
1727         \"lower(x)",
1728         \["upper(?)", 'stuff' ],
1729       ] },
1730     };
1731
1732 Would give you:
1733
1734     $stmt = "WHERE (
1735           ( start0 BETWEEN ? AND ?                )
1736       AND ( start1 BETWEEN ? AND ?                )
1737       AND ( start2 BETWEEN lower(x) AND upper(y)  )
1738       AND ( start3 BETWEEN lower(x) AND upper(?)  )
1739     )";
1740     @bind = (1, 2, 1, 2, 'stuff');
1741
1742
1743 These are the two builtin "special operators"; but the
1744 list can be expanded : see section L</"SPECIAL OPERATORS"> below.
1745
1746 =head2 Unary operators: bool
1747
1748 If you wish to test against boolean columns or functions within your
1749 database you can use the C<-bool> and C<-not_bool> operators. For
1750 example to test the column C<is_user> being true and the column
1751 C<is_enabled> being false you would use:-
1752
1753     my %where  = (
1754         -bool       => 'is_user',
1755         -not_bool   => 'is_enabled',
1756     );
1757
1758 Would give you:
1759
1760     WHERE is_user AND NOT is_enabled
1761
1762 If a more complex combination is required, testing more conditions,
1763 then you should use the and/or operators:-
1764
1765     my %where  = (
1766         -and           => [
1767             -bool      => 'one',
1768             -bool      => 'two',
1769             -bool      => 'three',
1770             -not_bool  => 'four',
1771         ],
1772     );
1773
1774 Would give you:
1775
1776     WHERE one AND two AND three AND NOT four
1777
1778
1779 =head2 Nested conditions, -and/-or prefixes
1780
1781 So far, we've seen how multiple conditions are joined with a top-level
1782 C<AND>.  We can change this by putting the different conditions we want in
1783 hashes and then putting those hashes in an array. For example:
1784
1785     my @where = (
1786         {
1787             user   => 'nwiger',
1788             status => { -like => ['pending%', 'dispatched'] },
1789         },
1790         {
1791             user   => 'robot',
1792             status => 'unassigned',
1793         }
1794     );
1795
1796 This data structure would create the following:
1797
1798     $stmt = "WHERE ( user = ? AND ( status LIKE ? OR status LIKE ? ) )
1799                 OR ( user = ? AND status = ? ) )";
1800     @bind = ('nwiger', 'pending', 'dispatched', 'robot', 'unassigned');
1801
1802
1803 Clauses in hashrefs or arrayrefs can be prefixed with an C<-and> or C<-or>
1804 to change the logic inside :
1805
1806     my @where = (
1807          -and => [
1808             user => 'nwiger',
1809             [
1810                 -and => [ workhrs => {'>', 20}, geo => 'ASIA' ],
1811                 -or => { workhrs => {'<', 50}, geo => 'EURO' },
1812             ],
1813         ],
1814     );
1815
1816 That would yield:
1817
1818     WHERE ( user = ? AND (
1819                ( workhrs > ? AND geo = ? )
1820             OR ( workhrs < ? OR geo = ? )
1821           ) )
1822
1823 =head3 Algebraic inconsistency, for historical reasons
1824
1825 C<Important note>: when connecting several conditions, the C<-and->|C<-or>
1826 operator goes C<outside> of the nested structure; whereas when connecting
1827 several constraints on one column, the C<-and> operator goes
1828 C<inside> the arrayref. Here is an example combining both features :
1829
1830    my @where = (
1831      -and => [a => 1, b => 2],
1832      -or  => [c => 3, d => 4],
1833       e   => [-and => {-like => 'foo%'}, {-like => '%bar'} ]
1834    )
1835
1836 yielding
1837
1838   WHERE ( (    ( a = ? AND b = ? )
1839             OR ( c = ? OR d = ? )
1840             OR ( e LIKE ? AND e LIKE ? ) ) )
1841
1842 This difference in syntax is unfortunate but must be preserved for
1843 historical reasons. So be careful : the two examples below would
1844 seem algebraically equivalent, but they are not
1845
1846   {col => [-and => {-like => 'foo%'}, {-like => '%bar'}]}
1847   # yields : WHERE ( ( col LIKE ? AND col LIKE ? ) )
1848
1849   [-and => {col => {-like => 'foo%'}, {col => {-like => '%bar'}}]]
1850   # yields : WHERE ( ( col LIKE ? OR col LIKE ? ) )
1851
1852
1853 =head2 Literal SQL and value type operators
1854
1855 The basic premise of SQL::Abstract is that in WHERE specifications the "left
1856 side" is a column name and the "right side" is a value (normally rendered as
1857 a placeholder). This holds true for both hashrefs and arrayref pairs as you
1858 see in the L</WHERE CLAUSES> examples above. Sometimes it is necessary to
1859 alter this behavior. There are several ways of doing so.
1860
1861 =head3 -ident
1862
1863 This is a virtual operator that signals the string to its right side is an
1864 identifier (a column name) and not a value. For example to compare two
1865 columns you would write:
1866
1867     my %where = (
1868         priority => { '<', 2 },
1869         requestor => { -ident => 'submitter' },
1870     );
1871
1872 which creates:
1873
1874     $stmt = "WHERE priority < ? AND requestor = submitter";
1875     @bind = ('2');
1876
1877 If you are maintaining legacy code you may see a different construct as
1878 described in L</Deprecated usage of Literal SQL>, please use C<-ident> in new
1879 code.
1880
1881 =head3 -value
1882
1883 This is a virtual operator that signals that the construct to its right side
1884 is a value to be passed to DBI. This is for example necessary when you want
1885 to write a where clause against an array (for RDBMS that support such
1886 datatypes). For example:
1887
1888     my %where = (
1889         array => { -value => [1, 2, 3] }
1890     );
1891
1892 will result in:
1893
1894     $stmt = 'WHERE array = ?';
1895     @bind = ([1, 2, 3]);
1896
1897 Note that if you were to simply say:
1898
1899     my %where = (
1900         array => [1, 2, 3]
1901     );
1902
1903 the result would porbably be not what you wanted:
1904
1905     $stmt = 'WHERE array = ? OR array = ? OR array = ?';
1906     @bind = (1, 2, 3);
1907
1908 =head3 Literal SQL
1909
1910 Finally, sometimes only literal SQL will do. To include a random snippet
1911 of SQL verbatim, you specify it as a scalar reference. Consider this only
1912 as a last resort. Usually there is a better way. For example:
1913
1914     my %where = (
1915         priority => { '<', 2 },
1916         requestor => { -in => \'(SELECT name FROM hitmen)' },
1917     );
1918
1919 Would create:
1920
1921     $stmt = "WHERE priority < ? AND requestor IN (SELECT name FROM hitmen)"
1922     @bind = (2);
1923
1924 Note that in this example, you only get one bind parameter back, since
1925 the verbatim SQL is passed as part of the statement.
1926
1927 =head4 CAVEAT
1928
1929   Never use untrusted input as a literal SQL argument - this is a massive
1930   security risk (there is no way to check literal snippets for SQL
1931   injections and other nastyness). If you need to deal with untrusted input
1932   use literal SQL with placeholders as described next.
1933
1934 =head3 Literal SQL with placeholders and bind values (subqueries)
1935
1936 If the literal SQL to be inserted has placeholders and bind values,
1937 use a reference to an arrayref (yes this is a double reference --
1938 not so common, but perfectly legal Perl). For example, to find a date
1939 in Postgres you can use something like this:
1940
1941     my %where = (
1942        date_column => \[q/= date '2008-09-30' - ?::integer/, 10/]
1943     )
1944
1945 This would create:
1946
1947     $stmt = "WHERE ( date_column = date '2008-09-30' - ?::integer )"
1948     @bind = ('10');
1949
1950 Note that you must pass the bind values in the same format as they are returned
1951 by L</where>. That means that if you set L</bindtype> to C<columns>, you must
1952 provide the bind values in the C<< [ column_meta => value ] >> format, where
1953 C<column_meta> is an opaque scalar value; most commonly the column name, but
1954 you can use any scalar value (including references and blessed references),
1955 L<SQL::Abstract> will simply pass it through intact. So if C<bindtype> is set
1956 to C<columns> the above example will look like:
1957
1958     my %where = (
1959        date_column => \[q/= date '2008-09-30' - ?::integer/, [ dummy => 10 ]/]
1960     )
1961
1962 Literal SQL is especially useful for nesting parenthesized clauses in the
1963 main SQL query. Here is a first example :
1964
1965   my ($sub_stmt, @sub_bind) = ("SELECT c1 FROM t1 WHERE c2 < ? AND c3 LIKE ?",
1966                                100, "foo%");
1967   my %where = (
1968     foo => 1234,
1969     bar => \["IN ($sub_stmt)" => @sub_bind],
1970   );
1971
1972 This yields :
1973
1974   $stmt = "WHERE (foo = ? AND bar IN (SELECT c1 FROM t1
1975                                              WHERE c2 < ? AND c3 LIKE ?))";
1976   @bind = (1234, 100, "foo%");
1977
1978 Other subquery operators, like for example C<"E<gt> ALL"> or C<"NOT IN">,
1979 are expressed in the same way. Of course the C<$sub_stmt> and
1980 its associated bind values can be generated through a former call
1981 to C<select()> :
1982
1983   my ($sub_stmt, @sub_bind)
1984      = $sql->select("t1", "c1", {c2 => {"<" => 100},
1985                                  c3 => {-like => "foo%"}});
1986   my %where = (
1987     foo => 1234,
1988     bar => \["> ALL ($sub_stmt)" => @sub_bind],
1989   );
1990
1991 In the examples above, the subquery was used as an operator on a column;
1992 but the same principle also applies for a clause within the main C<%where>
1993 hash, like an EXISTS subquery :
1994
1995   my ($sub_stmt, @sub_bind)
1996      = $sql->select("t1", "*", {c1 => 1, c2 => \"> t0.c0"});
1997   my %where = ( -and => [
1998     foo   => 1234,
1999     \["EXISTS ($sub_stmt)" => @sub_bind],
2000   ]);
2001
2002 which yields
2003
2004   $stmt = "WHERE (foo = ? AND EXISTS (SELECT * FROM t1
2005                                         WHERE c1 = ? AND c2 > t0.c0))";
2006   @bind = (1234, 1);
2007
2008
2009 Observe that the condition on C<c2> in the subquery refers to
2010 column C<t0.c0> of the main query : this is I<not> a bind
2011 value, so we have to express it through a scalar ref.
2012 Writing C<< c2 => {">" => "t0.c0"} >> would have generated
2013 C<< c2 > ? >> with bind value C<"t0.c0"> ... not exactly
2014 what we wanted here.
2015
2016 Finally, here is an example where a subquery is used
2017 for expressing unary negation:
2018
2019   my ($sub_stmt, @sub_bind)
2020      = $sql->where({age => [{"<" => 10}, {">" => 20}]});
2021   $sub_stmt =~ s/^ where //i; # don't want "WHERE" in the subclause
2022   my %where = (
2023         lname  => {like => '%son%'},
2024         \["NOT ($sub_stmt)" => @sub_bind],
2025     );
2026
2027 This yields
2028
2029   $stmt = "lname LIKE ? AND NOT ( age < ? OR age > ? )"
2030   @bind = ('%son%', 10, 20)
2031
2032 =head3 Deprecated usage of Literal SQL
2033
2034 Below are some examples of archaic use of literal SQL. It is shown only as
2035 reference for those who deal with legacy code. Each example has a much
2036 better, cleaner and safer alternative that users should opt for in new code.
2037
2038 =over
2039
2040 =item *
2041
2042     my %where = ( requestor => \'IS NOT NULL' )
2043
2044     $stmt = "WHERE requestor IS NOT NULL"
2045
2046 This used to be the way of generating NULL comparisons, before the handling
2047 of C<undef> got formalized. For new code please use the superior syntax as
2048 described in L</Tests for NULL values>.
2049
2050 =item *
2051
2052     my %where = ( requestor => \'= submitter' )
2053
2054     $stmt = "WHERE requestor = submitter"
2055
2056 This used to be the only way to compare columns. Use the superior L</-ident>
2057 method for all new code. For example an identifier declared in such a way
2058 will be properly quoted if L</quote_char> is properly set, while the legacy
2059 form will remain as supplied.
2060
2061 =item *
2062
2063     my %where = ( is_ready  => \"", completed => { '>', '2012-12-21' } )
2064
2065     $stmt = "WHERE completed > ? AND is_ready"
2066     @bind = ('2012-12-21')
2067
2068 Using an empty string literal used to be the only way to express a boolean.
2069 For all new code please use the much more readable
2070 L<-bool|/Unary operators: bool> operator.
2071
2072 =back
2073
2074 =head2 Conclusion
2075
2076 These pages could go on for a while, since the nesting of the data
2077 structures this module can handle are pretty much unlimited (the
2078 module implements the C<WHERE> expansion as a recursive function
2079 internally). Your best bet is to "play around" with the module a
2080 little to see how the data structures behave, and choose the best
2081 format for your data based on that.
2082
2083 And of course, all the values above will probably be replaced with
2084 variables gotten from forms or the command line. After all, if you
2085 knew everything ahead of time, you wouldn't have to worry about
2086 dynamically-generating SQL and could just hardwire it into your
2087 script.
2088
2089 =head1 ORDER BY CLAUSES
2090
2091 Some functions take an order by clause. This can either be a scalar (just a
2092 column name,) a hash of C<< { -desc => 'col' } >> or C<< { -asc => 'col' } >>,
2093 or an array of either of the two previous forms. Examples:
2094
2095                Given            |         Will Generate
2096     ----------------------------------------------------------
2097                                 |
2098     \'colA DESC'                | ORDER BY colA DESC
2099                                 |
2100     'colA'                      | ORDER BY colA
2101                                 |
2102     [qw/colA colB/]             | ORDER BY colA, colB
2103                                 |
2104     {-asc  => 'colA'}           | ORDER BY colA ASC
2105                                 |
2106     {-desc => 'colB'}           | ORDER BY colB DESC
2107                                 |
2108     ['colA', {-asc => 'colB'}]  | ORDER BY colA, colB ASC
2109                                 |
2110     { -asc => [qw/colA colB/] } | ORDER BY colA ASC, colB ASC
2111                                 |
2112     [                           |
2113       { -asc => 'colA' },       | ORDER BY colA ASC, colB DESC,
2114       { -desc => [qw/colB/],    |          colC ASC, colD ASC
2115       { -asc => [qw/colC colD/],|
2116     ]                           |
2117     ===========================================================
2118
2119
2120
2121 =head1 SPECIAL OPERATORS
2122
2123   my $sqlmaker = SQL::Abstract->new(special_ops => [
2124      {
2125       regex => qr/.../,
2126       handler => sub {
2127         my ($self, $field, $op, $arg) = @_;
2128         ...
2129       },
2130      },
2131      {
2132       regex => qr/.../,
2133       handler => 'method_name',
2134      },
2135    ]);
2136
2137 A "special operator" is a SQL syntactic clause that can be
2138 applied to a field, instead of a usual binary operator.
2139 For example :
2140
2141    WHERE field IN (?, ?, ?)
2142    WHERE field BETWEEN ? AND ?
2143    WHERE MATCH(field) AGAINST (?, ?)
2144
2145 Special operators IN and BETWEEN are fairly standard and therefore
2146 are builtin within C<SQL::Abstract> (as the overridable methods
2147 C<_where_field_IN> and C<_where_field_BETWEEN>). For other operators,
2148 like the MATCH .. AGAINST example above which is specific to MySQL,
2149 you can write your own operator handlers - supply a C<special_ops>
2150 argument to the C<new> method. That argument takes an arrayref of
2151 operator definitions; each operator definition is a hashref with two
2152 entries:
2153
2154 =over
2155
2156 =item regex
2157
2158 the regular expression to match the operator
2159
2160 =item handler
2161
2162 Either a coderef or a plain scalar method name. In both cases
2163 the expected return is C<< ($sql, @bind) >>.
2164
2165 When supplied with a method name, it is simply called on the
2166 L<SQL::Abstract/> object as:
2167
2168  $self->$method_name ($field, $op, $arg)
2169
2170  Where:
2171
2172   $op is the part that matched the handler regex
2173   $field is the LHS of the operator
2174   $arg is the RHS
2175
2176 When supplied with a coderef, it is called as:
2177
2178  $coderef->($self, $field, $op, $arg)
2179
2180
2181 =back
2182
2183 For example, here is an implementation
2184 of the MATCH .. AGAINST syntax for MySQL
2185
2186   my $sqlmaker = SQL::Abstract->new(special_ops => [
2187
2188     # special op for MySql MATCH (field) AGAINST(word1, word2, ...)
2189     {regex => qr/^match$/i,
2190      handler => sub {
2191        my ($self, $field, $op, $arg) = @_;
2192        $arg = [$arg] if not ref $arg;
2193        my $label         = $self->_quote($field);
2194        my ($placeholder) = $self->_convert('?');
2195        my $placeholders  = join ", ", (($placeholder) x @$arg);
2196        my $sql           = $self->_sqlcase('match') . " ($label) "
2197                          . $self->_sqlcase('against') . " ($placeholders) ";
2198        my @bind = $self->_bindtype($field, @$arg);
2199        return ($sql, @bind);
2200        }
2201      },
2202
2203   ]);
2204
2205
2206 =head1 UNARY OPERATORS
2207
2208   my $sqlmaker = SQL::Abstract->new(unary_ops => [
2209      {
2210       regex => qr/.../,
2211       handler => sub {
2212         my ($self, $op, $arg) = @_;
2213         ...
2214       },
2215      },
2216      {
2217       regex => qr/.../,
2218       handler => 'method_name',
2219      },
2220    ]);
2221
2222 A "unary operator" is a SQL syntactic clause that can be
2223 applied to a field - the operator goes before the field
2224
2225 You can write your own operator handlers - supply a C<unary_ops>
2226 argument to the C<new> method. That argument takes an arrayref of
2227 operator definitions; each operator definition is a hashref with two
2228 entries:
2229
2230 =over
2231
2232 =item regex
2233
2234 the regular expression to match the operator
2235
2236 =item handler
2237
2238 Either a coderef or a plain scalar method name. In both cases
2239 the expected return is C<< $sql >>.
2240
2241 When supplied with a method name, it is simply called on the
2242 L<SQL::Abstract/> object as:
2243
2244  $self->$method_name ($op, $arg)
2245
2246  Where:
2247
2248   $op is the part that matched the handler regex
2249   $arg is the RHS or argument of the operator
2250
2251 When supplied with a coderef, it is called as:
2252
2253  $coderef->($self, $op, $arg)
2254
2255
2256 =back
2257
2258
2259 =head1 PERFORMANCE
2260
2261 Thanks to some benchmarking by Mark Stosberg, it turns out that
2262 this module is many orders of magnitude faster than using C<DBIx::Abstract>.
2263 I must admit this wasn't an intentional design issue, but it's a
2264 byproduct of the fact that you get to control your C<DBI> handles
2265 yourself.
2266
2267 To maximize performance, use a code snippet like the following:
2268
2269     # prepare a statement handle using the first row
2270     # and then reuse it for the rest of the rows
2271     my($sth, $stmt);
2272     for my $href (@array_of_hashrefs) {
2273         $stmt ||= $sql->insert('table', $href);
2274         $sth  ||= $dbh->prepare($stmt);
2275         $sth->execute($sql->values($href));
2276     }
2277
2278 The reason this works is because the keys in your C<$href> are sorted
2279 internally by B<SQL::Abstract>. Thus, as long as your data retains
2280 the same structure, you only have to generate the SQL the first time
2281 around. On subsequent queries, simply use the C<values> function provided
2282 by this module to return your values in the correct order.
2283
2284 However this depends on the values having the same type - if, for
2285 example, the values of a where clause may either have values
2286 (resulting in sql of the form C<column = ?> with a single bind
2287 value), or alternatively the values might be C<undef> (resulting in
2288 sql of the form C<column IS NULL> with no bind value) then the
2289 caching technique suggested will not work.
2290
2291 =head1 FORMBUILDER
2292
2293 If you use my C<CGI::FormBuilder> module at all, you'll hopefully
2294 really like this part (I do, at least). Building up a complex query
2295 can be as simple as the following:
2296
2297     #!/usr/bin/perl
2298
2299     use CGI::FormBuilder;
2300     use SQL::Abstract;
2301
2302     my $form = CGI::FormBuilder->new(...);
2303     my $sql  = SQL::Abstract->new;
2304
2305     if ($form->submitted) {
2306         my $field = $form->field;
2307         my $id = delete $field->{id};
2308         my($stmt, @bind) = $sql->update('table', $field, {id => $id});
2309     }
2310
2311 Of course, you would still have to connect using C<DBI> to run the
2312 query, but the point is that if you make your form look like your
2313 table, the actual query script can be extremely simplistic.
2314
2315 If you're B<REALLY> lazy (I am), check out C<HTML::QuickTable> for
2316 a fast interface to returning and formatting data. I frequently
2317 use these three modules together to write complex database query
2318 apps in under 50 lines.
2319
2320 =head1 REPO
2321
2322 =over
2323
2324 =item * gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/SQL-Abstract.git>
2325
2326 =item * git: L<git://git.shadowcat.co.uk/dbsrgits/SQL-Abstract.git>
2327
2328 =back
2329
2330 =head1 CHANGES
2331
2332 Version 1.50 was a major internal refactoring of C<SQL::Abstract>.
2333 Great care has been taken to preserve the I<published> behavior
2334 documented in previous versions in the 1.* family; however,
2335 some features that were previously undocumented, or behaved
2336 differently from the documentation, had to be changed in order
2337 to clarify the semantics. Hence, client code that was relying
2338 on some dark areas of C<SQL::Abstract> v1.*
2339 B<might behave differently> in v1.50.
2340
2341 The main changes are :
2342
2343 =over
2344
2345 =item *
2346
2347 support for literal SQL through the C<< \ [$sql, bind] >> syntax.
2348
2349 =item *
2350
2351 support for the { operator => \"..." } construct (to embed literal SQL)
2352
2353 =item *
2354
2355 support for the { operator => \["...", @bind] } construct (to embed literal SQL with bind values)
2356
2357 =item *
2358
2359 optional support for L<array datatypes|/"Inserting and Updating Arrays">
2360
2361 =item *
2362
2363 defensive programming : check arguments
2364
2365 =item *
2366
2367 fixed bug with global logic, which was previously implemented
2368 through global variables yielding side-effects. Prior versions would
2369 interpret C<< [ {cond1, cond2}, [cond3, cond4] ] >>
2370 as C<< "(cond1 AND cond2) OR (cond3 AND cond4)" >>.
2371 Now this is interpreted
2372 as C<< "(cond1 AND cond2) OR (cond3 OR cond4)" >>.
2373
2374
2375 =item *
2376
2377 fixed semantics of  _bindtype on array args
2378
2379 =item *
2380
2381 dropped the C<_anoncopy> of the %where tree. No longer necessary,
2382 we just avoid shifting arrays within that tree.
2383
2384 =item *
2385
2386 dropped the C<_modlogic> function
2387
2388 =back
2389
2390 =head1 ACKNOWLEDGEMENTS
2391
2392 There are a number of individuals that have really helped out with
2393 this module. Unfortunately, most of them submitted bugs via CPAN
2394 so I have no idea who they are! But the people I do know are:
2395
2396     Ash Berlin (order_by hash term support)
2397     Matt Trout (DBIx::Class support)
2398     Mark Stosberg (benchmarking)
2399     Chas Owens (initial "IN" operator support)
2400     Philip Collins (per-field SQL functions)
2401     Eric Kolve (hashref "AND" support)
2402     Mike Fragassi (enhancements to "BETWEEN" and "LIKE")
2403     Dan Kubb (support for "quote_char" and "name_sep")
2404     Guillermo Roditi (patch to cleanup "IN" and "BETWEEN", fix and tests for _order_by)
2405     Laurent Dami (internal refactoring, extensible list of special operators, literal SQL)
2406     Norbert Buchmuller (support for literal SQL in hashpair, misc. fixes & tests)
2407     Peter Rabbitson (rewrite of SQLA::Test, misc. fixes & tests)
2408     Oliver Charles (support for "RETURNING" after "INSERT")
2409
2410 Thanks!
2411
2412 =head1 SEE ALSO
2413
2414 L<DBIx::Class>, L<DBIx::Abstract>, L<CGI::FormBuilder>, L<HTML::QuickTable>.
2415
2416 =head1 AUTHOR
2417
2418 Copyright (c) 2001-2007 Nathan Wiger <nwiger@cpan.org>. All Rights Reserved.
2419
2420 This module is actively maintained by Matt Trout <mst@shadowcatsystems.co.uk>
2421
2422 For support, your best bet is to try the C<DBIx::Class> users mailing list.
2423 While not an official support venue, C<DBIx::Class> makes heavy use of
2424 C<SQL::Abstract>, and as such list members there are very familiar with
2425 how to create queries.
2426
2427 =head1 LICENSE
2428
2429 This module is free software; you may copy this under the same
2430 terms as perl itself (either the GNU General Public License or
2431 the Artistic License)
2432
2433 =cut
2434