Skip to content

Commit 04f942e

Browse files
committed
Replaced name escape with a function (WP 2)
1 parent 9979cc7 commit 04f942e

File tree

4 files changed

+28
-24
lines changed

4 files changed

+28
-24
lines changed

src/cloudsync.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -573,9 +573,9 @@ char *table_build_values_sql (db_t *db, cloudsync_table_context *table) {
573573

574574
// Unfortunately in SQLite column names (or table names) cannot be bound parameters in a SELECT statement
575575
// otherwise we should have used something like SELECT 'SELECT ? FROM %w WHERE rowid=?';
576-
577-
char *singlequote_escaped_table_name = cloudsync_memory_mprintf("%q", table->name);
578-
576+
char buffer[1024];
577+
char *singlequote_escaped_table_name = sql_escape_name(table->name, buffer, sizeof(buffer));
578+
579579
#if !CLOUDSYNC_DISABLE_ROWIDONLY_TABLES
580580
if (table->rowid_only) {
581581
sql = memory_mprintf("WITH col_names AS (SELECT group_concat('\"' || format('%%w', name) || '\"', ',') AS cols FROM pragma_table_info('%q') WHERE pk=0 ORDER BY cid) SELECT 'SELECT ' || (SELECT cols FROM col_names) || ' FROM \"%w\" WHERE rowid=?;'", table->name, table->name);
@@ -588,7 +588,6 @@ char *table_build_values_sql (db_t *db, cloudsync_table_context *table) {
588588
#if !CLOUDSYNC_DISABLE_ROWIDONLY_TABLES
589589
process_process:
590590
#endif
591-
cloudsync_memory_free(singlequote_escaped_table_name);
592591
if (!sql) return NULL;
593592

594593
char *query = NULL;
@@ -606,9 +605,9 @@ char *table_build_mergedelete_sql (db_t *db, cloudsync_table_context *table) {
606605
}
607606
#endif
608607

609-
char *singlequote_escaped_table_name = cloudsync_memory_mprintf("%q", table->name);
608+
char buffer[1024];
609+
char *singlequote_escaped_table_name = sql_escape_name(table->name, buffer, sizeof(buffer));
610610
char *sql = cloudsync_memory_mprintf("WITH pk_where AS (SELECT group_concat('\"' || format('%%w', name) || '\"', '=? AND ') || '=?' AS pk_clause FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk) SELECT 'DELETE FROM \"%w\" WHERE ' || (SELECT pk_clause FROM pk_where) || ';'", table->name, singlequote_escaped_table_name);
611-
cloudsync_memory_free(singlequote_escaped_table_name);
612611
if (!sql) return NULL;
613612

614613
char *query = NULL;
@@ -634,18 +633,17 @@ char *table_build_mergeinsert_sql (db_t *db, cloudsync_table_context *table, con
634633
}
635634
#endif
636635

637-
char *singlequote_escaped_table_name = cloudsync_memory_mprintf("%q", table->name);
636+
char buffer[1024];
637+
char *singlequote_escaped_table_name = sql_escape_name(table->name, buffer, sizeof(buffer));
638638

639639
if (colname == NULL) {
640640
// is sentinel insert
641641
sql = cloudsync_memory_mprintf("WITH pk_where AS (SELECT group_concat('\"' || format('%%w', name) || '\"') AS pk_clause FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk), pk_bind AS (SELECT group_concat('?') AS pk_binding FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk) SELECT 'INSERT OR IGNORE INTO \"%w\" (' || (SELECT pk_clause FROM pk_where) || ') VALUES (' || (SELECT pk_binding FROM pk_bind) || ');'", table->name, table->name, singlequote_escaped_table_name);
642642
} else {
643-
char *singlequote_escaped_col_name = cloudsync_memory_mprintf("%q", colname);
643+
char buffer2[1024];
644+
char *singlequote_escaped_col_name = sql_escape_name(colname, buffer2, sizeof(buffer2));
644645
sql = cloudsync_memory_mprintf("WITH pk_where AS (SELECT group_concat('\"' || format('%%w', name) || '\"') AS pk_clause FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk), pk_bind AS (SELECT group_concat('?') AS pk_binding FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk) SELECT 'INSERT INTO \"%w\" (' || (SELECT pk_clause FROM pk_where) || ',\"%w\") VALUES (' || (SELECT pk_binding FROM pk_bind) || ',?) ON CONFLICT DO UPDATE SET \"%w\"=?;'", table->name, table->name, singlequote_escaped_table_name, singlequote_escaped_col_name, singlequote_escaped_col_name);
645-
cloudsync_memory_free(singlequote_escaped_col_name);
646-
647646
}
648-
cloudsync_memory_free(singlequote_escaped_table_name);
649647
if (!sql) return NULL;
650648

651649
char *query = NULL;
@@ -666,11 +664,11 @@ char *table_build_value_sql (db_t *db, cloudsync_table_context *table, const cha
666664
#endif
667665

668666
// SELECT age FROM customers WHERE first_name=? AND last_name=?;
669-
char *singlequote_escaped_table_name = cloudsync_memory_mprintf("%q", table->name);
670-
char *singlequote_escaped_col_name = cloudsync_memory_mprintf("%q", colname);
667+
char buffer[1024];
668+
char buffer2[1024];
669+
char *singlequote_escaped_table_name = sql_escape_name(table->name, buffer, sizeof(buffer));
670+
char *singlequote_escaped_col_name = sql_escape_name(colname, buffer2, sizeof(buffer2));
671671
char *sql = cloudsync_memory_mprintf("WITH pk_where AS (SELECT group_concat('\"' || format('%%w', name) || '\"', '=? AND ') || '=?' AS pk_clause FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk) SELECT 'SELECT %s%w%s FROM \"%w\" WHERE ' || (SELECT pk_clause FROM pk_where) || ';'", table->name, colnamequote, singlequote_escaped_col_name, colnamequote, singlequote_escaped_table_name);
672-
cloudsync_memory_free(singlequote_escaped_col_name);
673-
cloudsync_memory_free(singlequote_escaped_table_name);
674672
if (!sql) return NULL;
675673

676674
char *query = NULL;
@@ -1736,13 +1734,11 @@ int cloudsync_finalize_alter (cloudsync_context *data, cloudsync_table_context *
17361734
goto finalize;
17371735
}
17381736

1739-
char *singlequote_escaped_table_name = cloudsync_memory_mprintf("%q", table->name);
1737+
char buffer[1024];
1738+
char *singlequote_escaped_table_name = sql_escape_name(table->name, buffer, sizeof(buffer));
17401739
sql = cloudsync_memory_mprintf("SELECT group_concat('\"%w\".\"' || format('%%w', name) || '\"', ',') FROM pragma_table_info('%s') WHERE pk>0 ORDER BY pk;", singlequote_escaped_table_name, singlequote_escaped_table_name);
1741-
cloudsync_memory_free(singlequote_escaped_table_name);
1742-
if (!sql) {
1743-
rc = DBRES_NOMEM;
1744-
goto finalize;
1745-
}
1740+
if (!sql) {rc = DBRES_NOMEM; goto finalize;}
1741+
17461742
char *pkclause = NULL;
17471743
int rc = database_select_text(db, sql, &pkclause);
17481744
cloudsync_memory_free(sql);

src/database.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ int database_create_metatable (db_t *db, const char *table_name);
7272
int database_create_triggers (db_t *db, const char *table_name, table_algo algo);
7373
int database_delete_triggers (db_t *db, const char *table_name);
7474
int database_debug (db_t *db, bool print_result);
75+
int database_pk_names (db_t *db, const char *table_name, char ***names, int *count);
7576

7677
int database_count_pk (db_t *db, const char *table_name, bool not_null);
7778
int database_count_int_pk (db_t *db, const char *table_name);
@@ -141,8 +142,9 @@ char *dbmem_vmprintf (const char *format, va_list list);
141142
void dbmem_free (void *ptr);
142143
db_uint64 dbmem_size (void *ptr);
143144

144-
int database_pk_names (db_t *db, const char *table_name, char ***names, int *count);
145+
// SQL
145146
char *sql_build_drop_table (const char *table_name, char *buffer, int bsize, bool is_meta);
147+
char *sql_escape_name (const char *name, char *buffer, size_t bsize);
146148

147149
// USED ONLY by SQLite Cloud to implement RLS
148150
typedef struct cloudsync_pk_decode_bind_context cloudsync_pk_decode_bind_context;

src/database_sqlite.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ char *sql_build_drop_table (const char *table_name, char *buffer, int bsize, boo
4040
return sql;
4141
}
4242

43+
char *sql_escape_name (const char *name, char *buffer, size_t bsize) {
44+
return sqlite3_snprintf((int)bsize, buffer, "%q", name);
45+
}
46+
4347
// MARK: - PRIVATE -
4448

4549
int database_select1_value (db_t *db, const char *sql, char **ptr_value, db_int64 *int_value, DBTYPE expected_type) {

src/sql_sqlite.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
#include "sql.h"
99

10-
// MARK: - Settings -
10+
// MARK: Settings
1111

1212
const char * const SQL_SETTINGS_GET_VALUE =
1313
"SELECT value FROM cloudsync_settings WHERE key=?1;";
@@ -67,7 +67,7 @@ const char * const SQL_SETTINGS_CLEANUP_DROP_ALL =
6767
"DROP TABLE IF EXISTS cloudsync_table_settings; "
6868
"DROP TABLE IF EXISTS cloudsync_schema_versions; ";
6969

70-
// MARK: - CloudSync -
70+
// MARK: CloudSync
7171

7272
const char * const SQL_DBVERSION_BUILD_QUERY =
7373
"WITH table_names AS ("
@@ -97,3 +97,5 @@ const char * const SQL_SITEID_GETSET_ROWID_BY_SITEID =
9797
"INSERT INTO cloudsync_site_id (site_id) VALUES (?) "
9898
"ON CONFLICT(site_id) DO UPDATE SET site_id = site_id "
9999
"RETURNING rowid;";
100+
101+
// Format

0 commit comments

Comments
 (0)