Skip to content

Commit

Permalink
Fixed issue #17350b: Update fails on pgsql and mssql after 17350 (#1999)
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrieljenik committed Aug 10, 2021
1 parent a7eef17 commit 71a1af6
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 14 deletions.
63 changes: 50 additions & 13 deletions application/helpers/update/updatedb_helper.php
Expand Up @@ -4749,22 +4749,59 @@ function ($v) {
$oTransaction = $oDB->beginTransaction();
// Add the new column to questions table
$oDB->createCommand()->addColumn('{{questions}}', 'question_theme_name', 'string(150) NULL');
switch (Yii::app()->db->driverName) {
case 'sqlsrv':
case 'dblib':
case 'mssql':
$updateExtendedQuery = "UPDATE q SET q.question_theme_name = qt.value
FROM {{questions}} q
LEFT JOIN {{question_attributes}} qt ON qt.qid = q.qid AND qt.attribute = 'question_template'
WHERE qt.value IS NOT NULL AND qt.value <> 'core' AND qt.value <> ''";
$updateCoreQuery = "UPDATE q SET q.question_theme_name = qt.name
FROM {{questions}} q
LEFT JOIN {{question_themes}} qt ON qt.question_type = q.type AND qt.core_theme = 1 AND qt.extends = ''
WHERE q.question_theme_name IS NULL";
$updateUserSettingsQuery = "UPDATE su SET stg_value = qt.name
FROM {{settings_user}} su
JOIN {{settings_user}} su2 ON su2.uid = su.uid AND su2.stg_name = 'preselectquestiontype'
JOIN {{question_themes}} qt ON qt.question_type = su2.stg_value
WHERE su.stg_name = 'preselectquestiontheme' AND su.stg_value = 'core'";
break;
case 'pgsql':
$updateExtendedQuery = "UPDATE {{questions}} q SET question_theme_name = qt.value
FROM {{questions}} q2
LEFT JOIN {{question_attributes}} qt ON qt.qid = q2.qid AND qt.attribute = 'question_template'
WHERE qt.value IS NOT NULL AND qt.value <> 'core' AND qt.value <> '' AND q.qid = q2.qid";
$updateCoreQuery = "UPDATE {{questions}} q SET question_theme_name = qt.name
FROM {{questions}} q2
LEFT JOIN {{question_themes}} qt ON qt.question_type = q2.type AND qt.core_theme = true AND qt.extends = ''
WHERE q.question_theme_name IS NULL AND q.qid = q2.qid";
$updateUserSettingsQuery = "UPDATE {{settings_user}} su SET stg_value = qt.name
FROM {{settings_user}} su1
JOIN {{settings_user}} su2 ON su2.uid = su1.uid AND su2.stg_name = 'preselectquestiontype'
JOIN {{question_themes}} qt ON qt.question_type = su2.stg_value
WHERE su1.stg_name = 'preselectquestiontheme' AND su1.stg_value = 'core' AND su.id = su1.id";
break;
default:
$updateExtendedQuery = "UPDATE {{questions}} q LEFT JOIN {{question_attributes}} qt ON qt.qid = q.qid AND qt.attribute = 'question_template'
SET q.question_theme_name = qt.value
WHERE qt.value IS NOT NULL AND qt.value <> 'core' AND qt.value <> ''";
$updateCoreQuery = "UPDATE {{questions}} q LEFT JOIN {{question_themes}} qt ON qt.question_type = q.type AND qt.core_theme = 1 AND qt.extends = ''
SET q.question_theme_name = qt.name
WHERE q.question_theme_name IS NULL";
$updateUserSettingsQuery = "UPDATE {{settings_user}} su
JOIN {{settings_user}} su2 ON su2.uid = su.uid AND su2.stg_name = 'preselectquestiontype'
JOIN {{question_themes}} qt ON qt.question_type = su2.stg_value
SET su.stg_value = qt.name
WHERE su.stg_name = 'preselectquestiontheme' AND su.stg_value = 'core'";
}

// Fill column from question_attributes when it's not null or 'core'
$oDB->createCommand("UPDATE {{questions}} q LEFT JOIN {{question_attributes}} qt ON qt.qid = q.qid AND qt.attribute = 'question_template'
SET q.question_theme_name = qt.value
WHERE qt.value IS NOT NULL AND qt.value <> 'core' AND qt.value <> ''")->execute();
$oDB->createCommand($updateExtendedQuery)->execute();
// Fill null question_theme_name values using the proper theme name
$oDB->createCommand("UPDATE {{questions}} q LEFT JOIN {{question_themes}} qt ON qt.question_type = q.type AND qt.core_theme = 1 AND qt.extends = ''
SET q.question_theme_name = qt.name
WHERE q.question_theme_name IS NULL")
->execute();

$oDB->createCommand($updateCoreQuery)->execute();
// Also update 'preselectquestiontheme' user settings where the value is 'core'
$oDB->createCommand("UPDATE {{settings_user}} su
JOIN {{settings_user}} su2 ON su2.uid = su.uid AND su2.stg_name = 'preselectquestiontype'
JOIN {{question_themes}} qt ON qt.question_type = su2.stg_value
SET su.stg_value = qt.name
WHERE su.stg_name = 'preselectquestiontheme' AND su.stg_value = 'core'")->execute();
$oDB->createCommand($updateUserSettingsQuery)->execute();

$oDB->createCommand()->update('{{settings_global}}', array('stg_value' => 470), "stg_name='DBVersion'");
$oTransaction->commit();
Expand Down
2 changes: 1 addition & 1 deletion application/models/QuestionTheme.php
Expand Up @@ -89,7 +89,7 @@ public function scopes()
// 'base' themes are the ones that don't extend any question type/theme.
'base' => array(
'condition' => 'core_theme = :true AND extends = :extends',
'params' => array(':true' => 1, ':extends' => '')
'params' => array(':true' => true, ':extends' => '')
),
);
}
Expand Down

0 comments on commit 71a1af6

Please sign in to comment.