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