Fossil SCM
Add the test-without-rowid command.
Commit
7ddfd42b60cad34560d4d889cd60dd5d2a7ad35b
Parent
8e01c2257d6e332…
1 file changed
+66
M
src/db.c
+66
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -2442,5 +2442,71 @@ | ||
| 2442 | 2442 | rDiff = db_double(0.0, "SELECT julianday('now') - julianday(%Q)", g.argv[2]); |
| 2443 | 2443 | fossil_print("Time differences: %s\n", db_timespan_name(rDiff)); |
| 2444 | 2444 | sqlite3_close(g.db); |
| 2445 | 2445 | g.db = 0; |
| 2446 | 2446 | } |
| 2447 | + | |
| 2448 | +/* | |
| 2449 | +** COMMAND: test-without-rowid | |
| 2450 | +** %fossil test-without-rowid FILENAME... | |
| 2451 | +** | |
| 2452 | +** Change the Fossil repository FILENAME to make use of the WITHOUT ROWID | |
| 2453 | +** optimization. FILENAME can also be the ~/.fossil file or a local | |
| 2454 | +** .fslckout or _FOSSIL_ file. | |
| 2455 | +** | |
| 2456 | +** The purpose of this command is for testing the WITHOUT ROWID capabilities | |
| 2457 | +** of SQLite. There is no big advantage to using WITHOUT ROWID in Fossil. | |
| 2458 | +** | |
| 2459 | +** Options: | |
| 2460 | +** --dryrun | -n No changes. Just print what would happen. | |
| 2461 | +*/ | |
| 2462 | +void test_without_rowid(void){ | |
| 2463 | + int i, j; | |
| 2464 | + Stmt q; | |
| 2465 | + Blob allSql; | |
| 2466 | + int dryRun = find_option("dry-run", "n", 0)!=0; | |
| 2467 | + for(i=2; i<g.argc; i++){ | |
| 2468 | + db_open_or_attach(g.argv[i], "main", 0); | |
| 2469 | + blob_init(&allSql, "BEGIN;\n", -1); | |
| 2470 | + db_prepare(&q, | |
| 2471 | + "SELECT name, sql FROM main.sqlite_master " | |
| 2472 | + " WHERE type='table' AND sql NOT LIKE '%%WITHOUT ROWID%%'" | |
| 2473 | + " AND name IN ('global_config','shun','concealed','config'," | |
| 2474 | + " 'plink','tagxref','backlink','vcache');" | |
| 2475 | + ); | |
| 2476 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 2477 | + const char *zTName = db_column_text(&q, 0); | |
| 2478 | + const char *zOrigSql = db_column_text(&q, 1); | |
| 2479 | + Blob newSql; | |
| 2480 | + blob_init(&newSql, 0, 0); | |
| 2481 | + for(j=0; zOrigSql[j]; j++){ | |
| 2482 | + if( fossil_strnicmp(zOrigSql+j,"unique",6)==0 ){ | |
| 2483 | + blob_append(&newSql, zOrigSql, j); | |
| 2484 | + blob_append(&newSql, "PRIMARY KEY", -1); | |
| 2485 | + zOrigSql += j+6; | |
| 2486 | + j = -1; | |
| 2487 | + } | |
| 2488 | + } | |
| 2489 | + blob_append(&newSql, zOrigSql, -1); | |
| 2490 | + blob_appendf(&allSql, | |
| 2491 | + "ALTER TABLE %s RENAME TO x_%s;\n" | |
| 2492 | + "%s WITHOUT ROWID;\n" | |
| 2493 | + "INSERT INTO %s SELECT * FROM x_%s;\n" | |
| 2494 | + "DROP TABLE x_%s;\n", | |
| 2495 | + zTName, zTName, blob_str(&newSql), zTName, zTName, zTName | |
| 2496 | + ); | |
| 2497 | + fossil_print("Converting table %s of %s to WITHOUT ROWID.\n", zTName, g.argv[i]); | |
| 2498 | + blob_reset(&newSql); | |
| 2499 | + } | |
| 2500 | + blob_appendf(&allSql, "COMMIT;\n"); | |
| 2501 | + db_finalize(&q); | |
| 2502 | + if( dryRun ){ | |
| 2503 | + fossil_print("SQL that would have been evaluated:\n"); | |
| 2504 | + fossil_print("-------------------------------------------------------------\n"); | |
| 2505 | + fossil_print("%s", blob_str(&allSql)); | |
| 2506 | + }else{ | |
| 2507 | + db_multi_exec("%s", blob_str(&allSql)); | |
| 2508 | + } | |
| 2509 | + blob_reset(&allSql); | |
| 2510 | + db_close(1); | |
| 2511 | + } | |
| 2512 | +} | |
| 2447 | 2513 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -2442,5 +2442,71 @@ | |
| 2442 | rDiff = db_double(0.0, "SELECT julianday('now') - julianday(%Q)", g.argv[2]); |
| 2443 | fossil_print("Time differences: %s\n", db_timespan_name(rDiff)); |
| 2444 | sqlite3_close(g.db); |
| 2445 | g.db = 0; |
| 2446 | } |
| 2447 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -2442,5 +2442,71 @@ | |
| 2442 | rDiff = db_double(0.0, "SELECT julianday('now') - julianday(%Q)", g.argv[2]); |
| 2443 | fossil_print("Time differences: %s\n", db_timespan_name(rDiff)); |
| 2444 | sqlite3_close(g.db); |
| 2445 | g.db = 0; |
| 2446 | } |
| 2447 | |
| 2448 | /* |
| 2449 | ** COMMAND: test-without-rowid |
| 2450 | ** %fossil test-without-rowid FILENAME... |
| 2451 | ** |
| 2452 | ** Change the Fossil repository FILENAME to make use of the WITHOUT ROWID |
| 2453 | ** optimization. FILENAME can also be the ~/.fossil file or a local |
| 2454 | ** .fslckout or _FOSSIL_ file. |
| 2455 | ** |
| 2456 | ** The purpose of this command is for testing the WITHOUT ROWID capabilities |
| 2457 | ** of SQLite. There is no big advantage to using WITHOUT ROWID in Fossil. |
| 2458 | ** |
| 2459 | ** Options: |
| 2460 | ** --dryrun | -n No changes. Just print what would happen. |
| 2461 | */ |
| 2462 | void test_without_rowid(void){ |
| 2463 | int i, j; |
| 2464 | Stmt q; |
| 2465 | Blob allSql; |
| 2466 | int dryRun = find_option("dry-run", "n", 0)!=0; |
| 2467 | for(i=2; i<g.argc; i++){ |
| 2468 | db_open_or_attach(g.argv[i], "main", 0); |
| 2469 | blob_init(&allSql, "BEGIN;\n", -1); |
| 2470 | db_prepare(&q, |
| 2471 | "SELECT name, sql FROM main.sqlite_master " |
| 2472 | " WHERE type='table' AND sql NOT LIKE '%%WITHOUT ROWID%%'" |
| 2473 | " AND name IN ('global_config','shun','concealed','config'," |
| 2474 | " 'plink','tagxref','backlink','vcache');" |
| 2475 | ); |
| 2476 | while( db_step(&q)==SQLITE_ROW ){ |
| 2477 | const char *zTName = db_column_text(&q, 0); |
| 2478 | const char *zOrigSql = db_column_text(&q, 1); |
| 2479 | Blob newSql; |
| 2480 | blob_init(&newSql, 0, 0); |
| 2481 | for(j=0; zOrigSql[j]; j++){ |
| 2482 | if( fossil_strnicmp(zOrigSql+j,"unique",6)==0 ){ |
| 2483 | blob_append(&newSql, zOrigSql, j); |
| 2484 | blob_append(&newSql, "PRIMARY KEY", -1); |
| 2485 | zOrigSql += j+6; |
| 2486 | j = -1; |
| 2487 | } |
| 2488 | } |
| 2489 | blob_append(&newSql, zOrigSql, -1); |
| 2490 | blob_appendf(&allSql, |
| 2491 | "ALTER TABLE %s RENAME TO x_%s;\n" |
| 2492 | "%s WITHOUT ROWID;\n" |
| 2493 | "INSERT INTO %s SELECT * FROM x_%s;\n" |
| 2494 | "DROP TABLE x_%s;\n", |
| 2495 | zTName, zTName, blob_str(&newSql), zTName, zTName, zTName |
| 2496 | ); |
| 2497 | fossil_print("Converting table %s of %s to WITHOUT ROWID.\n", zTName, g.argv[i]); |
| 2498 | blob_reset(&newSql); |
| 2499 | } |
| 2500 | blob_appendf(&allSql, "COMMIT;\n"); |
| 2501 | db_finalize(&q); |
| 2502 | if( dryRun ){ |
| 2503 | fossil_print("SQL that would have been evaluated:\n"); |
| 2504 | fossil_print("-------------------------------------------------------------\n"); |
| 2505 | fossil_print("%s", blob_str(&allSql)); |
| 2506 | }else{ |
| 2507 | db_multi_exec("%s", blob_str(&allSql)); |
| 2508 | } |
| 2509 | blob_reset(&allSql); |
| 2510 | db_close(1); |
| 2511 | } |
| 2512 | } |
| 2513 |