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