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