diff --git a/libraries/classes/Plugins/Export/ExportSql.php b/libraries/classes/Plugins/Export/ExportSql.php index 398c5b3eac..3a9cc3f60e 100644 --- a/libraries/classes/Plugins/Export/ExportSql.php +++ b/libraries/classes/Plugins/Export/ExportSql.php @@ -555,6 +555,7 @@ class ExportSql extends ExportPlugin } $createQuery = $this->replaceWithAliases( + $delimiter, $dbi->getDefinition($db, $type, $routine), $aliases, $db, @@ -1602,7 +1603,7 @@ class ExportSql extends ExportPlugin } // Substitute aliases in `CREATE` query. - $createQuery = $this->replaceWithAliases($createQuery, $aliases, $db, $table, $flag); + $createQuery = $this->replaceWithAliases(null, $createQuery, $aliases, $db, $table, $flag); // One warning per view. if ($flag && $view) { @@ -2112,7 +2113,14 @@ class ExportSql extends ExportPlugin } $triggerQuery .= 'DELIMITER ' . $delimiter . $crlf; - $triggerQuery .= $this->replaceWithAliases($trigger['create'], $aliases, $db, $table, $flag); + $triggerQuery .= $this->replaceWithAliases( + $delimiter, + $trigger['create'], + $aliases, + $db, + $table, + $flag + ); if ($flag) { $usedAlias = true; } @@ -2616,6 +2624,7 @@ class ExportSql extends ExportPlugin * @return string query replaced with aliases */ public function replaceWithAliases( + string|null $delimiter, $sqlQuery, array $aliases, $db, @@ -2627,7 +2636,7 @@ class ExportSql extends ExportPlugin /** * The parser of this query. */ - $parser = new Parser($sqlQuery); + $parser = new Parser(empty($delimiter) ? $sqlQuery : 'DELIMITER ' . $delimiter . "\n" . $sqlQuery); if (empty($parser->statements[0])) { return $sqlQuery; diff --git a/test/classes/Plugins/Export/ExportSqlTest.php b/test/classes/Plugins/Export/ExportSqlTest.php index 80c46be686..077b93a650 100644 --- a/test/classes/Plugins/Export/ExportSqlTest.php +++ b/test/classes/Plugins/Export/ExportSqlTest.php @@ -1586,7 +1586,7 @@ class ExportSqlTest extends AbstractTestCase . "REFERENCES dept_master (baz)\n" . ') ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=' . "latin1_general_ci COMMENT='List' AUTO_INCREMENT=5"; - $result = $this->object->replaceWithAliases($sql_query, $aliases, $db, $table); + $result = $this->object->replaceWithAliases(null, $sql_query, $aliases, $db, $table); $this->assertEquals( "CREATE TABLE IF NOT EXISTS `bartest` (\n" . @@ -1598,7 +1598,7 @@ class ExportSqlTest extends AbstractTestCase $result ); - $result = $this->object->replaceWithAliases($sql_query, [], '', ''); + $result = $this->object->replaceWithAliases(null, $sql_query, [], '', ''); $this->assertEquals( "CREATE TABLE IF NOT EXISTS foo (\n" . @@ -1611,8 +1611,7 @@ class ExportSqlTest extends AbstractTestCase ); $table = 'bar'; - $sql_query = 'DELIMITER $$' . "\n" - . 'CREATE TRIGGER `BEFORE_bar_INSERT` ' + $sql_query = 'CREATE TRIGGER `BEFORE_bar_INSERT` ' . 'BEFORE INSERT ON `bar` ' . 'FOR EACH ROW BEGIN ' . 'SET @cnt=(SELECT count(*) FROM bar WHERE ' @@ -1621,7 +1620,7 @@ class ExportSqlTest extends AbstractTestCase . 'IF @cnt<>0 THEN ' . 'SET NEW.xy=1; ' . 'END IF; END'; - $result = $this->object->replaceWithAliases($sql_query, $aliases, $db, $table); + $result = $this->object->replaceWithAliases('$$', $sql_query, $aliases, $db, $table); $this->assertEquals( 'CREATE TRIGGER `BEFORE_bar_INSERT` BEFORE INSERT ON `f` FOR EACH ROW BEGIN ' . @@ -1632,5 +1631,55 @@ class ExportSqlTest extends AbstractTestCase 'END', $result ); + + $table = 'bar'; + $sql_query = <<<'SQL' + CREATE FUNCTION `HTML_UnEncode`(`x` TEXT CHARSET utf8) RETURNS text CHARSET utf8 + BEGIN + + DECLARE TextString TEXT ; + SET TextString = x ; + + #quotation mark + IF INSTR( x , '"' ) + THEN SET TextString = REPLACE(TextString, '"','"') ; + END IF ; + + #apostrophe + IF INSTR( x , ''' ) + THEN SET TextString = REPLACE(TextString, ''','"') ; + END IF ; + + RETURN TextString ; + + END + SQL; + $result = $this->object->replaceWithAliases('$$', $sql_query, $aliases, $db, $table); + + $expectedQuery = <<<'SQL' + CREATE FUNCTION `HTML_UnEncode` (`x` TEXT CHARSET utf8) RETURNS TEXT CHARSET utf8 BEGIN + + DECLARE TextString TEXT ; + SET TextString = x ; + + #quotation mark + IF INSTR( x , '"' ) + THEN SET TextString = REPLACE(TextString, '"','"') ; + END IF ; + + #apostrophe + IF INSTR( x , ''' ) + THEN SET TextString = REPLACE(TextString, ''','"') ; + END IF ; + + RETURN TextString ; + + END + SQL; + + $this->assertEquals( + $expectedQuery, + $result + ); } }