Merge pull request #20094 from MauricioFauth/fix-merge-issue

Fix issue after merge 17e3414
This commit is contained in:
Maurício Meneghini Fauth 2026-02-11 11:25:29 -03:00 committed by GitHub
commit 0de5de4cba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 60 additions and 15 deletions

View File

@ -4588,11 +4588,17 @@ parameters:
path: src/Database/Routines.php
-
message: '#^Cannot call method has\(\) on PhpMyAdmin\\SqlParser\\Components\\OptionsArray\|null\.$#'
message: '#^Cannot call method get\(\) on PhpMyAdmin\\SqlParser\\Components\\OptionsArray\|null\.$#'
identifier: method.nonObject
count: 2
path: src/Database/Routines.php
-
message: '#^Cannot call method has\(\) on PhpMyAdmin\\SqlParser\\Components\\OptionsArray\|null\.$#'
identifier: method.nonObject
count: 1
path: src/Database/Routines.php
-
message: '#^Construct empty\(\) is not allowed\. Use more strict comparison\.$#'
identifier: empty.notAllowed
@ -4623,12 +4629,6 @@ parameters:
count: 4
path: src/Database/Routines.php
-
message: '#^PHPDoc tag @var with type string\|false is not subtype of type bool\.$#'
identifier: varTag.type
count: 2
path: src/Database/Routines.php
-
message: '#^Parameter \#1 \$alias of method PhpMyAdmin\\Types\:\:mapAliasToMysqlType\(\) expects string, mixed given\.$#'
identifier: argument.type

View File

@ -484,14 +484,11 @@ class Routines
$retval['item_returnlength'] = implode(',', $stmt->return->parameters);
// Extract charset (CHARSET or CHARACTER SET) separately from numeric options
/** @var string|false $charset */
$charset = $stmt->return->options->has('CHARSET');
if ($charset === false) {
/** @var string|false $charset */
$charset = $stmt->return->options->has('CHARACTER SET');
}
$charset = $stmt->return->options->has('CHARSET')
? $stmt->return->options->get('CHARSET')
: $stmt->return->options->get('CHARACTER SET');
$retval['item_returnopts_text'] = is_string($charset) ? mb_strtolower($charset) : '';
$retval['item_returnopts_text'] = mb_strtolower((string) $charset);
// Extract numeric options (UNSIGNED, ZEROFILL, UNSIGNED ZEROFILL.)
$numericOpts = [];
@ -506,7 +503,7 @@ class Routines
$retval['item_returnopts_num'] = implode(' ', $numericOpts);
}
$retval['item_definer'] = $stmt->options?->has('DEFINER') ?? false;
$retval['item_definer'] = $stmt->options?->get('DEFINER') ?? '';
$retval['item_definition'] = $body;
$retval['item_isdeterministic'] = '';
if ($routine['IS_DETERMINISTIC'] === 'YES') {

View File

@ -542,4 +542,52 @@ class RoutinesTest extends AbstractTestCase
$dbiDummy->assertAllQueriesConsumed();
}
public function testGetDataFromName(): void
{
Current::$database = 'test_db';
$dbiDummy = $this->createDbiDummy();
// phpcs:disable Generic.Files.LineLength.TooLong
$dbiDummy->addResult(
"SELECT SPECIFIC_NAME, ROUTINE_TYPE, DTD_IDENTIFIER, ROUTINE_DEFINITION, IS_DETERMINISTIC, SQL_DATA_ACCESS, ROUTINE_COMMENT, SECURITY_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA COLLATE utf8_bin='test_db' AND SPECIFIC_NAME='test_function' AND ROUTINE_TYPE='FUNCTION';",
[['test_function', 'FUNCTION', 'char(50)', "BEGIN RETURN CONCAT('Hello, ', s, '!'); END", 'YES', 'CONTAINS SQL', 'Comment', 'DEFINER']],
['SPECIFIC_NAME', 'ROUTINE_TYPE', 'DTD_IDENTIFIER', 'ROUTINE_DEFINITION', 'IS_DETERMINISTIC', 'SQL_DATA_ACCESS', 'ROUTINE_COMMENT', 'SECURITY_TYPE'],
);
$dbiDummy->addResult(
'SHOW CREATE FUNCTION `test_db`.`test_function`',
[["CREATE DEFINER=`test_user`@`localhost` FUNCTION `test_function`(`s` CHAR(50) CHARSET utf8mb4) RETURNS char(50) CHARSET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DETERMINISTIC COMMENT 'Comment' BEGIN RETURN CONCAT('Hello, ', s, '!'); END"]],
['Create Function'],
);
// phpcs:enable
$routines = new Routines($this->createDatabaseInterface($dbiDummy), new Config());
$data = $routines->getDataFromName('test_function', 'FUNCTION');
$dbiDummy->assertAllQueriesConsumed();
self::assertSame([
'item_name' => 'test_function',
'item_type' => 'FUNCTION',
'item_num_params' => 1,
'item_param_dir' => [null],
'item_param_name' => ['s'],
'item_param_type' => ['CHAR'],
'item_param_length' => ['50'],
'item_param_length_arr' => [['50']],
'item_param_opts_num' => ['utf8mb4'],
'item_param_opts_text' => ['utf8mb4'],
'item_type_toggle' => 'PROCEDURE',
'item_returntype' => 'CHAR',
'item_returnlength' => '50',
'item_returnopts_num' => '',
'item_returnopts_text' => 'utf8mb4',
'item_definer' => '`test_user`@`localhost`',
'item_definition' => "BEGIN RETURN CONCAT('Hello, ', s, '!'); END",
'item_isdeterministic' => " checked='checked'",
'item_securitytype_definer' => " selected='selected'",
'item_securitytype_invoker' => '',
'item_sqldataaccess' => 'CONTAINS SQL',
'item_comment' => 'Comment',
], $data);
}
}