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