res_config_mysql: Fix broken column type checking
MySQL configuration engine contains a bug in require_mysql(). This function is used for column type checking in tables. This bug only affects DATETIME, DATE and FLOAT types. It came from mixing the first condition (switch-case-like if/then/else), to check the expected column type, with the second condition, to check the actual column type against the expected column type. Both conditions must be checked separately in order to avoid the execution of the wrong block. ASTERISK-18252 #comment This patch might fix the issue Reported by: Gareth Blades ASTERISK-25041 #close Reported by: Alexandre Fournier Tested by: Alexandre Fournier Change-Id: I0b8bf7e68ab938be8e6525a249260cb648cb0bfa
This commit is contained in:
parent
735d337d88
commit
9370db107a
1 changed files with 36 additions and 30 deletions
|
@ -1259,38 +1259,44 @@ static int require_mysql(const char *database, const char *tablename, va_list ap
|
|||
PICK_WHICH_ALTER_ACTION(bigint)
|
||||
}
|
||||
}
|
||||
} else if (strncmp(column->type, "float", 5) == 0 && !ast_rq_is_int(type) && type != RQ_FLOAT) {
|
||||
if (table->database->requirements == RQ_WARN) {
|
||||
ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type);
|
||||
res = -1;
|
||||
} else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else {
|
||||
res = -1;
|
||||
} else if (strncmp(column->type, "float", 5) == 0) {
|
||||
if (!ast_rq_is_int(type) && type != RQ_FLOAT) {
|
||||
if (table->database->requirements == RQ_WARN) {
|
||||
ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type);
|
||||
res = -1;
|
||||
} else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else {
|
||||
res = -1;
|
||||
}
|
||||
}
|
||||
} else if ((strncmp(column->type, "datetime", 8) == 0 || strncmp(column->type, "timestamp", 9) == 0) && type != RQ_DATETIME) {
|
||||
if (table->database->requirements == RQ_WARN) {
|
||||
ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type);
|
||||
res = -1;
|
||||
} else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else {
|
||||
res = -1;
|
||||
} else if (strncmp(column->type, "datetime", 8) == 0 || strncmp(column->type, "timestamp", 9) == 0) {
|
||||
if (type != RQ_DATETIME) {
|
||||
if (table->database->requirements == RQ_WARN) {
|
||||
ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type);
|
||||
res = -1;
|
||||
} else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else {
|
||||
res = -1;
|
||||
}
|
||||
}
|
||||
} else if ((strncmp(column->type, "date", 4) == 0) && type != RQ_DATE) {
|
||||
if (table->database->requirements == RQ_WARN) {
|
||||
ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type);
|
||||
res = -1;
|
||||
} else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else {
|
||||
res = -1;
|
||||
} else if (strncmp(column->type, "date", 4) == 0) {
|
||||
if (type != RQ_DATE) {
|
||||
if (table->database->requirements == RQ_WARN) {
|
||||
ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type);
|
||||
res = -1;
|
||||
} else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) {
|
||||
table_altered = 1;
|
||||
} else {
|
||||
res = -1;
|
||||
}
|
||||
}
|
||||
} else { /* Other, possibly unsupported types? */
|
||||
if (table->database->requirements == RQ_WARN) {
|
||||
|
|
Loading…
Reference in a new issue