Skip to content

Commit 6fca044

Browse files
authored
Merge pull request #243 from deliciousbrains/insert-on-duplicate-key-create
Creator handle INSERT statements with ON DUPLICATE KEY
2 parents 49e6eee + cffbd49 commit 6fca044

3 files changed

Lines changed: 64 additions & 4 deletions

File tree

src/PHPSQLParser/builders/RecordBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ protected function buildColRef($parsed) {
7575

7676
public function build(array $parsed) {
7777
if ($parsed['expr_type'] !== ExpressionType::RECORD) {
78-
return "";
78+
return isset($parsed['base_expr']) ? $parsed['base_expr'] : '';
7979
}
8080
$sql = "";
8181
foreach ($parsed['data'] as $k => $v) {

src/PHPSQLParser/builders/ValuesBuilder.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,13 @@ public function build(array $parsed) {
6767
throw new UnableToCreateSQLException('VALUES', $k, $v, 'expr_type');
6868
}
6969

70-
$sql .= ", ";
70+
$sql .= $this->getRecordDelimiter($v);
7171
}
72-
$sql = substr($sql, 0, -2);
73-
return "VALUES " . $sql;
72+
return "VALUES " . trim($sql);
73+
}
74+
75+
protected function getRecordDelimiter($parsed) {
76+
return empty($parsed['delim']) ? ' ' : $parsed['delim'] . ' ';
7477
}
7578
}
7679
?>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
/**
3+
* issue242.php
4+
*
5+
* Test case for PHPSQLCreator.
6+
*/
7+
namespace PHPSQLParser\Test\Creator;
8+
9+
use PHPSQLParser\PHPSQLParser;
10+
use PHPSQLParser\PHPSQLCreator;
11+
12+
class Issue242Test extends \PHPUnit_Framework_TestCase {
13+
14+
public function testOnDuplicateKey() {
15+
$sql = "INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('some_key', 'some_value', 'yes') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)";
16+
17+
$parser = new PHPSQLParser();
18+
$parser->parse($sql);
19+
20+
$creator = new PHPSQLCreator();
21+
$created = $creator->create($parser->parsed);
22+
$this->assertEquals($sql, $created);
23+
}
24+
25+
public function testOnDuplicateKeyAbsValues() {
26+
$sql = "INSERT INTO wp_dh_wfConfig (name, val, autoload) values ('totalAlertsSent', '16', 'yes') ON DUPLICATE KEY UPDATE val = '16', autoload = 'yes';";
27+
28+
$parser = new PHPSQLParser();
29+
$parser->parse($sql);
30+
31+
$creator = new PHPSQLCreator();
32+
$created = $creator->create($parser->parsed);
33+
$this->assertEquals($sql, $created);
34+
}
35+
36+
public function testNormalInsert() {
37+
$sql = "INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('some_key', 'some_value', 'yes')";
38+
39+
$parser = new PHPSQLParser();
40+
$parser->parse($sql);
41+
42+
$creator = new PHPSQLCreator();
43+
$created = $creator->create($parser->parsed);
44+
$this->assertEquals($sql, $created);
45+
}
46+
47+
public function testNormalInsertMultipleValues() {
48+
$sql = "INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('some_key', 'some_value', 'yes'), ('some_key', 'some_value', 'yes')";
49+
50+
$parser = new PHPSQLParser();
51+
$parser->parse($sql);
52+
53+
$creator = new PHPSQLCreator();
54+
$created = $creator->create($parser->parsed);
55+
$this->assertEquals($sql, $created);
56+
}
57+
}

0 commit comments

Comments
 (0)