From 0f27be677af91b4b9147399642814bdcd80e898b Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 29 Nov 2018 13:03:30 +0300 Subject: [PATCH] db: sql debug mode was executing the SQL twice When you turned on debugging it was calling debug_sql() as well as sql_exec() which executes the SQL twice. That's harmless when you're reading from the on-disk DB, but it becomes a problem when you're inserting duplicate data into the in-mem DB. Also it was really confusing to see the duplicate data. Signed-off-by: Dan Carpenter --- smatch.h | 2 -- smatch_db.c | 38 ++++++++++++++++++-------------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/smatch.h b/smatch.h index f9e633f5..61c83e4c 100644 --- a/smatch.h +++ b/smatch.h @@ -777,7 +777,6 @@ extern struct sqlite3 *smatch_db; extern struct sqlite3 *mem_db; extern struct sqlite3 *cache_db; -void debug_sql(struct sqlite3 *db, const char *sql); void db_ignore_states(int id); void select_caller_info_hook(void (*callback)(const char *name, struct symbol *sym, char *key, char *value), int type); void add_member_info_callback(int owner, void (*callback)(struct expression *call, int param, char *printed_name, struct sm_state *sm)); @@ -806,7 +805,6 @@ do { \ \ sqlite3_snprintf(sizeof(sql_txt), sql_txt, sql); \ sm_debug("debug: %s\n", sql_txt); \ - debug_sql(db, sql_txt); \ sql_exec(db, call_back, data, sql_txt); \ } while (0) diff --git a/smatch_db.c b/smatch_db.c index 02d77b5d..081cdea9 100644 --- a/smatch_db.c +++ b/smatch_db.c @@ -99,22 +99,6 @@ char *escape_newlines(char *str) return (alloc_sname(buf)); } -void sql_exec(struct sqlite3 *db, int (*callback)(void*, int, char**, char**), void *data, const char *sql) -{ - char *err = NULL; - int rc; - - if (!db) - return; - - rc = sqlite3_exec(db, sql, callback, data, &err); - if (rc != SQLITE_OK && !parse_error) { - fprintf(stderr, "SQL error #2: %s\n", err); - fprintf(stderr, "SQL: '%s'\n", sql); - parse_error = 1; - } -} - static int print_sql_output(void *unused, int argc, char **argv, char **azColName) { int i; @@ -128,12 +112,26 @@ static int print_sql_output(void *unused, int argc, char **argv, char **azColNam return 0; } -void debug_sql(struct sqlite3 *db, const char *sql) +void sql_exec(struct sqlite3 *db, int (*callback)(void*, int, char**, char**), void *data, const char *sql) { - if (!option_debug) + char *err = NULL; + int rc; + + if (!db) return; - sm_msg("%s", sql); - sql_exec(db, print_sql_output, NULL, sql); + + if (option_debug) { + sm_msg("%s", sql); + if (strncasecmp(sql, "select", strlen("select")) == 0) + sqlite3_exec(db, sql, print_sql_output, NULL, NULL); + } + + rc = sqlite3_exec(db, sql, callback, data, &err); + if (rc != SQLITE_OK && !parse_error) { + fprintf(stderr, "%s:%d SQL error #2: %s\n", get_filename(), get_lineno(), err); + fprintf(stderr, "%s:%d SQL: '%s'\n", get_filename(), get_lineno(), sql); + parse_error = 1; + } } static int replace_count; -- 2.11.4.GIT