mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
When SQLTester hits an unknown command, emit a warning and skip the rest of that script instead of aborting the whole run, per /chat discussion. Reduce verbosity a bit.
FossilOrigin-Name: 3e78d22d04e6ac2606bfc5ce250a4c3b39a2062e14011ca0a8a0a85491efbfde
This commit is contained in:
@ -25,6 +25,15 @@ class TestFailure extends RuntimeException {
|
|||||||
super(msg);
|
super(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SkipTestRemainder extends RuntimeException {
|
||||||
|
public TestScript testScript;
|
||||||
|
public SkipTestRemainder(TestScript ts){
|
||||||
|
super("Skipping remainder of "+ts.getName());
|
||||||
|
testScript = ts;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This class provides an application which aims to implement the
|
This class provides an application which aims to implement the
|
||||||
rudimentary SQL-driven test tool described in the accompanying
|
rudimentary SQL-driven test tool described in the accompanying
|
||||||
@ -44,10 +53,12 @@ public class SQLTester {
|
|||||||
private String nullView;
|
private String nullView;
|
||||||
private int nTotalTest = 0;
|
private int nTotalTest = 0;
|
||||||
private int nTestFile = 0;
|
private int nTestFile = 0;
|
||||||
|
private int nAbortedScript = 0;
|
||||||
private int nTest;
|
private int nTest;
|
||||||
private final sqlite3[] aDb = new sqlite3[7];
|
private final sqlite3[] aDb = new sqlite3[7];
|
||||||
private int iCurrentDb = 0;
|
private int iCurrentDb = 0;
|
||||||
private final String initialDbName = "test.db";
|
private final String initialDbName = "test.db";
|
||||||
|
private TestScript currentScript;
|
||||||
|
|
||||||
public SQLTester(){
|
public SQLTester(){
|
||||||
reset();
|
reset();
|
||||||
@ -86,18 +97,31 @@ public class SQLTester {
|
|||||||
openDb(0, initialDbName, true);
|
openDb(0, initialDbName, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestScript getCurrentScript(){
|
||||||
|
return currentScript;
|
||||||
|
}
|
||||||
|
|
||||||
public void runTests() throws Exception {
|
public void runTests() throws Exception {
|
||||||
// process each input file
|
// process each input file
|
||||||
outln("Verbose = ",outer.isVerbose());
|
try {
|
||||||
for(String f : listInFiles){
|
for(String f : listInFiles){
|
||||||
reset();
|
reset();
|
||||||
setupInitialDb();
|
setupInitialDb();
|
||||||
++nTestFile;
|
++nTestFile;
|
||||||
final TestScript ts = new TestScript(f);
|
final TestScript ts = new TestScript(f);
|
||||||
|
currentScript = ts;
|
||||||
outln("---------> Test ",ts.getName()," ...");
|
outln("---------> Test ",ts.getName()," ...");
|
||||||
|
try{
|
||||||
ts.run(this);
|
ts.run(this);
|
||||||
|
}catch(SkipTestRemainder e){
|
||||||
|
/* not an error */
|
||||||
|
++nAbortedScript;
|
||||||
|
}
|
||||||
outln("<--------- ",nTest," test(s) in ",f);
|
outln("<--------- ",nTest," test(s) in ",f);
|
||||||
}
|
}
|
||||||
|
}finally{
|
||||||
|
currentScript = null;
|
||||||
|
}
|
||||||
Util.unlink(initialDbName);
|
Util.unlink(initialDbName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,6 +221,16 @@ public class SQLTester {
|
|||||||
|
|
||||||
void setNullValue(String v){nullView = v;}
|
void setNullValue(String v){nullView = v;}
|
||||||
|
|
||||||
|
/**
|
||||||
|
If true, encountering an unknown command in a script causes the
|
||||||
|
remainder of the script to be skipped, rather than aborting the
|
||||||
|
whole script run.
|
||||||
|
*/
|
||||||
|
boolean skipUnknownCommands(){
|
||||||
|
// Currently hard-coded. Potentially a flag someday.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void incrementTestCounter(){ ++nTest; ++nTotalTest; }
|
void incrementTestCounter(){ ++nTest; ++nTotalTest; }
|
||||||
|
|
||||||
String escapeSqlValue(String v){
|
String escapeSqlValue(String v){
|
||||||
@ -290,6 +324,7 @@ public class SQLTester {
|
|||||||
final String flag = a.replaceFirst("-+","");
|
final String flag = a.replaceFirst("-+","");
|
||||||
if( flag.equals("verbose") ){
|
if( flag.equals("verbose") ){
|
||||||
t.setVerbose(true);
|
t.setVerbose(true);
|
||||||
|
t.outln("Verbose mode is on.");
|
||||||
}else if( flag.equals("quiet") ) {
|
}else if( flag.equals("quiet") ) {
|
||||||
t.setVerbose(false);
|
t.setVerbose(false);
|
||||||
}else{
|
}else{
|
||||||
@ -300,7 +335,10 @@ public class SQLTester {
|
|||||||
t.addTestScript(a);
|
t.addTestScript(a);
|
||||||
}
|
}
|
||||||
t.runTests();
|
t.runTests();
|
||||||
t.outer.outln("Processed ",t.nTotalTest," test(s) in ",t.nTestFile," file(s).");
|
t.outln("Processed ",t.nTotalTest," test(s) in ",t.nTestFile," file(s).");
|
||||||
|
if( t.nAbortedScript > 0 ){
|
||||||
|
t.outln("Aborted ",t.nAbortedScript," script(s).");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,7 +404,7 @@ class CloseDbCommand extends Command {
|
|||||||
if(argv.length>1){
|
if(argv.length>1){
|
||||||
String arg = argv[1];
|
String arg = argv[1];
|
||||||
if("all".equals(arg)){
|
if("all".equals(arg)){
|
||||||
t.verbose(argv[0]," all dbs");
|
//t.verbose(argv[0]," all dbs");
|
||||||
t.closeAllDbs();
|
t.closeAllDbs();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -377,7 +415,7 @@ class CloseDbCommand extends Command {
|
|||||||
id = t.getCurrentDbId();
|
id = t.getCurrentDbId();
|
||||||
}
|
}
|
||||||
t.closeDb(id);
|
t.closeDb(id);
|
||||||
t.verbose(argv[0]," db ",id);
|
//t.verbose(argv[0]," db ",id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,7 +424,7 @@ class DbCommand extends Command {
|
|||||||
argcCheck(argv,1);
|
argcCheck(argv,1);
|
||||||
affirmNoContent(content);
|
affirmNoContent(content);
|
||||||
final sqlite3 db = t.setCurrentDb( Integer.parseInt(argv[1]) );
|
final sqlite3 db = t.setCurrentDb( Integer.parseInt(argv[1]) );
|
||||||
t.verbose(argv[0]," set db to ",db);
|
//t.verbose(argv[0]," set db to ",db);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,7 +448,7 @@ class NewDbCommand extends Command {
|
|||||||
String fname = argv[1];
|
String fname = argv[1];
|
||||||
Util.unlink(fname);
|
Util.unlink(fname);
|
||||||
final sqlite3 db = t.openDb(fname, true);
|
final sqlite3 db = t.openDb(fname, true);
|
||||||
t.verbose(argv[0]," db ",db);
|
//t.verbose(argv[0]," db ",db);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,7 +478,7 @@ class OpenDbCommand extends Command {
|
|||||||
affirmNoContent(content);
|
affirmNoContent(content);
|
||||||
String fname = argv[1];
|
String fname = argv[1];
|
||||||
final sqlite3 db = t.openDb(fname, false);
|
final sqlite3 db = t.openDb(fname, false);
|
||||||
t.verbose(argv[0]," db ",db);
|
//t.verbose(argv[0]," db ",db);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,8 +561,15 @@ class CommandDispatcher {
|
|||||||
static void dispatch(SQLTester tester, String[] argv, String content) throws Exception{
|
static void dispatch(SQLTester tester, String[] argv, String content) throws Exception{
|
||||||
final Class cmdClass = getCommandByName(argv[0]);
|
final Class cmdClass = getCommandByName(argv[0]);
|
||||||
if(null == cmdClass){
|
if(null == cmdClass){
|
||||||
|
final TestScript ts = tester.getCurrentScript();
|
||||||
|
if( tester.skipUnknownCommands() ){
|
||||||
|
tester.outln("WARNING: skipping remainder of ",ts.getName(),
|
||||||
|
" because it contains unknown command '",argv[0],"'.");
|
||||||
|
throw new SkipTestRemainder(ts);
|
||||||
|
}
|
||||||
Util.toss(IllegalArgumentException.class,
|
Util.toss(IllegalArgumentException.class,
|
||||||
"No command handler found for '"+argv[0]+"'");
|
"No command handler found for '"+argv[0]+"' in ",
|
||||||
|
ts.getName());
|
||||||
}
|
}
|
||||||
final java.lang.reflect.Constructor<Command> ctor =
|
final java.lang.reflect.Constructor<Command> ctor =
|
||||||
cmdClass.getConstructor(SQLTester.class, String[].class, String.class);
|
cmdClass.getConstructor(SQLTester.class, String[].class, String.class);
|
||||||
@ -532,7 +577,8 @@ class CommandDispatcher {
|
|||||||
//tester.verbose("Running ",argv[0]," with:\n", content);
|
//tester.verbose("Running ",argv[0]," with:\n", content);
|
||||||
ctor.newInstance(tester, argv, content);
|
ctor.newInstance(tester, argv, content);
|
||||||
}catch(java.lang.reflect.InvocationTargetException e){
|
}catch(java.lang.reflect.InvocationTargetException e){
|
||||||
throw (Exception)e.getCause();
|
Throwable t = e.getCause();
|
||||||
|
throw (t!=null && t instanceof Exception) ? (Exception)t : e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ junk
|
|||||||
select 1;
|
select 1;
|
||||||
select 2;
|
select 2;
|
||||||
-- comment
|
-- comment
|
||||||
intentional syntax error
|
-- uncomment to introduce intentional syntax error
|
||||||
--oom
|
--oom
|
||||||
--print
|
--print
|
||||||
This is from the print command.
|
This is from the print command.
|
||||||
@ -33,3 +33,4 @@ select 'a'
|
|||||||
--open SQLTester.db
|
--open SQLTester.db
|
||||||
--print
|
--print
|
||||||
Re-opened db.
|
Re-opened db.
|
||||||
|
--an-uknown-command
|
||||||
|
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
|||||||
C Correct\sthe\sspacing\soutput\sof\smulti-select\sSQL\sblocks\sfor\sSQLTester\s--result.
|
C When\sSQLTester\shits\san\sunknown\scommand,\semit\sa\swarning\sand\sskip\sthe\srest\sof\sthat\sscript\sinstead\sof\saborting\sthe\swhole\srun,\sper\s/chat\sdiscussion.\sReduce\sverbosity\sa\sbit.
|
||||||
D 2023-08-08T14:58:00.844
|
D 2023-08-08T19:20:12.267
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@ -266,10 +266,10 @@ F ext/jni/src/org/sqlite/jni/sqlite3_context.java d26573fc7b309228cb49786e907859
|
|||||||
F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc
|
F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc
|
||||||
F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a
|
F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a
|
||||||
F ext/jni/src/org/sqlite/jni/tester/Outer.java 3d9c40f8ed58ec0df05ca160986ea06ec84ec1f338b069cfba9604bbba467a01
|
F ext/jni/src/org/sqlite/jni/tester/Outer.java 3d9c40f8ed58ec0df05ca160986ea06ec84ec1f338b069cfba9604bbba467a01
|
||||||
F ext/jni/src/org/sqlite/jni/tester/SQLTester.java c26e0be30b03b9bf233903b0dd11314a38b8c47c7f9a322d9c383deab0f1799c
|
F ext/jni/src/org/sqlite/jni/tester/SQLTester.java 099c256f46dd0fe9ea00e25e2adb2b56cf1ea5765214b1a07b234179f154e6d5
|
||||||
F ext/jni/src/org/sqlite/jni/tester/TestScript.java 52350fb458d7d2816377a824c18c498c4a97f0026b64278f62ff1c382a92a070
|
F ext/jni/src/org/sqlite/jni/tester/TestScript.java 52350fb458d7d2816377a824c18c498c4a97f0026b64278f62ff1c382a92a070
|
||||||
F ext/jni/src/org/sqlite/jni/tester/test-script-interpreter.md 4a4868c70a68aa1829c1f7659daa78198187199d176778efb86a239c9e58802c
|
F ext/jni/src/org/sqlite/jni/tester/test-script-interpreter.md 4a4868c70a68aa1829c1f7659daa78198187199d176778efb86a239c9e58802c
|
||||||
F ext/jni/src/tests/000_first.test 752aca36279f9b0ceedaf15a4ce6bc9e0b7f9ca2749287e204d81ca2f7e41e6f
|
F ext/jni/src/tests/000_first.test 67c095b9ba8d1e57ea5f996126f8a9a76c2fffbe6c0b9d4083e604f7991e54d8
|
||||||
F ext/jni/src/tests/010_ignored.test ce2de6742ff1bf98d8976fda0f260ff3d280e8f8c0a99309fb59fcfef2556fcd
|
F ext/jni/src/tests/010_ignored.test ce2de6742ff1bf98d8976fda0f260ff3d280e8f8c0a99309fb59fcfef2556fcd
|
||||||
F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9
|
F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9
|
||||||
F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013
|
F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013
|
||||||
@ -2090,8 +2090,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P d2c99b96f4b61561c3fa34947ca7bfd2cd214b1913aff7ba64b7b897a574fea3
|
P 8d98645a9e524b30f7faa1cffd8f09e7aab3c25ac7b08dd6884141dfe9cdb0d3
|
||||||
R 93a03db65e40af7c6fe9793f15a6ca43
|
R a618fd6ff82f81612f61c1de1f6b473b
|
||||||
U stephan
|
U stephan
|
||||||
Z dca17c3e57d683e1e595814410eca997
|
Z c4565e5d104af1325b5207d0f09e8da7
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@ -1 +1 @@
|
|||||||
8d98645a9e524b30f7faa1cffd8f09e7aab3c25ac7b08dd6884141dfe9cdb0d3
|
3e78d22d04e6ac2606bfc5ce250a4c3b39a2062e14011ca0a8a0a85491efbfde
|
Reference in New Issue
Block a user