sqlite - 在 C 代码中返回 expr 不适用于 sqlite3_exec()
问题描述
返回 expr 不使用 sqlite3_exec() 在 C 代码中给出以下错误,但在 sqlite3 终端上工作正常
sqlite> insert INTO mqtt6 values('abcd',1623066863471168894,1623066863471,119) RETURNING (SELECT sum(size_t) from mqtt6) ;
76041
sqlite>
但是当我尝试从 C 代码运行相同的命令时,出现如下错误:
loki@loki-01 ~/sqlite_dbstat/simple_sqlite - $ ./a.out
bytes_written=0 insert OR REPLACE INTO mqtt6 values ('abcd',1623066863471168258,1623066863471168258,119) RETURNING (SELECT sum(size_t) from mqtt6);
**SQL error: near "RETURNING": syntax error**
完整的C代码:
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>
#define TABLE_NAME "mqtt5"
int main(void) {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
//make table
char *sql_cr = "CREATE TABLE IF NOT EXISTS mqtt6 (payload TEXT NOT NULL, timestamp INTEGER , uuid TEXT PRIMARY KEY NOT NULL,size_t INTEGER);";
rc = sqlite3_exec(db, sql_cr, 0, 0, &err_msg);
unsigned long long ts=1623066863471168257;
unsigned long long bytes_written=0;
char sql[1000]={'\0'};
char * str="abcd";
sprintf(sql,"insert INTO mqtt6 values ('%s',%llu,%llu,%lu) RETURNING (SELECT sum(size_t) from mqtt6);",str,ts,ts,strlen(str)+8+19+4);
printf("bytes_written=%llu %s\n",bytes_written,sql);
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
return 0;
}
解决方案
推荐阅读
- bash - TERM 陷阱不能可靠地杀死后台睡眠进程
- file - Golang 使用 bufio.Scanner 多次扫描同一行
- ios - 将 UIBarButtomItem 添加为 UITabBarController 的子项
- python - 来自 celery 任务的 Python 信号
- c - 如何链接两个不同的视觉工作室项目?
- docker - Makefile:从 docker 容器中提取环境变量并在另一个 docker 容器中使用它
- ios - 从 UITableViewController 的 View Model 中呈现 Modal
- powershell - 在powershell中对来自`docker ps`的输出进行排序,同时将表头保持在顶部
- javascript - 加载程序加载时如何停用背景
- swift - 快速检查或验证波斯语(波斯语)字符串