8 use DBIC::SqlMakerTest;
10 use DBIx::Class::SQLMaker::MSSQL;
12 use Data::Dumper::Concise;
16 sub unknown_col { +{ dbic_colname => '' } }
26 sqlite => DBICTest->init_schema( no_populate => 1 ),
28 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/};
30 my $s = DBICTest::Schema->connect($dsn, $user, $pass);
31 try { $s->storage->ensure_connected };
33 $s->storage->dbh_do (sub {
34 my ($storage, $dbh) = @_;
35 eval { $dbh->do("DROP TABLE event") };
38 id INT IDENTITY NOT NULL,
39 starts_at DATE NOT NULL,
40 created_on DATETIME NOT NULL,
41 varchar_date VARCHAR(20),
42 varchar_datetime VARCHAR(20),
43 skip_inflation DATETIME,
44 ts_without_tz DATETIME,
49 $dbs_to_test{mssql} = 1;
53 DBICTest->init_schema( no_deploy=> 1, storage_type => '::DBI::MSSQL' )
57 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/};
59 my $s = DBICTest::Schema->connect($dsn, $user, $pass);
60 try { $s->storage->ensure_connected };
62 $s->storage->dbh_do (sub {
63 my ($storage, $dbh) = @_;
64 eval { $dbh->do("DROP TABLE event") };
67 id INT AUTO_INCREMENT NOT NULL,
68 starts_at DATE NOT NULL,
69 created_on DATETIME NOT NULL,
70 varchar_date VARCHAR(20),
71 varchar_datetime VARCHAR(20),
72 skip_inflation DATETIME,
73 ts_without_tz DATETIME,
78 $dbs_to_test{mysql} = 1;
82 DBICTest->init_schema( no_deploy=> 1, storage_type => '::DBI::mysql' )
85 ## copypasta'd for great justice
87 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/};
89 my $s = DBICTest::Schema->connect($dsn, $user, $pass);
90 try { $s->storage->ensure_connected };
92 $s->storage->dbh_do (sub {
93 my ($storage, $dbh) = @_;
94 eval { $dbh->do("DROP TABLE event") };
97 id SERIAL NOT NULL PRIMARY KEY,
98 starts_at DATE NOT NULL,
99 created_on TIMESTAMP NOT NULL,
100 varchar_date VARCHAR(20),
101 varchar_datetime VARCHAR(20),
102 skip_inflation TIMESTAMP,
103 ts_without_tz TIMESTAMP WITHOUT TIME ZONE
106 $dbs_to_test{postgres} = 1;
110 DBICTest->init_schema( no_deploy=> 1, storage_type => '::DBI::Pg' )
114 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_ORA_${_}" } qw/DSN USER PASS/};
116 my $s = DBICTest::Schema->connect($dsn, $user, $pass, { on_connect_call => 'datetime_setup' });
117 try { $s->storage->ensure_connected };
119 $s->storage->dbh_do (sub {
120 my ($storage, $dbh) = @_;
121 eval { $dbh->do("DROP TRIGGER trq_event_id") };
122 eval { $dbh->do("DROP SEQUENCE sq_event_id") };
123 eval { $dbh->do("DROP TABLE event") };
124 $dbh->do('CREATE SEQUENCE sq_event_id');
128 starts_at DATE NOT NULL,
129 created_on TIMESTAMP NOT NULL,
130 varchar_date VARCHAR(20),
131 varchar_datetime VARCHAR(20),
132 skip_inflation TIMESTAMP,
133 ts_without_tz TIMESTAMP,
134 CONSTRAINT PK_EVENT PRIMARY KEY (id)
138 CREATE TRIGGER trg_event_id
139 BEFORE INSERT ON event
141 new.id IS NULL OR new.id = 0
144 SELECT sq_event_id.nextval
149 $dbs_to_test{oracle} = 1;
153 DBICTest->init_schema( no_deploy=> 1, storage_type => '::DBI::Oracle::Generic', on_connect_call => 'datetime_setup' )
158 my %rs = map { $_ => $schema{$_}->resultset('Event') } keys %schema;
160 $rs{sqlite}->populate([
161 [qw(starts_at created_on skip_inflation)],
162 ['2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12'],
163 ['2010-12-12', '2011-12-14 12:12:12', '2011-12-12 12:12:12'],
166 $rs{mssql}->populate([
167 [qw(starts_at created_on skip_inflation)],
168 ['2010-12-12', '2010-12-14 12:12:12.000', '2019-12-12 12:12:12.000'],
169 ['2010-12-12', '2011-12-14 12:12:12.000', '2011-12-12 12:12:12.000'],
170 ]) if $schema{mssql}->storage->connected;
172 $rs{mysql}->populate([
173 [qw(starts_at created_on skip_inflation)],
174 ['2010-12-12', '2010-12-14 12:12:12.000', '2019-12-12 12:12:12.000'],
175 ['2010-12-12', '2011-12-14 12:12:12.000', '2011-12-12 12:12:12.000'],
176 ]) if $schema{mysql}->storage->connected;
178 $rs{postgres}->populate([
179 [qw(starts_at created_on skip_inflation)],
180 ['2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12'],
181 ['2010-12-12', '2011-12-14 12:12:12', '2011-12-12 12:12:12'],
182 ]) if $schema{postgres}->storage->connected;
184 $rs{oracle}->populate([
185 [qw(starts_at created_on skip_inflation)],
186 ['2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12'],
187 ['2010-12-12', '2011-12-14 12:12:12', '2011-12-12 12:12:12'],
188 ]) if $schema{oracle}->storage->connected;
190 my $date = DateTime->new(
203 skip_inflation => $_[2]
207 my $date2 = $date->clone->set_day(16);
210 ## search => { dbic_search_code/params }
211 ## rdbms_name => literal_sql
215 search => { 'me.created_on' => { -dt => $date } },
217 select => 'me.starts_at, me.created_on, me.skip_inflation',
218 where => 'me.created_on = ?',
219 bind => [[{ dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12' ]],
220 hri => [hri_thing('2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12')],
223 select => 'me.starts_at, me.created_on, me.skip_inflation',
224 where => 'me.created_on = ?',
225 bind => [[{ dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12.000' ]],
226 hri => [hri_thing('2010-12-12', '2010-12-14 12:12:12.000', '2019-12-12 12:12:12.000')],
229 select => 'me.starts_at, me.created_on, me.skip_inflation',
230 where => 'me.created_on = ?',
231 bind => [[{ dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12' ]],
232 hri => [hri_thing('2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12')],
235 select => 'me.starts_at, me.created_on, me.skip_inflation',
236 where => 'me.created_on = ?',
237 bind => [[{ dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12' ]],
238 hri => [hri_thing('2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12')],
241 select => 'me.starts_at, me.created_on, me.skip_inflation',
242 where => 'me.created_on = ?',
243 bind => [[{ dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12' ]],
244 hri => [hri_thing('2010-12-12 00:00:00', '2010-12-14 12:12:12.000000', '2019-12-12 12:12:12.000000')],
246 msg => '-dt_now works',
250 search => { 'me.id' => 1 },
251 select => [ [ -dt_year => { -ident => 'me.created_on' } ] ],
254 select => "DATEPART(year, me.created_on)",
255 where => "me.id = ?",
256 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
257 hri => [{ year => 2010 }],
260 select => "EXTRACT(YEAR FROM me.created_on)",
261 where => "me.id = ?",
262 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
263 hri => [{ year => 2010 }],
266 select => "STRFTIME('%Y', me.created_on)",
267 where => "me.id = ?",
268 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
269 hri => [{ year => 2010 }],
272 select => "EXTRACT(year FROM me.created_on)",
273 where => "me.id = ?",
274 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
275 hri => [{ year => 2010 }],
278 select => "EXTRACT(year FROM me.created_on)",
279 where => "me.id = ?",
280 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
281 hri => [{ year => 2010 }],
283 msg => '-dt_year works',
287 msg => '-dt_get (year, month) works',
288 search => { 'me.id' => 1 },
289 select => [ [ -dt_get => [[qw(year month)], { -ident => 'me.created_on' }] ] ],
290 as => [ qw(year month) ],
292 select => "DATEPART(year, me.created_on), DATEPART(month, me.created_on)",
293 where => "me.id = ?",
294 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
295 hri => [{ year => 2010, month => 12 }],
298 select => "EXTRACT(YEAR FROM me.created_on), EXTRACT(MONTH FROM me.created_on)",
299 where => "me.id = ?",
300 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
301 hri => [{ year => 2010, month => 12 }],
304 select => "STRFTIME('%Y', me.created_on), STRFTIME('%m', me.created_on)",
305 where => "me.id = ?",
306 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
307 hri => [{ year => 2010, month => 12 }],
310 select => "EXTRACT(year FROM me.created_on), EXTRACT(month FROM me.created_on)",
311 where => "me.id = ?",
312 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
313 hri => [{ year => 2010, month => 12 }],
316 select => "EXTRACT(year FROM me.created_on), EXTRACT(month FROM me.created_on)",
317 where => "me.id = ?",
318 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
319 hri => [{ year => 2010, month => 12 }],
324 msg => '-dt_month works',
325 search => { 'me.id' => 1 },
326 select => [ [ -dt_month => { -ident => 'me.created_on' } ] ],
329 select => "STRFTIME('%m', me.created_on)",
330 where => "me.id = ?",
331 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
332 hri => [{ month => 12 }],
335 select => "DATEPART(month, me.created_on)",
336 where => "me.id = ?",
337 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
338 hri => [{ month => 12 }],
341 select => "EXTRACT(MONTH FROM me.created_on)",
342 where => "me.id = ?",
343 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
344 hri => [{ month => 12 }],
347 select => "EXTRACT(month FROM me.created_on)",
348 where => "me.id = ?",
349 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
350 hri => [{ month => 12 }],
353 select => "EXTRACT(month FROM me.created_on)",
354 where => "me.id = ?",
355 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
356 hri => [{ month => 12 }],
361 msg => '-dt_day works',
362 search => { 'me.id' => 1 },
363 select => [ [ -dt_day => { -ident => 'me.created_on' } ] ],
366 select => "STRFTIME('%d', me.created_on)",
367 where => "me.id = ?",
368 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
369 hri => [{ day => 14 }],
372 select => "DATEPART(day, me.created_on)",
373 where => "me.id = ?",
374 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
375 hri => [{ day => 14 }],
378 select => "EXTRACT(DAY FROM me.created_on)",
379 where => "me.id = ?",
380 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
381 hri => [{ day => 14 }],
384 select => "EXTRACT(day FROM me.created_on)",
385 where => "me.id = ?",
386 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
387 hri => [{ day => 14 }],
390 select => "EXTRACT(day FROM me.created_on)",
391 where => "me.id = ?",
392 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
393 hri => [{ day => 14 }],
398 msg => '-dt_hour works',
399 search => { 'me.id' => 1 },
400 select => [ [ -dt_hour => { -ident => 'me.created_on' } ] ],
403 select => "STRFTIME('%H', me.created_on)",
404 where => "me.id = ?",
405 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
406 hri => [{ hour => 12 }],
409 select => "DATEPART(hour, me.created_on)",
410 where => "me.id = ?",
411 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
412 hri => [{ hour => 12 }],
415 select => "EXTRACT(HOUR FROM me.created_on)",
416 where => "me.id = ?",
417 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
418 hri => [{ hour => 12 }],
421 select => "EXTRACT(hour FROM me.created_on)",
422 where => "me.id = ?",
423 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
424 hri => [{ hour => 12 }],
427 select => "EXTRACT(hour FROM me.created_on)",
428 where => "me.id = ?",
429 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
430 hri => [{ hour => 12 }],
435 msg => '-dt_minute works',
436 search => { 'me.id' => 1 },
437 select => [ [ -dt_minute => { -ident => 'me.created_on' } ] ],
440 select => "STRFTIME('%M', me.created_on)",
441 where => "me.id = ?",
442 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
443 hri => [{ minute => 12 }],
446 select => "DATEPART(minute, me.created_on)",
447 where => "me.id = ?",
448 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
449 hri => [{ minute => 12 }],
452 select => "EXTRACT(MINUTE FROM me.created_on)",
453 where => "me.id = ?",
454 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
455 hri => [{ minute => 12 }],
458 select => "EXTRACT(minute FROM me.created_on)",
459 where => "me.id = ?",
460 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
461 hri => [{ minute => 12 }],
464 select => "EXTRACT(minute FROM me.created_on)",
465 where => "me.id = ?",
466 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
467 hri => [{ minute => 12 }],
472 msg => '-dt_second works',
473 search => { 'me.id' => 1 },
474 select => [ [ -dt_second => { -ident => 'me.created_on' } ] ],
477 select => "STRFTIME('%S', me.created_on)",
478 where => "me.id = ?",
479 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
480 hri => [{ second => 12 }],
483 select => "DATEPART(second, me.created_on)",
484 where => "me.id = ?",
485 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
486 hri => [{ second => 12 }],
489 select => "EXTRACT(SECOND FROM me.created_on)",
490 where => "me.id = ?",
491 bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
492 hri => [{ second => 12 }],
495 select => "EXTRACT(second FROM me.created_on)",
496 where => "me.id = ?",
497 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
498 hri => [{ second => 12 }],
501 select => "EXTRACT(second FROM me.created_on)",
502 where => "me.id = ?",
503 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
504 hri => [{ second => 12 }],
509 msg => '-dt_diff (second) works',
510 search => { 'me.id' => 2 },
511 select => [ [ -dt_diff => [second => { -ident => 'me.created_on' }, \'me.skip_inflation' ] ] ],
512 as => [ 'sec_diff' ],
514 select => "(STRFTIME('%s', me.created_on) - STRFTIME('%s', me.skip_inflation))",
515 where => "me.id = ?",
516 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
517 hri => [{ sec_diff => 2*24*60*60 }],
520 select => "DATEDIFF(second, me.skip_inflation, me.created_on)",
521 where => "me.id = ?",
522 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
523 hri => [{ sec_diff => 2*24*60*60 }],
526 select => "TIMESTAMPDIFF(SECOND, me.skip_inflation, me.created_on)",
527 where => "me.id = ?",
528 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
529 hri => [{ sec_diff => 2*24*60*60 }],
532 select => "EXTRACT(epoch FROM (me.created_on::timestamp with time zone - me.skip_inflation::timestamp with time zone))",
533 where => "me.id = ?",
534 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
535 hri => [{ sec_diff => 2*24*60*60 }],
538 select => "TRUNC(MONTHS_BETWEEN(me.created_on, me.skip_inflation) * 31 * 24 * 60 * 60)",
539 where => "me.id = ?",
540 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
541 hri => [{ sec_diff => 2*24*60*60 }],
546 msg => '-dt_diff (day) works',
547 search => { 'me.id' => 2 },
548 select => [ [ -dt_diff => [day => { -ident => 'me.created_on' }, \'me.skip_inflation' ] ] ],
549 as => [ 'day_diff' ],
551 select => "(JULIANDAY(me.created_on) - JULIANDAY(me.skip_inflation))",
552 where => "me.id = ?",
553 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
554 hri => [{ day_diff => 2 }],
557 select => "DATEDIFF(dayofyear, me.skip_inflation, me.created_on)",
558 where => "me.id = ?",
559 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
560 hri => [{ day_diff => 2 }],
563 select => "TIMESTAMPDIFF(DAY, me.skip_inflation, me.created_on)",
564 where => "me.id = ?",
565 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
566 hri => [{ day_diff => 2 }],
569 select => "EXTRACT(DAY FROM (me.created_on::timestamp with time zone - me.skip_inflation::timestamp with time zone))",
570 where => "me.id = ?",
571 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
572 hri => [{ day_diff => 2 }],
575 select => "TRUNC(MONTHS_BETWEEN(me.created_on, me.skip_inflation) * 31)",
576 where => "me.id = ?",
577 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
578 hri => [{ day_diff => 2 }],
583 msg => '-dt_diff (year) works',
584 search => { 'me.id' => 2 },
585 select => [ [ -dt_diff => [year => \'me.starts_at', { -ident => 'me.created_on' } ] ] ],
588 exception_like => qr/date diff not supported for part "year" with database "SQLite"/,
591 select => "DATEDIFF(year, me.created_on, me.starts_at)",
592 where => "me.id = ?",
593 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
594 hri => [{ year => -1 }],
597 select => "TIMESTAMPDIFF(YEAR, me.created_on, me.starts_at)",
598 where => "me.id = ?",
599 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
600 hri => [{ year => -1 }],
603 select => "TRUNC(MONTHS_BETWEEN(me.starts_at, me.created_on) / 12)",
604 where => "me.id = ?",
605 bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
606 hri => [{ year => -1 }],
611 msg => '-dt_add (year) works',
612 search => { 'me.id' => 2 },
613 select => [ [ -dt_add => [year => 3, { -ident => 'me.created_on' } ] ] ],
616 select => "(datetime(me.created_on, ? || ' years'))",
617 where => "me.id = ?",
618 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
619 hri => [{ date => '2014-12-14 12:12:12' }],
622 select => "(DATEADD(year, ?, me.created_on))",
623 where => "me.id = ?",
624 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
625 hri => [{ date => '2014-12-14 12:12:12.000' }],
626 skip => 'need working bindtypes',
629 select => "DATE_ADD(me.created_on, INTERVAL ? YEAR)",
630 where => "me.id = ?",
631 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
632 hri => [{ date => '2014-12-14 12:12:12' }],
635 select => "(me.created_on + NUMTOYMINTERVAL(?, 'year'))",
636 where => "me.id = ?",
637 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
638 hri => [{ date => '2014-12-14 12:12:12.000000000' }],
643 msg => '-dt_add (month) works',
644 search => { 'me.id' => 2 },
645 select => [ [ -dt_add => [month => 3, { -ident => 'me.created_on' } ] ] ],
648 select => "(datetime(me.created_on, ? || ' months'))",
649 where => "me.id = ?",
650 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
651 hri => [{ date => '2012-03-14 12:12:12' }],
654 select => "(DATEADD(month, ?, me.created_on))",
655 where => "me.id = ?",
656 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
657 hri => [{ date => '2012-03-14 12:12:12.000' }],
658 skip => 'need working bindtypes',
661 select => "DATE_ADD(me.created_on, INTERVAL ? MONTH)",
662 where => "me.id = ?",
663 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
664 hri => [{ date => '2012-03-14 12:12:12' }],
667 select => "(me.created_on + NUMTOYMINTERVAL(?, 'month'))",
668 where => "me.id = ?",
669 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
670 hri => [{ date => '2012-03-14 12:12:12.000000000' }],
675 msg => '-dt_add (day) works',
676 search => { 'me.id' => 2 },
677 select => [ [ -dt_add => [day => 3, { -ident => 'me.created_on' } ] ] ],
680 select => "(datetime(me.created_on, ? || ' days'))",
681 where => "me.id = ?",
682 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
683 hri => [{ date => '2011-12-17 12:12:12' }],
686 select => "(DATEADD(dayofyear, ?, me.created_on))",
687 where => "me.id = ?",
688 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
689 hri => [{ date => '2011-12-17 12:12:12.000' }],
690 skip => 'need working bindtypes',
693 select => "DATE_ADD(me.created_on, INTERVAL ? DAY)",
694 where => "me.id = ?",
695 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
696 hri => [{ date => '2011-12-17 12:12:12' }],
699 select => "(me.created_on + NUMTODSINTERVAL(?, 'day'))",
700 where => "me.id = ?",
701 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
702 hri => [{ date => '2011-12-17 12:12:12.000000000' }],
707 msg => '-dt_add (hour) works',
708 search => { 'me.id' => 2 },
709 select => [ [ -dt_add => [hour => 3, { -ident => 'me.created_on' } ] ] ],
712 select => "(datetime(me.created_on, ? || ' hours'))",
713 where => "me.id = ?",
714 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
715 hri => [{ date => '2011-12-14 15:12:12' }],
718 select => "(DATEADD(hour, ?, me.created_on))",
719 where => "me.id = ?",
720 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
721 hri => [{ date => '2011-12-14 15:12:12.000' }],
722 skip => 'need working bindtypes',
725 select => "DATE_ADD(me.created_on, INTERVAL ? HOUR)",
726 where => "me.id = ?",
727 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
728 hri => [{ date => '2011-12-14 15:12:12' }],
731 select => "(me.created_on + NUMTODSINTERVAL(?, 'hour'))",
732 where => "me.id = ?",
733 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
734 hri => [{ date => '2011-12-14 15:12:12.000000000' }],
739 msg => '-dt_add (minute) works',
740 search => { 'me.id' => 2 },
741 select => [ [ -dt_add => [minute => 3, { -ident => 'me.created_on' } ] ] ],
744 select => "(datetime(me.created_on, ? || ' minutes'))",
745 where => "me.id = ?",
746 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
747 hri => [{ date => '2011-12-14 12:15:12' }],
750 select => "(DATEADD(minute, ?, me.created_on))",
751 where => "me.id = ?",
752 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
753 hri => [{ date => '2011-12-14 12:15:12.000' }],
754 skip => 'need working bindtypes',
757 select => "DATE_ADD(me.created_on, INTERVAL ? MINUTE)",
758 where => "me.id = ?",
759 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
760 hri => [{ date => '2011-12-14 12:15:12' }],
763 select => "(me.created_on + NUMTODSINTERVAL(?, 'minute'))",
764 where => "me.id = ?",
765 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
766 hri => [{ date => '2011-12-14 12:15:12.000000000' }],
771 msg => '-dt_add (second) works',
772 search => { 'me.id' => 2 },
773 select => [ [ -dt_add => [second => 3, { -ident => 'me.created_on' } ] ] ],
776 select => "(datetime(me.created_on, ? || ' seconds'))",
777 where => "me.id = ?",
778 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
779 hri => [{ date => '2011-12-14 12:12:15' }],
782 select => "(DATEADD(second, ?, me.created_on))",
783 where => "me.id = ?",
784 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
785 hri => [{ date => '2011-12-14 12:12:15.000' }],
786 skip => 'need working bindtypes',
789 select => "DATE_ADD(me.created_on, INTERVAL ? SECOND)",
790 where => "me.id = ?",
791 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
792 hri => [{ date => '2011-12-14 12:12:15' }],
795 select => "(me.created_on + NUMTODSINTERVAL(?, 'second'))",
796 where => "me.id = ?",
797 bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
798 hri => [{ date => '2011-12-14 12:12:15.000000000' }],
803 msg => 'nested -dt_add works',
804 search => { 'me.id' => 2 },
805 select => [ [ -dt_add => [second => 3, { -dt_add => [ day => 1, { -ident => 'me.created_on' } ] } ] ] ],
808 select => "(datetime((datetime(me.created_on, ? || ' days')), ? || ' seconds'))",
809 where => "me.id = ?",
810 bind => [[unknown_col, 1], [unknown_col, 3 ], [{dbic_colname => 'me.id', sqlt_datatype => 'integer' }, 2]],
811 hri => [{ date => '2011-12-15 12:12:15' }],
814 select => "(DATEADD(second, ?, (DATEADD(dayofyear, ?, me.created_on))))",
815 where => "me.id = ?",
816 bind => [[unknown_col, 3 ], [unknown_col, 1], [{dbic_colname => 'me.id', sqlt_datatype => 'integer' }, 2]],
817 hri => [{ date => '2011-12-15 12:12:15.000' }],
818 skip => 'need working bindtypes',
821 select => "DATE_ADD(DATE_ADD(me.created_on, INTERVAL ? DAY), INTERVAL ? SECOND)",
822 where => "me.id = ?",
823 bind => [[unknown_col, 1], [unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
824 hri => [{ date => '2011-12-15 12:12:15' }],
827 select => "((me.created_on + NUMTODSINTERVAL(?, 'day')) + NUMTODSINTERVAL(?, 'second'))",
828 where => "me.id = ?",
829 bind => [[unknown_col, 1], [unknown_col, 3 ], [{dbic_colname => 'me.id', sqlt_datatype => 'integer' }, 2]],
830 hri => [{ date => '2011-12-15 12:12:15.000000000' }],
838 for my $db (keys %rs) {
839 my $db_test = $t->{$db};
841 ok 0, "$t->{msg} ($db not tested!)";
849 ( exists $t->{select}
850 ? ( select => $t->{select}, as => $t->{as} )
851 : ( columns => [qw(starts_at created_on skip_inflation)] )
854 $my_rs = $rs{$db}->search($t->{search}, $stuff);
855 $r = $my_rs->as_query
858 if ($db_test->{exception_like}) {
861 $db_test->{exception_like},
862 "throws the expected exception ($db_test->{exception_like})",
865 if ($db_test->{warning_like}) {
868 $db_test->{warning_like},
869 "issues the expected warning ($db_test->{warning_like})"
877 "(SELECT $db_test->{select} FROM event me WHERE $db_test->{where})",
879 ($t->{msg} ? "$t->{msg} ($db)" : ())
883 if (my $hri = $db_test->{hri}) {
884 skip "Cannot test database we are not connected to ($db)", 1 unless $dbs_to_test{$db};
885 skip $db_test->{skip} . " ($db)", 1 if $db_test->{skip};
887 my $msg = ($t->{msg} ? "$t->{msg} ($db actually pulls expected data)" : '');
889 my $got = [ $my_rs->hri_dump->all ];
890 my $success = is_deeply $got, $hri, $msg;
892 warn "$db: $t->{msg} got: " . Dumper $got;
893 warn "$db: $t->{msg} expected: " . Dumper $hri;