2009/7/3 chandan <chandan.b...@globaledgesoft.com>: > Hi all, > Consider the following scenario, > 1. A table contains a column of type "text". > 2. The value of this column for the first row is say "linux". > > If we execute the SQL statement: "select name from some_tbl where id = ?" > using sqlite3_step() API, then what is the value returned by > sqlite3_column_bytes(). Does the count include the '\0' byte (count == > 6). If it does not include the '\0' byte the count should be 5. > > I executed the following program: > > /******************************************************************************/ > #include <stdio.h> > #include <stdint.h> > #include <stdlib.h> > #include <string.h> > #include "sqlite3.h" > > const char *update_db = "update some_tbl set name = ? where id = ?"; > const char *read_db = "select name from some_tbl where id = ?"; > > int32_t main(int argc, char *argv[]) > { > sqlite3_stmt *stmt; > sqlite3 *db; > int32_t num_bytes; > char buf[100]; > int32_t ret; > > if (argc != 2) { > fprintf(stderr, "Usage: %s <database name>\n", argv[0]); > goto out1; > } > > ret = sqlite3_initialize(); > if (ret != SQLITE_OK) { > fprintf(stderr, "Unable to initialize db.\n"); > goto out1; > } > > ret = sqlite3_open(argv[1], &db); > if (ret != SQLITE_OK) { > fprintf(stderr, "Unable to open database.\n"); > goto out2; > } > > stmt = NULL; > ret = sqlite3_prepare_v2(db, update_db, strlen(update_db) + 1, > &stmt, NULL); > if (ret != SQLITE_OK) { > fprintf(stderr, "sqlite3_prepare_v2: %s.\n", > sqlite3_errmsg(db)); > goto out3; > } > > ret = sqlite3_bind_text(stmt, 1, "linux", strlen("linux") + 1, > SQLITE_TRANSIENT);
This will insert 6 bytes into the db - includes the trailing '\0' > if (ret != SQLITE_OK) { > fprintf(stderr, "sqlite3_bind_text: %s.\n", > sqlite3_errmsg(db)); > goto out4; > } > > ret = sqlite3_bind_int64(stmt, 2, 1); > if (ret != SQLITE_OK) { > fprintf(stderr, "sqlite3_bind_int64: %s.\n", > sqlite3_errmsg(db)); > goto out4; > } > > ret = sqlite3_step(stmt); > if (ret != SQLITE_DONE) { > fprintf(stderr, "sqlite3_step: %s.\n", > sqlite3_errmsg(db)); > goto out4; > } > > ret = sqlite3_finalize(stmt); > if (ret != SQLITE_OK) { > fprintf(stderr, "sqlite3_finalize: %s.\n", > sqlite3_errmsg(db)); > } > > stmt = NULL; > ret = sqlite3_prepare_v2(db, read_db, strlen(read_db) + 1, &stmt, > NULL); > if (ret != SQLITE_OK) { > fprintf(stderr, "sqlite3_prepare_v2: %s.\n", > sqlite3_errmsg(db)); > goto out3; > } > > ret = sqlite3_bind_int64(stmt, 1, 1); > if (ret != SQLITE_OK) { > fprintf(stderr, "sqlite3_bind_int64: %s.\n", > sqlite3_errmsg(db)); > goto out4; > } > > ret = sqlite3_step(stmt); > if (ret != SQLITE_ROW) { > fprintf(stderr, "sqlite3_step: %s.\n", > sqlite3_errmsg(db)); > goto out4; > } > > num_bytes = sqlite3_column_bytes(stmt, 0); > printf("*** num_bytes = %d ***\n", num_bytes); > > memcpy(buf, sqlite3_column_text(stmt, 0), num_bytes); > printf("*** buf = %s ***\n", buf); > > exit(0); > > out4: > ret = sqlite3_finalize(stmt); > out3: > ret = sqlite3_close(db); > out2: > ret = sqlite3_shutdown(); > out1: > exit(1); > } > /*****************************************************************************/ > > > The output shows that sqlite3_column_bytes() returns a count value that > includes the '\0'. Please correct me if I am arriving at the wrong > conclusion. This is what I would expect given that you are inserting a string that includes the '\0'. Your initial statement that the db contains 'linux' is wrong; it contains 'linux\0'. Regards, Simon _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users