MDL-54542 competency: Prevent long query aliases in get_sql_fields()

Otherwise we could hit ORA-00972 because they exceed 30 characters.
This commit is contained in:
Frederic Massart
2016-05-12 16:14:32 +08:00
parent 1e72daa899
commit bbf727f175
3 changed files with 46 additions and 9 deletions
+8 -8
View File
@@ -1332,8 +1332,8 @@ class api {
}
$capability = 'moodle/competency:usercompetencyreview';
$ucfields = user_competency::get_sql_fields('uc');
$compfields = competency::get_sql_fields('c');
$ucfields = user_competency::get_sql_fields('uc', 'uc_');
$compfields = competency::get_sql_fields('c', 'c_');
$usercols = array('id') + get_user_fieldnames();
$userfields = array();
foreach ($usercols as $field) {
@@ -1376,8 +1376,8 @@ class api {
$records = $DB->get_recordset_sql($getsql, $params, $skip, $limit);
foreach ($records as $record) {
$objects = (object) array(
'usercompetency' => new user_competency(0, user_competency::extract_record($record)),
'competency' => new competency(0, competency::extract_record($record)),
'usercompetency' => new user_competency(0, user_competency::extract_record($record, 'uc_')),
'competency' => new competency(0, competency::extract_record($record, 'c_')),
'user' => persistent::extract_record($record, 'usr_'),
);
$competencies[] = $objects;
@@ -2369,8 +2369,8 @@ class api {
$userid = $USER->id;
}
$planfields = plan::get_sql_fields('p');
$tplfields = template::get_sql_fields('t');
$planfields = plan::get_sql_fields('p', 'plan_');
$tplfields = template::get_sql_fields('t', 'tpl_');
$usercols = array('id') + get_user_fieldnames();
$userfields = array();
foreach ($usercols as $field) {
@@ -2412,11 +2412,11 @@ class api {
$plans = array();
$records = $DB->get_recordset_sql($select . $sql, $params, $skip, $limit);
foreach ($records as $record) {
$plan = new plan(0, plan::extract_record($record));
$plan = new plan(0, plan::extract_record($record, 'plan_'));
$template = null;
if ($plan->is_based_on_template()) {
$template = new template(0, template::extract_record($record));
$template = new template(0, template::extract_record($record, 'tpl_'));
}
$plans[] = (object) array(
+9 -1
View File
@@ -785,6 +785,7 @@ abstract class persistent {
* @return string The SQL fragment.
*/
public static function get_sql_fields($alias, $prefix = null) {
global $CFG;
$fields = array();
if ($prefix === null) {
@@ -798,7 +799,14 @@ abstract class persistent {
$properties = array('id' => $id) + $properties;
foreach ($properties as $property => $definition) {
$fields[] = $alias . '.' . $property . ' AS ' . $prefix . $property;
$as = $prefix . $property;
$fields[] = $alias . '.' . $property . ' AS ' . $as;
// Warn developers that the query will not always work.
if ($CFG->debugdeveloper && strlen($as) > 30) {
throw new coding_exception("The alias '$as' for column '$alias.$property' exceeds 30 characters" .
" and will therefore not work across all supported databases.");
}
}
return implode(', ', $fields);