From 92a58a630abd05ea653b3fe1b3c7b50b169caf43 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 27 Oct 2024 20:21:49 +0000 Subject: [PATCH] Handle default values during insert Signed-off-by: Kamil Tekiela --- src/Controllers/Table/ReplaceController.php | 8 +++++++- src/InsertEdit.php | 12 ++++++++++++ .../unit/Controllers/Table/ReplaceControllerTest.php | 5 +++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Controllers/Table/ReplaceController.php b/src/Controllers/Table/ReplaceController.php index 59cbfc9e32..fad1c80af4 100644 --- a/src/Controllers/Table/ReplaceController.php +++ b/src/Controllers/Table/ReplaceController.php @@ -104,6 +104,7 @@ final class ReplaceController implements InvocableController $valueSets = []; $mimeMap = $this->transformations->getMime(Current::$database, Current::$table) ?? []; + $columnsDefaultValues = $this->insertEdit->getColumnDefaultValues(Current::$database, Current::$table); $queryFields = []; $insertErrors = []; @@ -211,7 +212,12 @@ final class ReplaceController implements InvocableController if (! isset($multiEditVirtual[$key])) { if ($isInsert) { - $queryPart = $this->insertEdit->getQueryValueForInsert($editField, $usingKey, $whereClause); + if ($editField->value === $columnsDefaultValues[$columnName]) { + $queryPart = $editField->value; + } else { + $queryPart = $this->insertEdit->getQueryValueForInsert($editField, $usingKey, $whereClause); + } + if ($queryPart !== '' && $valueSets === []) { // first inserted row so prepare the list of fields $queryFields[] = Util::backquote($editField->columnName); diff --git a/src/InsertEdit.php b/src/InsertEdit.php index 2521186029..d1c69836d5 100644 --- a/src/InsertEdit.php +++ b/src/InsertEdit.php @@ -1131,6 +1131,8 @@ class InsertEdit /** * Get value part if a function was specified + * + * @psalm-return non-empty-string */ private function formatAsSqlFunction( EditField $editField, @@ -1931,6 +1933,16 @@ class InsertEdit . '
'; } + /** @return array */ + public function getColumnDefaultValues(string $database, string $table): array + { + $sql = 'SELECT COLUMN_NAME, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ' + . $this->dbi->quoteString($table) + . ' AND TABLE_SCHEMA = ' . $this->dbi->quoteString($database); + + return $this->dbi->query($sql)->fetchAllKeyPair(); + } + /** * Returns list of function names that accept WKB as text * diff --git a/tests/unit/Controllers/Table/ReplaceControllerTest.php b/tests/unit/Controllers/Table/ReplaceControllerTest.php index fc2191c912..75aa1dcb00 100644 --- a/tests/unit/Controllers/Table/ReplaceControllerTest.php +++ b/tests/unit/Controllers/Table/ReplaceControllerTest.php @@ -132,6 +132,11 @@ class ReplaceControllerTest extends AbstractTestCase $GLOBALS['goto'] = 'index.php?route=/sql'; $dummyDbi->addSelectDb('my_db'); $dummyDbi->addSelectDb('my_db'); + $dummyDbi->addResult( + 'SELECT COLUMN_NAME, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS ' + . "WHERE TABLE_NAME = 'test_tbl' AND TABLE_SCHEMA = 'my_db'", + [], + ); $replaceController($request); $output = $response->getHTMLResult(); $this->dummyDbi->assertAllSelectsConsumed();