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