// We give precedence to CHAR_LENGTH for VARCHAR2 columns over WIDTH because the former is always
// BYTE based and, for cross-db operations, we want CHAR based results. See MDL-29415
- $sql = "SELECT CNAME, COLTYPE, nvl(CHAR_LENGTH, WIDTH) AS WIDTH, SCALE, PRECISION, NULLS, DEFAULTVAL
+ // Instead of guessing sequence based exclusively on name, check tables against user_triggers to
+ // ensure the table has a 'before each row' trigger to assume 'id' is auto_increment. MDL-32365
+ $sql = "SELECT CNAME, COLTYPE, nvl(CHAR_LENGTH, WIDTH) AS WIDTH, SCALE, PRECISION, NULLS, DEFAULTVAL,
+ DECODE(NVL(TRIGGER_NAME, '0'), '0', '0', '1') HASTRIGGER
FROM COL c
LEFT JOIN USER_TAB_COLUMNS u ON (u.TABLE_NAME = c.TNAME AND u.COLUMN_NAME = c.CNAME AND u.DATA_TYPE = 'VARCHAR2')
+ LEFT JOIN USER_TRIGGERS t ON (t.TABLE_NAME = c.TNAME AND TRIGGER_TYPE = 'BEFORE EACH ROW' AND c.CNAME = 'ID')
WHERE TNAME = UPPER('{" . $table . "}')
ORDER BY COLNO";
$info = new stdClass();
$info->name = strtolower($rawcolumn->CNAME);
+ $info->auto_increment = ((int)$rawcolumn->HASTRIGGER) ? true : false;
$matches = null;
if ($rawcolumn->COLTYPE === 'VARCHAR2'
$info->primary_key = false;
$info->binary = false;
$info->unsigned = null;
- $info->auto_increment= false;
$info->unique = null;
} else if ($rawcolumn->COLTYPE === 'NUMBER') {
$info->primary_key = true;
$info->meta_type = 'R';
$info->unique = true;
- $info->auto_increment= true;
$info->has_default = false;
} else {
$info->primary_key = false;
$info->meta_type = 'I';
$info->unique = null;
- $info->auto_increment= false;
}
$info->scale = null;
$info->meta_type = 'N';
$info->primary_key = false;
$info->unsigned = null;
- $info->auto_increment= false;
$info->unique = null;
$info->scale = $rawcolumn->SCALE;
}
$info->primary_key = false;
$info->meta_type = 'N';
$info->unique = null;
- $info->auto_increment= false;
$info->not_null = ($rawcolumn->NULLS === 'NOT NULL');
$info->has_default = !is_null($rawcolumn->DEFAULTVAL);
if ($info->has_default) {
$info->primary_key = false;
$info->binary = false;
$info->unsigned = null;
- $info->auto_increment= false;
$info->unique = null;
} else if ($rawcolumn->COLTYPE === 'BLOB') {
$info->primary_key = false;
$info->binary = true;
$info->unsigned = null;
- $info->auto_increment= false;
$info->unique = null;
} else {