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