diff --git a/server/modules/include/avrorouter.h b/server/modules/include/avrorouter.h index b621c3026..eeb02f6b6 100644 --- a/server/modules/include/avrorouter.h +++ b/server/modules/include/avrorouter.h @@ -71,6 +71,23 @@ static const char *avro_event_type = "event_type"; static const char *avro_timestamp = "timestamp"; static char *avro_client_ouput[] = { "Undefined", "JSON", "Avro" }; +static inline bool is_reserved_word(const char* word) +{ + return strcasecmp(word, avro_domain) == 0 || + strcasecmp(word, avro_server_id) == 0 || + strcasecmp(word, avro_sequence) == 0 || + strcasecmp(word, avro_event_number) == 0 || + strcasecmp(word, avro_event_type) == 0 || + strcasecmp(word, avro_timestamp) == 0; +} + +static inline void fix_reserved_word(char *tok) +{ + if (is_reserved_word(tok)) + { + strcat(tok, "_"); + } +} /** How a binlog file is closed */ typedef enum avro_binlog_end diff --git a/server/modules/routing/avro/avro_schema.c b/server/modules/routing/avro/avro_schema.c index 13bb44bc1..468c37c6a 100644 --- a/server/modules/routing/avro/avro_schema.c +++ b/server/modules/routing/avro/avro_schema.c @@ -584,6 +584,7 @@ static int process_column_definition(const char *nameptr, char*** dest, char*** char type[100] = ""; int len = extract_type_length(nameptr, type); nameptr = next_field_definition(nameptr); + fix_reserved_word(colname); lengths[i] = len; types[i] = strdup(type); @@ -834,11 +835,15 @@ void make_avro_token(char* dest, const char* src, int length) memcpy(dest, src, length); dest[length] = '\0'; + fix_reserved_word(dest); } int get_column_index(TABLE_CREATE *create, const char *tok) { int idx = -1; + char safe_tok[strlen(tok) + 2]; + strcpy(safe_tok, tok); + fix_reserved_word(safe_tok); for (int x = 0; x < create->columns; x++) {