Skip to content

Commit 8cfe7f4

Browse files
committed
Add support for DATE_ADD and DATE_SUB functions
1 parent f29464c commit 8cfe7f4

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

tests/WP_SQLite_Driver_Tests.php

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,94 @@ public function testSelectIndexHintUseGroup() {
506506
$this->assertEquals( 1, $result[0]->output );
507507
}
508508

509+
public function testDateAddFunction() {
510+
// second
511+
$result = $this->assertQuery(
512+
'SELECT DATE_ADD("2008-01-02 13:29:17", INTERVAL 1 SECOND) as output'
513+
);
514+
$this->assertEquals( '2008-01-02 13:29:18', $result[0]->output );
515+
516+
// minute
517+
$result = $this->assertQuery(
518+
'SELECT DATE_ADD("2008-01-02 13:29:17", INTERVAL 1 MINUTE) as output'
519+
);
520+
$this->assertEquals( '2008-01-02 13:30:17', $result[0]->output );
521+
522+
// hour
523+
$result = $this->assertQuery(
524+
'SELECT DATE_ADD("2008-01-02 13:29:17", INTERVAL 1 HOUR) as output'
525+
);
526+
$this->assertEquals( '2008-01-02 14:29:17', $result[0]->output );
527+
528+
// day
529+
$result = $this->assertQuery(
530+
'SELECT DATE_ADD("2008-01-02 13:29:17", INTERVAL 1 DAY) as output'
531+
);
532+
$this->assertEquals( '2008-01-03 13:29:17', $result[0]->output );
533+
534+
// week
535+
$result = $this->assertQuery(
536+
'SELECT DATE_ADD("2008-01-02 13:29:17", INTERVAL 1 WEEK) as output'
537+
);
538+
$this->assertEquals( '2008-01-09 13:29:17', $result[0]->output );
539+
540+
// month
541+
$result = $this->assertQuery(
542+
'SELECT DATE_ADD("2008-01-02 13:29:17", INTERVAL 1 MONTH) as output'
543+
);
544+
$this->assertEquals( '2008-02-02 13:29:17', $result[0]->output );
545+
546+
// year
547+
$result = $this->assertQuery(
548+
'SELECT DATE_ADD("2008-01-02 13:29:17", INTERVAL 1 YEAR) as output'
549+
);
550+
$this->assertEquals( '2009-01-02 13:29:17', $result[0]->output );
551+
}
552+
553+
public function testDateSubFunction() {
554+
// second
555+
$result = $this->assertQuery(
556+
'SELECT DATE_SUB("2008-01-02 13:29:17", INTERVAL 1 SECOND) as output'
557+
);
558+
$this->assertEquals( '2008-01-02 13:29:16', $result[0]->output );
559+
560+
// minute
561+
$result = $this->assertQuery(
562+
'SELECT DATE_SUB("2008-01-02 13:29:17", INTERVAL 1 MINUTE) as output'
563+
);
564+
$this->assertEquals( '2008-01-02 13:28:17', $result[0]->output );
565+
566+
// hour
567+
$result = $this->assertQuery(
568+
'SELECT DATE_SUB("2008-01-02 13:29:17", INTERVAL 1 HOUR) as output'
569+
);
570+
$this->assertEquals( '2008-01-02 12:29:17', $result[0]->output );
571+
572+
// day
573+
$result = $this->assertQuery(
574+
'SELECT DATE_SUB("2008-01-02 13:29:17", INTERVAL 1 DAY) as output'
575+
);
576+
$this->assertEquals( '2008-01-01 13:29:17', $result[0]->output );
577+
578+
// week
579+
$result = $this->assertQuery(
580+
'SELECT DATE_SUB("2008-01-02 13:29:17", INTERVAL 1 WEEK) as output'
581+
);
582+
$this->assertEquals( '2007-12-26 13:29:17', $result[0]->output );
583+
584+
// month
585+
$result = $this->assertQuery(
586+
'SELECT DATE_SUB("2008-01-02 13:29:17", INTERVAL 1 MONTH) as output'
587+
);
588+
$this->assertEquals( '2007-12-02 13:29:17', $result[0]->output );
589+
590+
// year
591+
$result = $this->assertQuery(
592+
'SELECT DATE_SUB("2008-01-02 13:29:17", INTERVAL 1 YEAR) as output'
593+
);
594+
$this->assertEquals( '2007-01-02 13:29:17', $result[0]->output );
595+
}
596+
509597
public function testLeftFunction1Char() {
510598
$result = $this->assertQuery(
511599
'SELECT LEFT("abc", 1) as output'

wp-includes/sqlite-ast/class-wp-sqlite-driver.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,22 @@ private function translate_runtime_function_call( WP_Parser_Node $node ): string
14501450
}
14511451

14521452
switch ( $child->id ) {
1453+
case WP_MySQL_Lexer::DATE_ADD_SYMBOL:
1454+
case WP_MySQL_Lexer::DATE_SUB_SYMBOL:
1455+
$nodes = $node->get_child_nodes();
1456+
$value = $this->translate( $nodes[1] );
1457+
$unit = $this->translate( $nodes[2] );
1458+
if ( 'WEEK' === $unit ) {
1459+
$unit = 'DAY';
1460+
$value = 7 * $value;
1461+
}
1462+
return sprintf(
1463+
"DATETIME(%s, '%s%s %s')",
1464+
$this->translate( $nodes[0] ),
1465+
WP_MySQL_Lexer::DATE_SUB_SYMBOL === $child->id ? '-' : '+',
1466+
$value,
1467+
$unit
1468+
);
14531469
case WP_MySQL_Lexer::LEFT_SYMBOL:
14541470
$nodes = $node->get_child_nodes();
14551471
return sprintf(

0 commit comments

Comments
 (0)