Skip to content
This repository was archived by the owner on Jul 1, 2026. It is now read-only.
This repository was archived by the owner on Jul 1, 2026. It is now read-only.

Utilize sqlite3_expanded_sql to retrieve sql statements with bindings #1678

Description

@smith-xyz

Summary

With sqlite3_expanded_sql() you can retrieve the expanded version of the sql statement with the bindings. This is useful mostly for debugging purposes but could be useful if one has a disaster recovery process utilizing the prepared sql statements. Since sqlite3 has provided this as part of the api it may be nice to utilize here instead of creating an alternative process for creating that expanded sql.

Proposed implementation

Wondering if maybe Statement could have a expandedSql() method that could be used for this - always just pulls the sql:

db.serialize(() => {
  db.run("CREATE TABLE lorem (info TEXT)");
  const stmt = db.prepare("INSERT INTO lorem VALUES (?)");
  console.log(stmt.expandedSql()); // returns "INSERT INTO lorem VALUES (?)"
  stmt.bind("Ipsum");
  console.log(stmt.expandedSql()); // returns "INSERT INTO lorem VALUES ("Ipsum")"
  stmt.run();
  stmt.finalize();
});

Also could see this being in the trace as well.

Here is my quick use of the api performs the same result on a prepared statement:

int main(int argc, const char *const argv[])
{
  sqlite3 *db;
  sqlite3_open_v2(argv[1], &db, SQLITE_OPEN_READONLY, NULL);

  int rc;
  sqlite3_stmt *res;
  char *query = "";
  query = "SELECT count(*) FROM `test_table` WHERE `id` = ?;";
  rc = sqlite3_prepare_v2(db, query, -1, &res, 0);
  char *expanded = "";
  expanded = sqlite3_expanded_sql(res);
  printf("ExpandedQueryBefore=%s\n", query);

  if (rc == SQLITE_OK)
  {
    sqlite3_bind_int(res, 1, 1);
  }
 expanded = sqlite3_expanded_sql(res);
  printf("ExpandedQueryAfter=%s\n", expanded);
  int step = sqlite3_step(res);
 
  sqlite3_finalize(res);
  return 0;
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions