lizby Guru Joined: 17/05/2016 Location: United StatesPosts: 3829
Posted: 04:08pm 24 Jul 2026
Copy link to clipboard
Print this post
Peter produced v0.12. I flashed it and got Claude code to run the 56-query test from PicoDB (data and queries converted to SQL). The run skipped the 5 queries which updated the basic tables, so as not to corrupt the file for future runs. It ran in 12 minutes, 41 seconds compared to 87 minutes for PicoDB (with the MMBasic code converted to micropython)--9 minutes 19 seconds if the results were not sent to console and hdmi screen. Quote ┌──────┬─────────────────────────────┬────────────┬───────────────────────┐ │ Run │ Engine │ Display │ Wall-clock │ ├──────┼─────────────────────────────┼────────────┼───────────────────────┤ │ Then │ PicoDB (interpreted Python) │ rows shown │ 5,202,693 ms ≈ 87 min │ ├──────┼─────────────────────────────┼────────────┼───────────────────────┤ │ Now │ usqlite v0.12 │ query-only │ 559,909 ms = 9m 19s │ ├──────┼─────────────────────────────┼────────────┼───────────────────────┤ │ Now │ usqlite v0.12 │ rows shown │ 761,392 ms = 12m 41s │ └──────┴─────────────────────────────┴────────────┴───────────────────────┘ I need to note that the "56" queries were whittled down--I hadn't realized that 3 had been commented out and weren't in either run, and 5 were PicoDB-specific, like switching to SQL mode: Quote - Test 31 format person … — saves a display layout to a .fmt file - Test 32 state=LA format occupation — a query using a named display format - Test 41 MODE SQL / Test 44 MODE NATIVE — switch PicoDB's parser mode (meaningless in usqlite, which is always SQL) - Test 45 ruler jobsort.dat — a visual byte-layout debugging tool for the .dat file - Test 46 Set INDEXING OFF / ON — manual index toggle (SQLite manages indexes itself) Here's the query file: Quote # Test 1: Simple equality query SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' # Test 2: Compound query with AND SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' AND u.state='TX' # Test 3: Quoted value (spaces) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='San Francisco' # Test 5: Complex query with parentheses SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE (u.city='Abilene' OR u.city='Fresno') AND u.state='CA' # Test 6: LIKE pattern matching SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%San%' # Test 7: Numeric comparison (child field) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.age>60 # Test 8: ORDER BY ascending SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY t.age # Test 9: ORDER BY descending SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY t.salary DESC # Test 10: LIMIT results SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' LIMIT 5 # Test 11: ORDER BY with LIMIT SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY t.salary DESC LIMIT 3 # Test 12: SHOW selected fields (parent-only) SELECT last_name,first_name,city FROM us500 WHERE state='LA' LIMIT 5 # Test 13: SHOW with ORDER BY and LIMIT SELECT u.last_name,t.age,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='TX' ORDER BY t.age DESC LIMIT 5 # Test 14: (was TXT output to Louisiana.txt) -- displayed instead SELECT u.last_name,u.first_name,u.city,t.age FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' # Test 15: (was CSV output to Louisiana.csv) -- displayed instead SELECT u.last_name,u.first_name,u.city,t.age FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' # Test 16: COUNT aggregate GROUP BY (parent-only) SELECT state, COUNT(*) FROM us500 GROUP BY state # Test 17: COUNT on another field GROUP BY SELECT occupation, COUNT(*) FROM jobsort GROUP BY occupation # Test 18: SUM aggregate SELECT SUM(salary) FROM jobsort # Test 19: AVG aggregate SELECT AVG(age) FROM jobsort # Test 20: MIN aggregate SELECT MIN(salary) FROM jobsort # Test 21: MAX aggregate SELECT MAX(age) FROM jobsort # Test 22: Aggregate with WHERE (join) SELECT AVG(t.salary) FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='CA' # Test 23: Aggregate with WHERE (child) SELECT MAX(age) FROM jobsort WHERE occupation='Engineer' COLLATE NOCASE # Test 24: DELETE (soft, via delflag) -- MUTATES UPDATE us500 SET delflag='D' WHERE city='Abilene' AND state='TX' # Test 25: Verify deletion (delflag-aware; should show 0) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' AND u.state='TX' AND u.delflag<>'D' # Test 26: UNDELETE (via delflag) -- MUTATES UPDATE us500 SET delflag='' WHERE city='Abilene' AND state='TX' # Test 27: Verify undelete (should show 2) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' AND u.state='TX' AND u.delflag<>'D' # Test 28: Multi-condition across tables SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='CA' AND t.age>50 AND t.salary>100000 # Test 29: LIKE with condition (Manager) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%Los%' AND t.occupation='Manager' COLLATE NOCASE # Test 30: LIKE with condition (Engineer) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%Los%' AND t.occupation='Engineer' COLLATE NOCASE # Test 33: Final complex query SELECT u.last_name,u.first_name,u.state,t.age,t.salary FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE (u.state='CA' OR u.state='TX') AND t.age>50 ORDER BY t.salary DESC LIMIT 10 # Test 34: INSERT a new record -- MUTATES INSERT INTO us500 (rec,delflag,first_name,last_name,city,state,zip) VALUES (999999,'','Testy','McTester','DebugCity','TX','99999') # Test 35: Verify INSERT (should find Testy) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.last_name='McTester' # Test 36: UPDATE (string assignment) -- MUTATES UPDATE us500 SET city='FixedCity' WHERE last_name='McTester' # Test 37: Verify UPDATE SELECT first_name,last_name,city FROM us500 WHERE last_name='McTester' # Test 38: Ages before arithmetic update SELECT t.id_ref,t.lastname,u.last_name,t.occupation,t.age FROM jobsort t JOIN us500 u ON t.id_ref=u.rec_p1 WHERE t.occupation='student' COLLATE NOCASE # Test 39: Arithmetic UPDATE (age + 1) -- MUTATES UPDATE jobsort SET age=age+1 WHERE occupation='Student' COLLATE NOCASE # Test 40: Verify arithmetic update SELECT t.id_ref,t.lastname,u.last_name,t.occupation,t.age FROM jobsort t JOIN us500 u ON t.id_ref=u.rec_p1 WHERE t.occupation='student' COLLATE NOCASE # Test 42: SQL SELECT (verbatim from test.bat) SELECT first_name, last_name, city FROM us500 WHERE state='CA' LIMIT 3 # Test 43: SQL aggregate (verbatim) SELECT COUNT(occupation) FROM jobsort # Test 48: Numeric < comparison SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.age<20 # Test 50: Indexed equality on numeric field SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.salary=82000 # Test 51: ORDER BY string field SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY u.last_name # Test 52: AVG GROUP BY SELECT occupation, AVG(salary) FROM jobsort GROUP BY occupation # Test 53: COUNT with WHERE and GROUP BY (join) SELECT t.occupation, COUNT(*) FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='CA' GROUP BY t.occupation # Test 54: Numeric indexed search (age>60 again) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.age>60 # Test 55: LIKE starts-with SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE 'San%' # Test 56: LIKE ends-with SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%City' One thing to note--the original test 50 ran for 11 minutes without completing. Claude added an index and rewrote the query and it dropped to 7 seconds. Here's the run log: Quote # Test 1: Simple equality query SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' [8323 ms | 512 rows] free=4025616 # Test 2: Compound query with AND SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' AND u.state='TX' [14845 ms | 256 rows] free=4025648 # Test 3: Quoted value (spaces) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='San Francisco' [11634 ms | 640 rows] free=4025616 # Test 5: Complex query with parentheses SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE (u.city='Abilene' OR u.city='Fresno') AND u.state='CA' [13416 ms | 0 rows] free=4025616 # Test 6: LIKE pattern matching SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%San%' [39696 ms | 3456 rows] free=4025616 # Test 7: Numeric comparison (child field) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.age>60 [95697 ms | 7756 rows] free=4025616 # Test 8: ORDER BY ascending SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY t.age [16331 ms | 1152 rows] free=4025616 # Test 9: ORDER BY descending SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY t.salary DESC [16344 ms | 1152 rows] free=4025616 # Test 10: LIMIT results SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' LIMIT 5 [90 ms | 5 rows] free=4025616 # Test 11: ORDER BY with LIMIT SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY t.salary DESC LIMIT 3 [10048 ms | 3 rows] free=4025616 # Test 12: SHOW selected fields (parent-only) SELECT last_name,first_name,city FROM us500 WHERE state='LA' LIMIT 5 [50 ms | 5 rows] free=4025744 # Test 13: SHOW with ORDER BY and LIMIT SELECT u.last_name,t.age,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='TX' ORDER BY t.age DESC LIMIT 5 [15821 ms | 5 rows] free=4025744 # Test 14: (was TXT output to Louisiana.txt) -- displayed instead SELECT u.last_name,u.first_name,u.city,t.age FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' [14576 ms | 1152 rows] free=4025680 # Test 15: (was CSV output to Louisiana.csv) -- displayed instead SELECT u.last_name,u.first_name,u.city,t.age FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' [14602 ms | 1152 rows] free=4025680 # Test 16: COUNT aggregate GROUP BY (parent-only) SELECT state, COUNT(*) FROM us500 GROUP BY state [967 ms | 47 rows] free=4025872 # Test 17: COUNT on another field GROUP BY SELECT occupation, COUNT(*) FROM jobsort GROUP BY occupation [1167 ms | 8 rows] free=4025840 # Test 18: SUM aggregate SELECT SUM(salary) FROM jobsort [813 ms | 1 rows] free=4025904 # Test 19: AVG aggregate SELECT AVG(age) FROM jobsort [701 ms | 1 rows] free=4025920 # Test 20: MIN aggregate SELECT MIN(salary) FROM jobsort [14 ms | 1 rows] free=4025904 # Test 21: MAX aggregate SELECT MAX(age) FROM jobsort [5 ms | 1 rows] free=4025904 # Test 22: Aggregate with WHERE (join) SELECT AVG(t.salary) FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='CA' [19101 ms | 1 rows] free=4025920 # Test 23: Aggregate with WHERE (child) SELECT MAX(age) FROM jobsort WHERE occupation='Engineer' COLLATE NOCASE [14 ms | 1 rows] free=4025904 # Test 24: DELETE (soft, via delflag) -- MUTATES UPDATE us500 SET delflag='D' WHERE city='Abilene' AND state='TX' SKIP (mutating) # Test 25: Verify deletion (delflag-aware; should show 0) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' AND u.state='TX' AND u.delflag<>'D' [14859 ms | 256 rows] free=4025648 # Test 26: UNDELETE (via delflag) -- MUTATES UPDATE us500 SET delflag='' WHERE city='Abilene' AND state='TX' SKIP (mutating) # Test 27: Verify undelete (should show 2) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city='Abilene' AND u.state='TX' AND u.delflag<>'D' [14879 ms | 256 rows] free=4025648 # Test 28: Multi-condition across tables SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='CA' AND t.age>50 AND t.salary>100000 [23898 ms | 772 rows] free=4025616 # Test 29: LIKE with condition (Manager) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%Los%' AND t.occupation='Manager' COLLATE NOCASE [19736 ms | 74 rows] free=4025616 # Test 30: LIKE with condition (Engineer) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%Los%' AND t.occupation='Engineer' COLLATE NOCASE [19948 ms | 104 rows] free=4025616 # Test 33: Final complex query SELECT u.last_name,u.first_name,u.state,t.age,t.salary FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE (u.state='CA' OR u.state='TX') AND t.age>50 ORDER BY t.salary DESC LIMIT 10 [34739 ms | 10 rows] free=4025648 # Test 34: INSERT a new record -- MUTATES INSERT INTO us500 (rec,delflag,first_name,last_name,city,state,zip) VALUES (999999,'','Testy','McTester','DebugCity','TX','99999') SKIP (mutating) # Test 35: Verify INSERT (should find Testy) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.last_name='McTester' [13036 ms | 0 rows] free=4025648 # Test 36: UPDATE (string assignment) -- MUTATES UPDATE us500 SET city='FixedCity' WHERE last_name='McTester' SKIP (mutating) # Test 37: Verify UPDATE SELECT first_name,last_name,city FROM us500 WHERE last_name='McTester' [12966 ms | 0 rows] free=4025680 # Test 38: Ages before arithmetic update SELECT t.id_ref,t.lastname,u.last_name,t.occupation,t.age FROM jobsort t JOIN us500 u ON t.id_ref=u.rec_p1 WHERE t.occupation='student' COLLATE NOCASE [12379 ms | 898 rows] free=4025616 # Test 39: Arithmetic UPDATE (age + 1) -- MUTATES UPDATE jobsort SET age=age+1 WHERE occupation='Student' COLLATE NOCASE SKIP (mutating) # Test 40: Verify arithmetic update SELECT t.id_ref,t.lastname,u.last_name,t.occupation,t.age FROM jobsort t JOIN us500 u ON t.id_ref=u.rec_p1 WHERE t.occupation='student' COLLATE NOCASE [12385 ms | 898 rows] free=4025616 # Test 42: SQL SELECT (verbatim from test.bat) SELECT first_name, last_name, city FROM us500 WHERE state='CA' LIMIT 3 [31 ms | 3 rows] free=4025744 # Test 43: SQL aggregate (verbatim) SELECT COUNT(occupation) FROM jobsort [1093 ms | 1 rows] free=4025888 # Test 48: Numeric < comparison SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.age<20 [34445 ms | 2704 rows] free=4025648 # Test 50: Indexed equality on numeric field SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.salary=82000 [12892 ms | 912 rows] free=4025616 # Test 51: ORDER BY string field SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='LA' ORDER BY u.last_name [16323 ms | 1152 rows] free=4025616 # Test 52: AVG GROUP BY SELECT occupation, AVG(salary) FROM jobsort GROUP BY occupation [23312 ms | 8 rows] free=4025856 # Test 53: COUNT with WHERE and GROUP BY (join) SELECT t.occupation, COUNT(*) FROM us500 u JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.state='CA' GROUP BY t.occupation [19478 ms | 8 rows] free=4025840 # Test 54: Numeric indexed search (age>60 again) SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE t.age>60 [95998 ms | 7756 rows] free=4025616 # Test 55: LIKE starts-with SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE 'San%' [36386 ms | 2944 rows] free=4025616 # Test 56: LIKE ends-with SELECT u.last_name,u.first_name,u.city,u.state,u.zip,t.occupation FROM us500 u LEFT JOIN jobsort t ON t.id_ref=u.rec_p1 WHERE u.city LIKE '%City' [29692 ms | 1792 rows] free=4025616 === WARM+GC 64k DISPLAY: 42 done, 0 err, 5 skip === === TOTAL RUNTIME: 761392 ms (761.4 s = 12m 41s) === Note that the same queries ran against the identical SQL database on my laptop in 2.6 seconds.PicoMite, Armmite F4, SensorKits, MMBasic Hardware, Games, etc. on FOTS