From 296e1e978210e92807db77b65cdf69d29d069e08 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Thu, 1 Mar 2012 12:13:46 +0000 Subject: [PATCH] MDL-31829 question engine SQL typo breaks some regrades. Also, some MySQL-only code had not been updated. This problem only affected a small minority of question attempts, like this: 1. Suppose you have a shortanswer question with correct answer 'Toad' and some hints. 2. Suppose a student attempts this using the interactive behaviour and on the first try responds 'Frog', and on the second try responds 'Toad'. 3. Then suppose the teacher edits the question to make 'Frog' correct. 4. Then, when the quiz is regraded, the question_attempt_step for the second try will need to be deleted. That is where the buggy code was. --- question/engine/datalib.php | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/question/engine/datalib.php b/question/engine/datalib.php index 0c0f2eb8494..a9063a4b491 100644 --- a/question/engine/datalib.php +++ b/question/engine/datalib.php @@ -768,22 +768,6 @@ ORDER BY $qubaids->usage_id_in_params()); } - /** - * This function is a work-around for poor MySQL performance with - * DELETE FROM x WHERE id IN (SELECT ...). We have to use a non-standard - * syntax to get good performance. See MDL-29520. - * @param string $test sql fragment. - * @param array $params used by $test. - */ - protected function delete_attempt_steps_for_mysql($test, $params) { - // TODO once MDL-29589 is fixed, eliminate this method, and instead use the new $DB API. - $this->db->execute(' - DELETE qas, qasd - FROM {question_attempt_steps} qas - LEFT JOIN {question_attempt_step_data} qasd ON qasd.attemptstepid = qas.id - WHERE qas.questionattemptid ' . $test, $params); - } - /** * Delete all the steps for a question attempt. * @param int $qaids question_attempt id. @@ -795,19 +779,12 @@ ORDER BY } list($test, $params) = $this->db->get_in_or_equal($stepids, SQL_PARAMS_NAMED); - if ($deletefiles) { - $this->delete_response_files($context->id, $test, $params); - } - - if ($this->db->get_dbfamily() == 'mysql') { - $this->delete_attempt_steps_for_mysql($test, $params); - return; - } + $this->delete_response_files($context->id, $test, $params); $this->db->delete_records_select('question_attempt_step_data', "attemptstepid $test", $params); $this->db->delete_records_select('question_attempt_steps', - "attemptstepid $test", $params); + "id $test", $params); } /**