From f8bee4cd5d187adc6b628f583adf6c4ee83c8514 Mon Sep 17 00:00:00 2001 From: Mo Sureerat Date: Thu, 3 Nov 2022 01:05:11 +0700 Subject: [PATCH 1/5] [ISSUE-17793] Insert record - fix null not selected if nullable UUID + insert error Signed-off-by: Mo Sureerat --- libraries/classes/InsertEdit.php | 9 +- test/classes/InsertEditTest.php | 192 +++++++++++++++++++++++++------ 2 files changed, 165 insertions(+), 36 deletions(-) diff --git a/libraries/classes/InsertEdit.php b/libraries/classes/InsertEdit.php index d4696751f1..c8843d4fe7 100644 --- a/libraries/classes/InsertEdit.php +++ b/libraries/classes/InsertEdit.php @@ -1109,7 +1109,14 @@ class InsertEdit private function getSpecialCharsAndBackupFieldForInsertingMode( array $column ) { - if (! isset($column['Default'])) { + $isNullableUUID = ! empty($column['True_Type']) + && ! empty($column['Default']) + && ! empty($column['Null']) + && $column['True_Type'] === 'uuid' + && $column['Default'] === 'uuid()' + && $column['Null'] === 'YES'; + + if ($isNullableUUID || (! isset($column['Default']))) { $column['Default'] = ''; $realNullValue = true; $data = ''; diff --git a/test/classes/InsertEditTest.php b/test/classes/InsertEditTest.php index 96c8621224..7aa2aeda7c 100644 --- a/test/classes/InsertEditTest.php +++ b/test/classes/InsertEditTest.php @@ -1659,38 +1659,21 @@ class InsertEditTest extends AbstractTestCase /** * Test for getSpecialCharsAndBackupFieldForInsertingMode + * + * @param array $column Column parameters + * @param array $expected Expected result + * @psalm-param array $column + * @psalm-param array $expected + * + * @dataProvider providerForTestGetSpecialCharsAndBackupFieldForInsertingMode */ - public function testGetSpecialCharsAndBackupFieldForInsertingMode(): void - { - $column = []; - $column['True_Type'] = 'bit'; - $column['Default'] = 'b\'101\''; - $column['is_binary'] = true; + public function testGetSpecialCharsAndBackupFieldForInsertingMode( + array $column, + array $expected + ): void { $GLOBALS['cfg']['ProtectBinary'] = false; $GLOBALS['cfg']['ShowFunctionFields'] = true; - $result = $this->callFunction( - $this->insertEdit, - InsertEdit::class, - 'getSpecialCharsAndBackupFieldForInsertingMode', - [$column] - ); - - $this->assertEquals( - [ - false, - 'b\'101\'', - '101', - '', - '101', - ], - $result - ); - - // case 2 - unset($column['Default']); - $column['True_Type'] = 'char'; - $result = (array) $this->callFunction( $this->insertEdit, InsertEdit::class, @@ -1699,17 +1682,156 @@ class InsertEditTest extends AbstractTestCase ); $this->assertEquals( - [ - true, - '', - '', - '', - '', - ], + $expected, $result ); } + /** + * Data provider for test getSpecialCharsAndBackupFieldForInsertingMode() + * + * @return array + * @psalm-return array, array}> + */ + public function providerForTestGetSpecialCharsAndBackupFieldForInsertingMode(): array + { + return [ + 'bit' => [ + [ + 'True_Type' => 'bit', + 'Default' => 'b\'101\'', + 'is_binary' => true, + ], + [ + false, + 'b\'101\'', + '101', + '', + '101', + ], + ], + 'char' => [ + [ + 'True_Type' => 'char', + 'is_binary' => true, + ], + [ + true, + '', + '', + '', + '', + ], + ], + 'time with CURRENT_TIMESTAMP value' => [ + [ + 'True_Type' => 'time', + 'Default' => 'CURRENT_TIMESTAMP', + ], + [ + false, + 'CURRENT_TIMESTAMP', + 'CURRENT_TIMESTAMP', + '', + 'CURRENT_TIMESTAMP', + ], + ], + 'time with current_timestamp() value' => [ + [ + 'True_Type' => 'time', + 'Default' => 'current_timestamp()', + ], + [ + false, + 'current_timestamp()', + 'current_timestamp()', + '', + 'current_timestamp()', + ], + ], + 'time with no dot value' => [ + [ + 'True_Type' => 'time', + 'Default' => '10', + ], + [ + false, + '10', + '10.000000', + '', + '10.000000', + ], + ], + 'time with dot value' => [ + [ + 'True_Type' => 'time', + 'Default' => '10.08', + ], + [ + false, + '10.08', + '10.080000', + '', + '10.080000', + ], + ], + 'any text with escape text default' => [ + [ + 'True_Type' => 'text', + 'Default' => '"lorem\"ipsem"', + ], + [ + false, + '"lorem\"ipsem"', + 'lorem"ipsem', + '', + 'lorem"ipsem', + ], + ], + 'varchar with html special chars' => [ + [ + 'True_Type' => 'varchar', + 'Default' => 'hello world
lorem ipsem', + ], + [ + false, + 'hello world
lorem ipsem', + 'hello world<br><b>lorem</b> ipsem', + '', + 'hello world<br><b>lorem</b> ipsem', + ], + ], + 'uuid with nullable' => [ + [ + 'True_Type' => 'uuid', + 'Default' => 'uuid()', + 'Null' => 'YES', + ], + [ + true, + '', + '', + '', + '', + ], + ], + 'uuid with not nullable' => [ + [ + 'True_Type' => 'uuid', + 'Default' => 'uuid()', + 'Null' => 'NO', + ], + [ + false, + 'uuid()', + 'uuid()', + '', + 'uuid()', + ], + ], + ]; + } + /** * Test for getParamsForUpdateOrInsert */ From ddf928e6f3f27ede49aeaeee560ff49db7de06a8 Mon Sep 17 00:00:00 2001 From: Mo Sureerat Date: Thu, 3 Nov 2022 05:11:19 +0700 Subject: [PATCH 2/5] [ISSUE-17793] Revert previous change + Fix default selection of uuid in alter table Signed-off-by: Mo Sureerat --- libraries/classes/InsertEdit.php | 9 +----- libraries/classes/Table/ColumnsDefinition.php | 7 +++++ test/classes/InsertEditTest.php | 28 ------------------- 3 files changed, 8 insertions(+), 36 deletions(-) diff --git a/libraries/classes/InsertEdit.php b/libraries/classes/InsertEdit.php index c8843d4fe7..d4696751f1 100644 --- a/libraries/classes/InsertEdit.php +++ b/libraries/classes/InsertEdit.php @@ -1109,14 +1109,7 @@ class InsertEdit private function getSpecialCharsAndBackupFieldForInsertingMode( array $column ) { - $isNullableUUID = ! empty($column['True_Type']) - && ! empty($column['Default']) - && ! empty($column['Null']) - && $column['True_Type'] === 'uuid' - && $column['Default'] === 'uuid()' - && $column['Null'] === 'YES'; - - if ($isNullableUUID || (! isset($column['Default']))) { + if (! isset($column['Default'])) { $column['Default'] = ''; $realNullValue = true; $data = ''; diff --git a/libraries/classes/Table/ColumnsDefinition.php b/libraries/classes/Table/ColumnsDefinition.php index 371fdb2f8d..c21f43df3c 100644 --- a/libraries/classes/Table/ColumnsDefinition.php +++ b/libraries/classes/Table/ColumnsDefinition.php @@ -243,6 +243,8 @@ final class ColumnsDefinition case 'NULL': case 'CURRENT_TIMESTAMP': case 'current_timestamp()': + case 'UUID': + case 'uuid()': $columnMeta['Default'] = $columnMeta['DefaultType']; break; } @@ -300,6 +302,11 @@ final class ColumnsDefinition $columnMeta['DefaultType'] = 'CURRENT_TIMESTAMP'; $columnMeta['DefaultValue'] = ''; break; + case 'UUID': + case 'uuid()': + $columnMeta['DefaultType'] = 'UUID'; + $columnMeta['DefaultValue'] = ''; + break; default: $columnMeta['DefaultType'] = 'USER_DEFINED'; $columnMeta['DefaultValue'] = $columnMeta['Default']; diff --git a/test/classes/InsertEditTest.php b/test/classes/InsertEditTest.php index 7aa2aeda7c..03620f1b2d 100644 --- a/test/classes/InsertEditTest.php +++ b/test/classes/InsertEditTest.php @@ -1801,34 +1801,6 @@ class InsertEditTest extends AbstractTestCase 'hello world<br><b>lorem</b> ipsem', ], ], - 'uuid with nullable' => [ - [ - 'True_Type' => 'uuid', - 'Default' => 'uuid()', - 'Null' => 'YES', - ], - [ - true, - '', - '', - '', - '', - ], - ], - 'uuid with not nullable' => [ - [ - 'True_Type' => 'uuid', - 'Default' => 'uuid()', - 'Null' => 'NO', - ], - [ - false, - 'uuid()', - 'uuid()', - '', - 'uuid()', - ], - ], ]; } From 15e629c9c1ef9356da92fccdb367a192dfd2fa59 Mon Sep 17 00:00:00 2001 From: Mo Sureerat Date: Thu, 3 Nov 2022 05:55:37 +0700 Subject: [PATCH 3/5] [ISSUE-17793] UUID - Fix insert error Signed-off-by: Mo Sureerat --- libraries/classes/InsertEdit.php | 2 +- test/classes/InsertEditTest.php | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/libraries/classes/InsertEdit.php b/libraries/classes/InsertEdit.php index d4696751f1..bd487bb9b7 100644 --- a/libraries/classes/InsertEdit.php +++ b/libraries/classes/InsertEdit.php @@ -1746,7 +1746,7 @@ class InsertEdit if ( $editField->type === 'uuid' && ! $editField->isNull - && in_array($editField->value, ["''", '', "'uuid()'"], true) + && in_array($editField->value, ["''", '', "'uuid()'", 'uuid()'], true) ) { return 'uuid()'; } diff --git a/test/classes/InsertEditTest.php b/test/classes/InsertEditTest.php index 03620f1b2d..156636af3a 100644 --- a/test/classes/InsertEditTest.php +++ b/test/classes/InsertEditTest.php @@ -2768,6 +2768,24 @@ class InsertEditTest extends AbstractTestCase $this->assertEquals('`fld` = uuid()', $result); + // Test that the uuid function as a value uses the uuid function to generate a value + $result = $this->insertEdit->getQueryValueForUpdate( + new EditField( + 'fld', + "uuid()", + 'uuid', + false, + false, + false, + '', + null, + '', + false + ) + ); + + $this->assertEquals('`fld` = uuid()', $result); + // Test that the uuid type does not have a default value other than null when it is nullable $result = $this->insertEdit->getQueryValueForUpdate( new EditField( From e2e92c68992a8ca3c30465b526310b3305d7ffbd Mon Sep 17 00:00:00 2001 From: Mo Sureerat Date: Thu, 3 Nov 2022 23:08:03 +0700 Subject: [PATCH 4/5] [ISSUE-17793] Fix lint check fail Signed-off-by: Mo Sureerat --- test/classes/InsertEditTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/classes/InsertEditTest.php b/test/classes/InsertEditTest.php index 156636af3a..162647a59f 100644 --- a/test/classes/InsertEditTest.php +++ b/test/classes/InsertEditTest.php @@ -2772,7 +2772,7 @@ class InsertEditTest extends AbstractTestCase $result = $this->insertEdit->getQueryValueForUpdate( new EditField( 'fld', - "uuid()", + 'uuid()', 'uuid', false, false, From 05552b6271d7473305a2fad483c45c8527d9b253 Mon Sep 17 00:00:00 2001 From: Mo Sureerat Date: Thu, 3 Nov 2022 22:56:29 +0700 Subject: [PATCH 5/5] [ISSUE-17793] Fix static analysis warning Signed-off-by: Mo Sureerat --- libraries/classes/Table/ColumnsDefinition.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/libraries/classes/Table/ColumnsDefinition.php b/libraries/classes/Table/ColumnsDefinition.php index c21f43df3c..e13e6491c1 100644 --- a/libraries/classes/Table/ColumnsDefinition.php +++ b/libraries/classes/Table/ColumnsDefinition.php @@ -82,7 +82,7 @@ final class ColumnsDefinition if ($action === '/table/add-field') { $form_params = array_merge($form_params, ['field_where' => $_POST['field_where'] ?? null]); if (isset($_POST['field_where'])) { - $form_params['after_field'] = $_POST['after_field']; + $form_params['after_field'] = (string) $_POST['after_field']; } } @@ -281,16 +281,15 @@ final class ColumnsDefinition $columnMeta['Expression'] = is_array($expressions) ? $expressions[$columnMeta['Field']] : null; } + $columnMeta['DefaultType'] = 'USER_DEFINED'; + $columnMeta['DefaultValue'] = ''; + switch ($columnMeta['Default']) { case null: if ($columnMeta['Default'] === null) { - if ($columnMeta['Null'] === 'YES') { - $columnMeta['DefaultType'] = 'NULL'; - $columnMeta['DefaultValue'] = ''; - } else { - $columnMeta['DefaultType'] = 'NONE'; - $columnMeta['DefaultValue'] = ''; - } + $columnMeta['DefaultType'] = $columnMeta['Null'] === 'YES' + ? 'NULL' + : 'NONE'; } else { // empty $columnMeta['DefaultType'] = 'USER_DEFINED'; $columnMeta['DefaultValue'] = $columnMeta['Default']; @@ -300,15 +299,14 @@ final class ColumnsDefinition case 'CURRENT_TIMESTAMP': case 'current_timestamp()': $columnMeta['DefaultType'] = 'CURRENT_TIMESTAMP'; - $columnMeta['DefaultValue'] = ''; + break; case 'UUID': case 'uuid()': $columnMeta['DefaultType'] = 'UUID'; - $columnMeta['DefaultValue'] = ''; + break; default: - $columnMeta['DefaultType'] = 'USER_DEFINED'; $columnMeta['DefaultValue'] = $columnMeta['Default']; if (substr($columnMeta['Type'], -4) === 'text') {