Index: src/shell.c ================================================================== --- src/shell.c +++ src/shell.c @@ -3597,11 +3597,38 @@ shellAddSchemaName, 0, 0); } } -#ifdef HAVE_LINENOISE +#if HAVE_READLINE || HAVE_EDITLINE +/* +** Readline completion callbacks +*/ +static char *readline_completion_generator(const char *text, int state){ + static char **azCompletions = 0; + static int iCompletion = 0; + char *zRet; + if( state==0 ){ + sqlite3_free(azCompletions); + azCompletions = sqlite3_namelist(globalDb, text, -1, 0); + iCompletion = 0; + } + zRet = azCompletions[iCompletion++]; + if( zRet==0 ){ + sqlite3_free(azCompletions); + azCompletions = 0; + }else{ + zRet = strdup(zRet); + } + return zRet; +} +static char **readline_completion(const char *zText, int iStart, int iEnd){ + rl_attempted_completion_over = 1; + return rl_completion_matches(zText, readline_completion_generator); +} + +#elif HAVE_LINENOISE /* ** Linenoise completion callback */ static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ int nLine = (int)strlen(zLine); @@ -7663,11 +7690,13 @@ if( (zHistory = malloc(nHistory))!=0 ){ sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); } } if( zHistory ){ shell_read_history(zHistory); } -#ifdef HAVE_LINENOISE +#if HAVE_READLINE || HAVE_EDITLINE + rl_attempted_completion_function = readline_completion; +#elif HAVE_LINENOISE linenoiseSetCompletionCallback(linenoise_completion); #endif rc = process_input(&data, 0); if( zHistory ){ shell_stifle_history(100);