I'm probably not the best to answer this since I don't know C, but the timing results are printed out in their own special thing.
The BEGIN_TIMER and END_TIMER functions only get used in the runOneSqlLine function, and inside the END_TIMER function is where the results actually get printed with a straight up printf that doesn't use any sort of shell callback. Any statements run through -cmd only get run through shell_exec there, without the BEGIN_TIMER or END_TIMER around them. I <think> then that simply adding those in before and after the shell_exec (line 6086 in shell.c) in the -cmd section will work, but I don't know for sure. Try it and let us know :) ------------------------------------------------------ /* ** Run a single line of SQL */ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ ... BEGIN_TIMER; rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); END_TIMER; ... ------------------------------------------------------ /* ** Print the timing results. */ static void endTimer(void){ if( enableTimer ){ sqlite3_int64 iEnd = timeOfDay(); struct rusage sEnd; getrusage(RUSAGE_SELF, &sEnd); printf("Run Time: real %.3f user %f sys %f\n", (iEnd - iBegin)*0.001, timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); } } #define END_TIMER endTimer() ------------------------------------------------------ ... }else if( strcmp(z,"-cmd")==0 ){ /* Run commands that follow -cmd first and separately from commands ** that simply appear on the command-line. This seems goofy. It would ** be better if all commands ran in the order that they appear. But ** we retain the goofy behavior for historical compatibility. */ ... open_db(&data, 0); rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg); if( zErrMsg!=0 ){ ... -----Original Message----- From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On Behalf Of Cecil Westerhof Sent: Wednesday, February 15, 2017 7:05 AM To: SQLite mailing list Subject: [sqlite] Seems that '-cmd .timer on' does not work in non interactive mode I want to do some timings. So I started with the following: sqlite3 -cmd '.timer on' ~/Databases/general.sqlite ' SELECT date , time , usertime , systemtime , idletime , waittime , stolentime , (usertime + systemtime + idletime + waittime + stolentime) AS totaltime FROM vmstat WHERE totaltime < 99 OR totaltime > 101 ;' This does display the query result, but not the runtime. At the moment I just start sqlite with: sqlite3 -cmd '.timer on' ~/Databases/general.sqlite and then interactively enter: SELECT date , time , usertime , systemtime , idletime , waittime , stolentime , (usertime + systemtime + idletime + waittime + stolentime) AS totaltime FROM vmstat WHERE totaltime < 99 OR totaltime > 101 ; I get beside the query result also: Run Time: real 0.298 user 0.264000 sys 0.036000 What is happening here? I got around it with: sqlite3 -batch -cmd '.timer on' ~/Databases/general.sqlite <<EOT SELECT date , time , usertime , systemtime , idletime , waittime , stolentime , (usertime + systemtime + idletime + waittime + stolentime) AS totaltime FROM vmstat WHERE totaltime < 99 OR totaltime > 101 ; EOT -- Cecil Westerhof _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users