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