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