Hombre aunque hagas el checkeo del código devuelto, es como si no lo estuvieses haciendo, porque lo único que haces es liberar el puntero con el mensaje de error, pero no estas informando de si ha entrado en el "if" o no, con lo cual no te enteraras....
Respecto al warning, es normal, porque como te he dicho es un doble puntero de char, si vienes de lenguajes de programación de alto nivel, seria algo parecido a un array de strings.
Debería ser:
printf("Columna: %s - Valor: %s", azColName[x], argv[x]);
Donde x sea un int claro...
Prueba este callback a ver:
static int SQLite3_callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
printf("Numero de resultados: %i\n", argc);
for(i=0; i<argc; i++)
printf("Columna: %s, Valor: %s\n", azColName[i], argv[i]);
return 0;
}