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