Fix #18495 - Exporting procedures and triggers

Ref: 38a4328184
Reverts: 5a2baf607f

Signed-off-by: William Desportes <williamdes@wdes.fr>
This commit is contained in:
William Desportes 2023-11-16 16:35:28 +01:00
parent 38a4328184
commit fc98aff6d3
No known key found for this signature in database
GPG Key ID: 90A0EF1B8251A889
2 changed files with 66 additions and 8 deletions

View File

@ -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;

View File

@ -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 , '&quot;' )
THEN SET TextString = REPLACE(TextString, '&quot;','"') ;
END IF ;
#apostrophe
IF INSTR( x , '&apos;' )
THEN SET TextString = REPLACE(TextString, '&apos;','"') ;
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 , '&quot;' )
THEN SET TextString = REPLACE(TextString, '&quot;','"') ;
END IF ;
#apostrophe
IF INSTR( x , '&apos;' )
THEN SET TextString = REPLACE(TextString, '&apos;','"') ;
END IF ;
RETURN TextString ;
END
SQL;
$this->assertEquals(
$expectedQuery,
$result
);
}
}