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