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