Copy disabled (too large)
Download .txt
Showing preview only (16,438K chars total). Download the full file to get everything.
Repository: tursodatabase/turso
Branch: main
Commit: 167093a327b5
Files: 2057
Total size: 28.0 MB
Directory structure:
gitextract_3njjk3d9/
├── .cargo/
│ └── config.toml
├── .claude/
│ └── skills/
│ ├── async-io-model/
│ │ └── SKILL.md
│ ├── cdc/
│ │ └── SKILL.md
│ ├── code-quality/
│ │ └── SKILL.md
│ ├── debugging/
│ │ └── SKILL.md
│ ├── differential-fuzzer/
│ │ └── SKILL.md
│ ├── index-knowledge/
│ │ └── SKILL.md
│ ├── mvcc/
│ │ └── SKILL.md
│ ├── pr-workflow/
│ │ └── SKILL.md
│ ├── storage-format/
│ │ └── SKILL.md
│ ├── testing/
│ │ └── SKILL.md
│ └── transaction-correctness/
│ └── SKILL.md
├── .config/
│ └── nextest.toml
├── .devcontainer/
│ ├── Dockerfile
│ ├── Dockerfile.squid
│ ├── devcontainer.json
│ ├── docker-compose.yml
│ ├── init-firewall.sh
│ └── squid.conf
├── .dockerignore
├── .github/
│ ├── labeler.yml
│ ├── pull_request_template.md
│ ├── shared/
│ │ ├── install_sqlite/
│ │ │ └── action.yml
│ │ ├── setup-mold/
│ │ │ └── action.yml
│ │ └── setup-sccache/
│ │ └── action.yml
│ ├── turso-bot.yml
│ └── workflows/
│ ├── antithesis-schedule.yml
│ ├── antithesis.yml
│ ├── build-sim.yml
│ ├── build-sqlancer.yml
│ ├── c-compat.yml
│ ├── claude.yml
│ ├── codspeed.yml
│ ├── dotnet-publish.yml
│ ├── dotnet-test.yml
│ ├── elle.yml
│ ├── fuzz.yml
│ ├── go.yml
│ ├── java-publish.yml
│ ├── java.yml
│ ├── labeler.yml
│ ├── napi.yml
│ ├── perf_nightly.yml
│ ├── publish-crates.yml
│ ├── python.yml
│ ├── react-native.yml
│ ├── release.yml
│ ├── rust.yml
│ ├── rust_perf.yml
│ ├── sqltest.yml
│ ├── stale.yml
│ └── turso-serverless.yml
├── .github.json
├── .gitignore
├── .python-version
├── AGENTS.md
├── CHANGELOG.md
├── COMPAT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── Dockerfile.antithesis
├── Dockerfile.cli
├── LICENSE.md
├── Makefile
├── NOTICE.md
├── PERF.md
├── Pipfile
├── README.md
├── bindings/
│ ├── dotnet/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── Readme.md
│ │ ├── Turso.slnx
│ │ ├── rs_src/
│ │ │ └── lib.rs
│ │ └── src/
│ │ ├── Benchmarks/
│ │ │ ├── Benchmarks.cs
│ │ │ ├── Benchmarks.csproj
│ │ │ └── Program.cs
│ │ ├── Turso/
│ │ │ ├── Turso.csproj
│ │ │ ├── TursoCommand.cs
│ │ │ ├── TursoConnection.cs
│ │ │ ├── TursoConnectionOptions.cs
│ │ │ ├── TursoDataReader.cs
│ │ │ ├── TursoParameter.cs
│ │ │ ├── TursoParameterCollection.cs
│ │ │ └── TursoTransaction.cs
│ │ ├── Turso.Raw/
│ │ │ ├── Data/
│ │ │ │ ├── TursoNativeArray.cs
│ │ │ │ ├── TursoNativeRowValueUnion.cs
│ │ │ │ └── TursoNativeValue.cs
│ │ │ ├── Public/
│ │ │ │ ├── Handles/
│ │ │ │ │ ├── TursoDatabaseHandle.cs
│ │ │ │ │ └── TursoStatementHandle.cs
│ │ │ │ ├── TursoBindings.cs
│ │ │ │ ├── TursoException.cs
│ │ │ │ └── Value/
│ │ │ │ ├── TursoEncryptionCipher.cs
│ │ │ │ ├── TursoValue.cs
│ │ │ │ └── TursoValueType.cs
│ │ │ ├── Turso.Raw.csproj
│ │ │ └── TursoInterop.cs
│ │ └── Turso.Tests/
│ │ ├── Turso.Tests.csproj
│ │ └── TursoTests.cs
│ ├── go/
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── VERSION
│ │ ├── bindings.go
│ │ ├── bindings_db.go
│ │ ├── bindings_db_test.go
│ │ ├── bindings_sync.go
│ │ ├── driver_db.go
│ │ ├── driver_db_test.go
│ │ ├── driver_sync.go
│ │ ├── driver_sync_test.go
│ │ ├── go-bindings-db-tests.mdx
│ │ ├── go-bindings-db.mdx
│ │ ├── go-bindings-sync.mdx
│ │ ├── go-driver-db.mdx
│ │ ├── go-driver-sync.mdx
│ │ ├── go.mod
│ │ └── go.sum
│ ├── java/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .sdkmanrc
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── build.gradle.kts
│ │ ├── example/
│ │ │ ├── .gitignore
│ │ │ ├── build.gradle.kts
│ │ │ ├── gradle/
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ ├── settings.gradle.kts
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── tech.turso/
│ │ │ └── Main.java
│ │ ├── gradle/
│ │ │ ├── publish.gradle.kts
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── rs_src/
│ │ │ ├── errors.rs
│ │ │ ├── lib.rs
│ │ │ ├── turso_connection.rs
│ │ │ ├── turso_db.rs
│ │ │ ├── turso_statement.rs
│ │ │ └── utils.rs
│ │ ├── settings.gradle.kts
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ ├── examples/
│ │ │ │ │ └── EncryptionExample.java
│ │ │ │ └── tech/
│ │ │ │ └── turso/
│ │ │ │ ├── JDBC.java
│ │ │ │ ├── TursoConfig.java
│ │ │ │ ├── TursoDataSource.java
│ │ │ │ ├── TursoErrorCode.java
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── NativeInvocation.java
│ │ │ │ │ ├── Nullable.java
│ │ │ │ │ ├── SkipNullableCheck.java
│ │ │ │ │ └── VisibleForTesting.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── SqliteCode.java
│ │ │ │ │ ├── TursoConnection.java
│ │ │ │ │ ├── TursoDB.java
│ │ │ │ │ ├── TursoEncryptionCipher.java
│ │ │ │ │ ├── TursoPropertiesHolder.java
│ │ │ │ │ ├── TursoResultSet.java
│ │ │ │ │ ├── TursoStatement.java
│ │ │ │ │ ├── TursoStepResult.java
│ │ │ │ │ └── TursoTransactionMode.java
│ │ │ │ ├── exceptions/
│ │ │ │ │ └── TursoException.java
│ │ │ │ ├── jdbc4/
│ │ │ │ │ ├── JDBC4Connection.java
│ │ │ │ │ ├── JDBC4DatabaseMetaData.java
│ │ │ │ │ ├── JDBC4PreparedStatement.java
│ │ │ │ │ ├── JDBC4ResultSet.java
│ │ │ │ │ └── JDBC4Statement.java
│ │ │ │ └── utils/
│ │ │ │ ├── ByteArrayUtils.java
│ │ │ │ ├── Logger.java
│ │ │ │ ├── LoggerFactory.java
│ │ │ │ └── TursoExceptionUtils.java
│ │ │ └── resources/
│ │ │ ├── META-INF/
│ │ │ │ └── services/
│ │ │ │ └── java.sql.Driver
│ │ │ └── turso-jdbc.properties
│ │ └── test/
│ │ ├── java/
│ │ │ └── tech/
│ │ │ └── turso/
│ │ │ ├── IntegrationTest.java
│ │ │ ├── JDBCTest.java
│ │ │ ├── TestUtils.java
│ │ │ ├── core/
│ │ │ │ ├── TursoDBTest.java
│ │ │ │ └── TursoStatementTest.java
│ │ │ └── jdbc4/
│ │ │ ├── JDBC4ConnectionTest.java
│ │ │ ├── JDBC4DatabaseMetaDataTest.java
│ │ │ ├── JDBC4PreparedStatementTest.java
│ │ │ ├── JDBC4ResultSetTest.java
│ │ │ ├── JDBC4StatementTest.java
│ │ │ └── TransactionTest.java
│ │ └── resources/
│ │ └── turso/
│ │ └── CACHEDIR.TAG
│ ├── javascript/
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── .yarn/
│ │ │ └── releases/
│ │ │ └── yarn-4.9.2.cjs
│ │ ├── .yarnrc.yml
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── build.rs
│ │ ├── docs/
│ │ │ ├── API.md
│ │ │ └── CONTRIBUTING.md
│ │ ├── package.json
│ │ ├── packages/
│ │ │ ├── common/
│ │ │ │ ├── README.md
│ │ │ │ ├── async-lock.ts
│ │ │ │ ├── bind.ts
│ │ │ │ ├── compat.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── promise.ts
│ │ │ │ ├── sqlite-error.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ └── types.ts
│ │ │ ├── native/
│ │ │ │ ├── README.md
│ │ │ │ ├── compat.test.ts
│ │ │ │ ├── compat.ts
│ │ │ │ ├── index.d.ts
│ │ │ │ ├── index.js
│ │ │ │ ├── package.json
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── promise.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ └── turso-sql-runner-split.test.ts
│ │ │ ├── wasm/
│ │ │ │ ├── README.md
│ │ │ │ ├── index-bundle.ts
│ │ │ │ ├── index-default.ts
│ │ │ │ ├── index-turbopack-hack.ts
│ │ │ │ ├── index-vite-dev-hack.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── promise-bundle.ts
│ │ │ │ ├── promise-default.ts
│ │ │ │ ├── promise-turbopack-hack.ts
│ │ │ │ ├── promise-vite-dev-hack.ts
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ ├── vite
│ │ │ │ ├── vite.config.js
│ │ │ │ ├── vitest.config.ts
│ │ │ │ ├── wasm-inline.ts
│ │ │ │ └── worker.ts
│ │ │ └── wasm-common/
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ ├── package.json
│ │ │ └── tsconfig.json
│ │ ├── perf/
│ │ │ ├── package.json
│ │ │ ├── perf-better-sqlite3.js
│ │ │ └── perf-turso.js
│ │ ├── replace.sh
│ │ ├── scripts/
│ │ │ └── inline-wasm-base64.js
│ │ ├── src/
│ │ │ ├── browser.rs
│ │ │ └── lib.rs
│ │ ├── sync/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── build.rs
│ │ │ ├── packages/
│ │ │ │ ├── common/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── remote-write-statement.ts
│ │ │ │ │ ├── remote-writer.ts
│ │ │ │ │ ├── run.ts
│ │ │ │ │ ├── tsconfig.json
│ │ │ │ │ └── types.ts
│ │ │ │ ├── native/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.d.ts
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── promise.test.ts
│ │ │ │ │ ├── promise.ts
│ │ │ │ │ ├── remote-write.test.ts
│ │ │ │ │ └── tsconfig.json
│ │ │ │ └── wasm/
│ │ │ │ ├── .promise.test.ts.swp
│ │ │ │ ├── README.md
│ │ │ │ ├── cp-entrypoint.sh
│ │ │ │ ├── index-bundle.ts
│ │ │ │ ├── index-default.ts
│ │ │ │ ├── index-turbopack-hack.ts
│ │ │ │ ├── index-vite-dev-hack.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── promise-bundle.ts
│ │ │ │ ├── promise-default.ts
│ │ │ │ ├── promise-turbopack-hack.ts
│ │ │ │ ├── promise-vite-dev-hack.ts
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ ├── vite.config.js
│ │ │ │ ├── vitest.config.ts
│ │ │ │ ├── wasm-inline.ts
│ │ │ │ └── worker.ts
│ │ │ └── src/
│ │ │ ├── generator.rs
│ │ │ ├── js_protocol_io.rs
│ │ │ └── lib.rs
│ │ ├── turso-sql-runner.mjs
│ │ └── turso-sql-split.mjs
│ ├── python/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── SQLALCHEMY_DIALECT.md
│ │ ├── build.rs
│ │ ├── py-bindings-db-aio.mdx
│ │ ├── py-bindings-db.mdx
│ │ ├── py-bindings-sync-aio.mdx
│ │ ├── py-bindings-sync.mdx
│ │ ├── py-bindings-tests-aio.mdx
│ │ ├── py-bindings-tests.mdx
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── lib.rs
│ │ │ ├── turso.rs
│ │ │ └── turso_sync.rs
│ │ ├── tests/
│ │ │ ├── __init__.py
│ │ │ ├── test_database.py
│ │ │ ├── test_database_aio.py
│ │ │ ├── test_database_sync.py
│ │ │ ├── test_database_sync_aio.py
│ │ │ ├── test_sqlalchemy.py
│ │ │ └── utils.py
│ │ └── turso/
│ │ ├── __init__.py
│ │ ├── aio/
│ │ │ ├── __init__.py
│ │ │ └── sync/
│ │ │ └── __init__.py
│ │ ├── lib.py
│ │ ├── lib_aio.py
│ │ ├── lib_sync.py
│ │ ├── lib_sync_aio.py
│ │ ├── py.typed
│ │ ├── sqlalchemy/
│ │ │ ├── __init__.py
│ │ │ └── dialect.py
│ │ ├── sync/
│ │ │ └── __init__.py
│ │ └── worker.py
│ ├── react-native/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── build.gradle
│ │ │ ├── cpp-adapter.cpp
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── turso/
│ │ │ └── sync/
│ │ │ └── reactnative/
│ │ │ ├── TursoBridge.java
│ │ │ ├── TursoModule.java
│ │ │ └── TursoPackage.java
│ │ ├── cpp/
│ │ │ ├── TursoConnectionHostObject.cpp
│ │ │ ├── TursoConnectionHostObject.h
│ │ │ ├── TursoDatabaseHostObject.cpp
│ │ │ ├── TursoDatabaseHostObject.h
│ │ │ ├── TursoHostObject.cpp
│ │ │ ├── TursoHostObject.h
│ │ │ ├── TursoStatementHostObject.cpp
│ │ │ ├── TursoStatementHostObject.h
│ │ │ ├── TursoSyncChangesHostObject.cpp
│ │ │ ├── TursoSyncChangesHostObject.h
│ │ │ ├── TursoSyncDatabaseHostObject.cpp
│ │ │ ├── TursoSyncDatabaseHostObject.h
│ │ │ ├── TursoSyncIoItemHostObject.cpp
│ │ │ ├── TursoSyncIoItemHostObject.h
│ │ │ ├── TursoSyncOperationHostObject.cpp
│ │ │ └── TursoSyncOperationHostObject.h
│ │ ├── ios/
│ │ │ ├── TursoModule.h
│ │ │ └── TursoModule.mm
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── AsyncLock.ts
│ │ │ ├── Database.ts
│ │ │ ├── Statement.ts
│ │ │ ├── index.ts
│ │ │ ├── internal/
│ │ │ │ ├── asyncOperation.ts
│ │ │ │ └── ioProcessor.ts
│ │ │ └── types.ts
│ │ ├── templates/
│ │ │ └── turso-sync-sdk-kit.xcframework/
│ │ │ ├── Info.plist
│ │ │ ├── ios-arm64/
│ │ │ │ └── turso-sync-sdk-kit.framework/
│ │ │ │ └── Info.plist
│ │ │ └── ios-arm64-simulator/
│ │ │ └── turso-sync-sdk-kit.framework/
│ │ │ └── Info.plist
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── turso-sync-react-native.podspec
│ ├── rust/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── examples/
│ │ │ ├── README.md
│ │ │ ├── concurrent_writes.rs
│ │ │ ├── example.rs
│ │ │ ├── example_struct.rs
│ │ │ └── sync_example.rs
│ │ ├── rust-driver-sync.mdx
│ │ ├── src/
│ │ │ ├── connection.rs
│ │ │ ├── lib.rs
│ │ │ ├── params.rs
│ │ │ ├── rows.rs
│ │ │ ├── sync.rs
│ │ │ ├── transaction.rs
│ │ │ └── value.rs
│ │ └── tests/
│ │ ├── integration_tests.rs
│ │ └── test_deadlock_join.rs
│ └── tcl/
│ ├── Makefile
│ ├── test_probes.tcl
│ └── turso_tcl.c
├── cli/
│ ├── Cargo.toml
│ ├── SQL.sublime-syntax
│ ├── app.rs
│ ├── build.rs
│ ├── commands/
│ │ ├── args.rs
│ │ ├── import.rs
│ │ └── mod.rs
│ ├── config/
│ │ ├── mod.rs
│ │ ├── palette.rs
│ │ └── terminal.rs
│ ├── docs/
│ │ ├── config.md
│ │ └── internal/
│ │ └── commands.md
│ ├── helper.rs
│ ├── input.rs
│ ├── main.rs
│ ├── manual.rs
│ ├── manuals/
│ │ ├── cdc.md
│ │ ├── custom-types.md
│ │ ├── encryption.md
│ │ ├── index.md
│ │ ├── materialized-views.md
│ │ ├── mcp.md
│ │ └── vector.md
│ ├── mcp_server.rs
│ ├── mvcc_repl.rs
│ ├── opcodes_dictionary.rs
│ ├── read_state_machine.rs
│ ├── sync_server.mdx
│ ├── sync_server.rs
│ └── tests/
│ ├── non_interactive_exit_code.rs
│ └── parameter_bindings.rs
├── core/
│ ├── Cargo.toml
│ ├── assert.rs
│ ├── benches/
│ │ ├── benchmark.rs
│ │ ├── fts_benchmark.rs
│ │ ├── graph_queries_benchmark.rs
│ │ ├── hash_spill_benchmark.rs
│ │ ├── json_benchmark.rs
│ │ ├── mvcc_benchmark.rs
│ │ ├── sql_functions/
│ │ │ ├── datetime.rs
│ │ │ ├── likeop.rs
│ │ │ ├── main.rs
│ │ │ ├── numeric.rs
│ │ │ └── value.rs
│ │ ├── tpc_h_benchmark.rs
│ │ └── write_perf_benchmark.rs
│ ├── btree_dump.rs
│ ├── build.rs
│ ├── busy.rs
│ ├── connection.rs
│ ├── dbpage.rs
│ ├── error.rs
│ ├── ext/
│ │ ├── dynamic.rs
│ │ ├── mod.rs
│ │ └── vtab_xconnect.rs
│ ├── fast_lock.rs
│ ├── function.rs
│ ├── functions/
│ │ ├── datetime.rs
│ │ ├── mod.rs
│ │ └── printf.rs
│ ├── incremental/
│ │ ├── aggregate_operator.rs
│ │ ├── compiler.rs
│ │ ├── cursor.rs
│ │ ├── dbsp.rs
│ │ ├── expr_compiler.rs
│ │ ├── filter_operator.rs
│ │ ├── input_operator.rs
│ │ ├── join_operator.rs
│ │ ├── merge_operator.rs
│ │ ├── mod.rs
│ │ ├── operator.rs
│ │ ├── persistence.rs
│ │ ├── project_operator.rs
│ │ └── view.rs
│ ├── index_method/
│ │ ├── backing_btree.rs
│ │ ├── fts.rs
│ │ ├── mod.rs
│ │ └── toy_vector_sparse_ivf.rs
│ ├── info.rs
│ ├── io/
│ │ ├── clock.rs
│ │ ├── common.rs
│ │ ├── completions.rs
│ │ ├── generic.rs
│ │ ├── io_uring.rs
│ │ ├── memory.rs
│ │ ├── mod.rs
│ │ ├── unix.rs
│ │ ├── vfs.rs
│ │ ├── win_iocp.rs
│ │ └── windows.rs
│ ├── json/
│ │ ├── cache.rs
│ │ ├── error.rs
│ │ ├── jsonb.rs
│ │ ├── mod.rs
│ │ ├── ops.rs
│ │ ├── path.rs
│ │ └── vtab.rs
│ ├── lib.rs
│ ├── mvcc/
│ │ ├── clock.rs
│ │ ├── cursor.rs
│ │ ├── database/
│ │ │ ├── checkpoint_state_machine.rs
│ │ │ ├── hermitage_tests.rs
│ │ │ ├── mod.rs
│ │ │ └── tests.rs
│ │ ├── mod.rs
│ │ └── persistent_storage/
│ │ ├── logical_log.rs
│ │ └── mod.rs
│ ├── numeric/
│ │ ├── decimal.rs
│ │ ├── mod.rs
│ │ └── nonnan.rs
│ ├── parameters.rs
│ ├── pragma.rs
│ ├── pseudo.rs
│ ├── regexp.rs
│ ├── schema.rs
│ ├── series.rs
│ ├── state_machine.rs
│ ├── statement.rs
│ ├── stats.rs
│ ├── storage/
│ │ ├── btree.rs
│ │ ├── buffer_pool.rs
│ │ ├── checksum.rs
│ │ ├── database.rs
│ │ ├── encryption.rs
│ │ ├── journal_mode.rs
│ │ ├── mod.rs
│ │ ├── page_cache.rs
│ │ ├── pager.rs
│ │ ├── slot_bitmap.rs
│ │ ├── sqlite3_ondisk.rs
│ │ ├── state_machines.rs
│ │ ├── subjournal.rs
│ │ └── wal.rs
│ ├── sync.rs
│ ├── thread.rs
│ ├── time/
│ │ ├── internal.rs
│ │ └── mod.rs
│ ├── translate/
│ │ ├── aggregation.rs
│ │ ├── alter.rs
│ │ ├── analyze.rs
│ │ ├── attach.rs
│ │ ├── collate.rs
│ │ ├── compound_select.rs
│ │ ├── delete.rs
│ │ ├── display.rs
│ │ ├── emitter/
│ │ │ ├── delete.rs
│ │ │ ├── mod.rs
│ │ │ ├── select.rs
│ │ │ └── update.rs
│ │ ├── expr.rs
│ │ ├── expression_index.rs
│ │ ├── fkeys.rs
│ │ ├── group_by.rs
│ │ ├── index.rs
│ │ ├── insert.rs
│ │ ├── integrity_check.rs
│ │ ├── logical.rs
│ │ ├── main_loop/
│ │ │ ├── body.rs
│ │ │ ├── close.rs
│ │ │ ├── conditions.rs
│ │ │ ├── hash.rs
│ │ │ ├── in_seek.rs
│ │ │ ├── init.rs
│ │ │ ├── mod.rs
│ │ │ ├── multi_index.rs
│ │ │ ├── open.rs
│ │ │ └── seek.rs
│ │ ├── mod.rs
│ │ ├── optimizer/
│ │ │ ├── OPTIMIZER.md
│ │ │ ├── access_method.rs
│ │ │ ├── constraints.rs
│ │ │ ├── cost.rs
│ │ │ ├── cost_params.rs
│ │ │ ├── join.rs
│ │ │ ├── lift_common_subexpressions.rs
│ │ │ ├── mod.rs
│ │ │ ├── multi_index.rs
│ │ │ ├── order.rs
│ │ │ └── unnest.rs
│ │ ├── order_by.rs
│ │ ├── plan.rs
│ │ ├── planner.rs
│ │ ├── pragma.rs
│ │ ├── result_row.rs
│ │ ├── rollback.rs
│ │ ├── schema.rs
│ │ ├── select.rs
│ │ ├── stmt_journal.rs
│ │ ├── subquery.rs
│ │ ├── transaction.rs
│ │ ├── trigger.rs
│ │ ├── trigger_exec.rs
│ │ ├── update.rs
│ │ ├── upsert.rs
│ │ ├── vacuum.rs
│ │ ├── values.rs
│ │ ├── view.rs
│ │ └── window.rs
│ ├── turso_types_vtab.rs
│ ├── types.rs
│ ├── util.rs
│ ├── uuid.rs
│ ├── vdbe/
│ │ ├── affinity.rs
│ │ ├── array.rs
│ │ ├── bloom_filter.rs
│ │ ├── builder.rs
│ │ ├── execute.rs
│ │ ├── explain.rs
│ │ ├── hash_table.rs
│ │ ├── insn.rs
│ │ ├── metrics.rs
│ │ ├── mod.rs
│ │ ├── rowset.rs
│ │ ├── sorter.rs
│ │ └── value.rs
│ ├── vector/
│ │ ├── mod.rs
│ │ ├── operations/
│ │ │ ├── concat.rs
│ │ │ ├── convert.rs
│ │ │ ├── distance_cos.rs
│ │ │ ├── distance_dot.rs
│ │ │ ├── distance_l2.rs
│ │ │ ├── jaccard.rs
│ │ │ ├── mod.rs
│ │ │ ├── serialize.rs
│ │ │ ├── slice.rs
│ │ │ └── text.rs
│ │ └── vector_types.rs
│ └── vtab.rs
├── deny.toml
├── dist-workspace.toml
├── docs/
│ ├── CODEOWNERS
│ ├── agent-guides/
│ │ ├── async-io-model.md
│ │ ├── code-quality.md
│ │ ├── debugging.md
│ │ ├── mvcc.md
│ │ ├── pr-workflow.md
│ │ ├── storage-format.md
│ │ ├── testing.md
│ │ └── transaction-correctness.md
│ ├── contributing/
│ │ └── contributing_functions.md
│ ├── fts.md
│ ├── internals/
│ │ └── mvcc/
│ │ ├── DESIGN.md
│ │ ├── GC.md
│ │ ├── RECOVERY_SEMANTICS.md
│ │ └── figures/
│ │ └── transactions.excalidraw
│ ├── javascript-api-reference.md
│ ├── language-reference/
│ │ └── book/
│ │ ├── print.html
│ │ └── turso/
│ │ └── custom-types.html
│ ├── manual.md
│ ├── sql-reference/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── book.toml
│ │ ├── cli/
│ │ │ ├── command-line-options.mdx
│ │ │ ├── getting-started.mdx
│ │ │ └── shell-commands.mdx
│ │ ├── compatibility.mdx
│ │ ├── data-types.mdx
│ │ ├── experimental-features.mdx
│ │ ├── expressions.mdx
│ │ ├── extensions.mdx
│ │ ├── functions/
│ │ │ ├── aggregate.mdx
│ │ │ ├── array.mdx
│ │ │ ├── date-time.mdx
│ │ │ ├── fts.mdx
│ │ │ ├── json.mdx
│ │ │ ├── math.mdx
│ │ │ ├── scalar.mdx
│ │ │ ├── vector.mdx
│ │ │ └── window.mdx
│ │ ├── pragmas.mdx
│ │ ├── preview.sh
│ │ └── statements/
│ │ ├── alter-table.mdx
│ │ ├── analyze.mdx
│ │ ├── attach-database.mdx
│ │ ├── create-index.mdx
│ │ ├── create-materialized-view.mdx
│ │ ├── create-table.mdx
│ │ ├── create-trigger.mdx
│ │ ├── create-type.mdx
│ │ ├── create-view.mdx
│ │ ├── create-virtual-table.mdx
│ │ ├── delete.mdx
│ │ ├── detach-database.mdx
│ │ ├── drop-index.mdx
│ │ ├── drop-table.mdx
│ │ ├── drop-trigger.mdx
│ │ ├── drop-type.mdx
│ │ ├── drop-view.mdx
│ │ ├── explain.mdx
│ │ ├── insert.mdx
│ │ ├── replace.mdx
│ │ ├── select.mdx
│ │ ├── transactions.mdx
│ │ ├── update.mdx
│ │ └── upsert.mdx
│ └── testing.md
├── examples/
│ ├── .gitignore
│ ├── README.md
│ ├── dotnet/
│ │ ├── Encryption.cs
│ │ ├── EncryptionExample.csproj
│ │ └── README.md
│ ├── go/
│ │ ├── README.md
│ │ ├── encryption.go
│ │ ├── go.mod
│ │ └── go.sum
│ ├── java/
│ │ └── README.md
│ ├── javascript/
│ │ ├── concurrent-writes/
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ ├── database-node/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ ├── database-wasm-vite/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── server.mjs
│ │ │ ├── vercel.json
│ │ │ └── vite.config.ts
│ │ ├── encryption/
│ │ │ ├── encryption.mjs
│ │ │ └── package.json
│ │ ├── sync-encryption/
│ │ │ ├── README.md
│ │ │ ├── package.json
│ │ │ └── sync_example.mjs
│ │ ├── sync-node/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ └── sync-wasm-vite/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── server.mjs
│ │ ├── vercel.json
│ │ └── vite.config.ts
│ ├── python/
│ │ ├── README.md
│ │ ├── basic.py
│ │ ├── concurrent_writes.py
│ │ ├── encryption.py
│ │ └── sync_example.py
│ └── react-native/
│ ├── .bundle/
│ │ └── config
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .prettierrc.js
│ ├── .watchmanconfig
│ ├── Gemfile
│ ├── README.md
│ ├── android/
│ │ ├── app/
│ │ │ ├── build.gradle
│ │ │ ├── debug.keystore
│ │ │ ├── proguard-rules.pro
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── tursoexample/
│ │ │ │ ├── MainActivity.kt
│ │ │ │ └── MainApplication.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── rn_edit_text_material.xml
│ │ │ └── values/
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ └── settings.gradle
│ ├── app.json
│ ├── babel.config.js
│ ├── index.js
│ ├── ios/
│ │ ├── .xcode.env
│ │ ├── Podfile
│ │ ├── TursoExample/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── PrivacyInfo.xcprivacy
│ │ ├── TursoExample.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── TursoExample.xcscheme
│ │ └── TursoExample.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── jest.config.js
│ ├── metro.config.js
│ ├── package.json
│ ├── react-native.config.js
│ ├── src/
│ │ └── App.tsx
│ └── tsconfig.json
├── extensions/
│ ├── completion/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── keywords.rs
│ │ └── lib.rs
│ ├── core/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── build.rs
│ │ └── src/
│ │ ├── functions.rs
│ │ ├── lib.rs
│ │ ├── types.rs
│ │ ├── vfs_modules.rs
│ │ └── vtabs.rs
│ ├── crypto/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── crypto.rs
│ │ └── lib.rs
│ ├── csv/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── fuzzy/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── caver.rs
│ │ ├── common.rs
│ │ ├── editdist.rs
│ │ ├── lib.rs
│ │ ├── phonetic.rs
│ │ ├── rsoundex.rs
│ │ ├── soundex.rs
│ │ └── translit.rs
│ ├── ipaddr/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── percentile/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── regexp/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ └── tests/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── flake.nix
├── fuzz/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── README.md
│ └── fuzz_targets/
│ ├── cast_real.rs
│ ├── expression.rs
│ ├── scalar_func.rs
│ └── schema.rs
├── licenses/
│ ├── bindings/
│ │ ├── java/
│ │ │ ├── assertj-license.md
│ │ │ ├── errorprone-license.md
│ │ │ ├── logback-license.md
│ │ │ └── spotless-license.md
│ │ └── python/
│ │ └── sqlalchemy-mit-license.md
│ ├── core/
│ │ ├── libm-mit-license.md
│ │ ├── pastey-apache-license.md
│ │ ├── pastey-mit-license.md
│ │ ├── serde-apache-license.md
│ │ ├── serde-mit-license.md
│ │ ├── serde_json5-license.md
│ │ ├── windows-apache.license.md
│ │ └── windows-mit-license.md
│ └── extensions/
│ ├── ipnetwork-apache-license.md
│ └── ipnetwork-mit-license.md
├── macros/
│ ├── Cargo.toml
│ └── src/
│ ├── assert.rs
│ ├── atomic_enum.rs
│ ├── ext/
│ │ ├── agg_derive.rs
│ │ ├── match_ignore_ascii_case.rs
│ │ ├── mod.rs
│ │ ├── scalars.rs
│ │ ├── vfs_derive.rs
│ │ └── vtab_derive.rs
│ ├── lib.rs
│ └── test.rs
├── packages/
│ └── turso-serverless/
│ ├── AGENT.md
│ ├── README.md
│ ├── examples/
│ │ ├── cloud-encryption/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ ├── remote/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ └── remote-compat/
│ │ ├── README.md
│ │ ├── index.mjs
│ │ └── package.json
│ ├── integration-tests/
│ │ ├── compat.test.mjs
│ │ └── serverless.test.mjs
│ ├── package.json
│ ├── src/
│ │ ├── async-lock.ts
│ │ ├── compat/
│ │ │ └── index.ts
│ │ ├── compat.ts
│ │ ├── connection.ts
│ │ ├── error.ts
│ │ ├── index.ts
│ │ ├── protocol.ts
│ │ ├── session.ts
│ │ └── statement.ts
│ └── tsconfig.json
├── parser/
│ ├── Cargo.toml
│ ├── README.md
│ ├── benches/
│ │ └── parser_benchmark.rs
│ └── src/
│ ├── ast/
│ │ ├── check.rs
│ │ └── fmt.rs
│ ├── ast.rs
│ ├── error.rs
│ ├── lexer.rs
│ ├── lib.rs
│ ├── parser.rs
│ └── token.rs
├── perf/
│ ├── clickbench/
│ │ ├── .gitignore
│ │ ├── benchmark.sh
│ │ ├── create.sql
│ │ ├── queries.sql
│ │ └── run.sh
│ ├── connection/
│ │ ├── README.md
│ │ ├── gen-database.py
│ │ ├── gen-databases
│ │ ├── limbo/
│ │ │ ├── Cargo.toml
│ │ │ ├── run-benchmark.sh
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── plot.py
│ │ └── rusqlite/
│ │ ├── Cargo.toml
│ │ ├── run-benchmark.sh
│ │ └── src/
│ │ └── main.rs
│ ├── encryption/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ └── main.rs
│ ├── graph-queries/
│ │ ├── .gitignore
│ │ ├── generate_seed.py
│ │ └── queries/
│ │ ├── 3_aggregate_or_in.sql
│ │ ├── a_cooccurrence.sql
│ │ ├── b_or_join.sql
│ │ ├── c_edge_counts.sql
│ │ ├── d_inlist_union.sql
│ │ ├── e_activity_agg.sql
│ │ ├── f1_streak_current.sql
│ │ └── f2_streak_longest.sql
│ ├── latency/
│ │ ├── README.md
│ │ ├── limbo/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ ├── gen-database.py
│ │ │ ├── gen-databases
│ │ │ ├── plot.py
│ │ │ ├── run-benchmark.sh
│ │ │ ├── rust-toolchain
│ │ │ └── src/
│ │ │ └── main.rs
│ │ └── rusqlite/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── gen-database.py
│ │ ├── gen-databases
│ │ ├── plot.py
│ │ ├── run-benchmark.sh
│ │ └── src/
│ │ └── main.rs
│ ├── mobibench/
│ │ ├── README.md
│ │ ├── plot/
│ │ │ ├── plot.py
│ │ │ └── pyproject.toml
│ │ └── run-eval.sh
│ ├── throughput/
│ │ ├── README.md
│ │ ├── plot/
│ │ │ ├── plot-compute-impact.py
│ │ │ └── plot-thread-scaling.py
│ │ ├── rusqlite/
│ │ │ ├── Cargo.toml
│ │ │ ├── scripts/
│ │ │ │ └── bench.sh
│ │ │ └── src/
│ │ │ └── main.rs
│ │ └── turso/
│ │ ├── Cargo.toml
│ │ ├── bench.sh
│ │ ├── scripts/
│ │ │ └── bench.sh
│ │ └── src/
│ │ └── main.rs
│ └── tpc-h/
│ ├── README.md
│ ├── benchmark.sh
│ ├── compare.sh
│ ├── plot/
│ │ ├── .python-version
│ │ ├── plot.py
│ │ ├── pyproject.toml
│ │ └── results2csv.sh
│ ├── queries/
│ │ ├── 1.sql
│ │ ├── 10.sql
│ │ ├── 11.sql
│ │ ├── 12.sql
│ │ ├── 13.sql
│ │ ├── 14.sql
│ │ ├── 15.sql
│ │ ├── 16.sql
│ │ ├── 17.sql
│ │ ├── 18.sql
│ │ ├── 19.sql
│ │ ├── 2.sql
│ │ ├── 20.sql
│ │ ├── 21.sql
│ │ ├── 22.sql
│ │ ├── 3.sql
│ │ ├── 4.sql
│ │ ├── 5.sql
│ │ ├── 6.sql
│ │ ├── 7.sql
│ │ ├── 8.sql
│ │ └── 9.sql
│ └── run.sh
├── pyproject.toml
├── rust-toolchain.toml
├── scripts/
│ ├── antithesis/
│ │ ├── launch.sh
│ │ ├── publish-config.sh
│ │ ├── publish-docker.sh
│ │ └── publish-workload.sh
│ ├── clean_interactions.sh
│ ├── clone_test_db.sh
│ ├── corruption-debug-tools/
│ │ ├── README.md
│ │ ├── find_corrupt_frame.py
│ │ ├── lib/
│ │ │ ├── __init__.py
│ │ │ ├── diff.py
│ │ │ ├── page.py
│ │ │ ├── record.py
│ │ │ └── wal.py
│ │ ├── page_diff.py
│ │ ├── page_history.py
│ │ ├── page_info.py
│ │ ├── track_rowid.py
│ │ ├── verify_stale.py
│ │ ├── wal_commits.py
│ │ └── wal_info.py
│ ├── corruption_bisecter.py
│ ├── diff.sh
│ ├── gen-changelog.py
│ ├── install-sqlite3.sh
│ ├── limbo-sqlite3
│ ├── merge-pr.py
│ ├── publish-crates.sh
│ ├── pyproject.toml
│ ├── release-status.py
│ ├── run-sim
│ ├── run-sim.ps1
│ ├── run-sqlancer.sh
│ ├── run-until-fail.sh
│ ├── turso-mvcc-sqlite3
│ └── update-version.py
├── sdk-kit/
│ ├── Cargo.toml
│ ├── README.md
│ ├── bindgen.sh
│ ├── readme-sdk-kit.mdx
│ ├── src/
│ │ ├── bindings.rs
│ │ ├── capi.rs
│ │ ├── lib.rs
│ │ └── rsapi.rs
│ └── turso.h
├── sdk-kit-macros/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── sql_generation/
│ ├── Cargo.toml
│ ├── generation/
│ │ ├── expr.rs
│ │ ├── mod.rs
│ │ ├── opts.rs
│ │ ├── predicate/
│ │ │ ├── binary.rs
│ │ │ ├── mod.rs
│ │ │ └── unary.rs
│ │ ├── query.rs
│ │ ├── table.rs
│ │ └── value/
│ │ ├── cmp.rs
│ │ ├── mod.rs
│ │ └── pattern.rs
│ ├── lib.rs
│ └── model/
│ ├── mod.rs
│ ├── query/
│ │ ├── alter_table.rs
│ │ ├── create.rs
│ │ ├── create_index.rs
│ │ ├── delete.rs
│ │ ├── drop.rs
│ │ ├── drop_index.rs
│ │ ├── insert.rs
│ │ ├── mod.rs
│ │ ├── pragma.rs
│ │ ├── predicate.rs
│ │ ├── select.rs
│ │ ├── transaction.rs
│ │ └── update.rs
│ └── table.rs
├── sqlite3/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ ├── cbindgen.toml
│ ├── examples/
│ │ └── example.c
│ ├── include/
│ │ └── sqlite3.h
│ ├── src/
│ │ └── lib.rs
│ └── tests/
│ ├── .gitignore
│ ├── Makefile
│ ├── compat/
│ │ └── mod.rs
│ └── sqlite3_tests.c
├── sync/
│ ├── engine/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── database_replay_generator.rs
│ │ ├── database_sync_engine.rs
│ │ ├── database_sync_engine_io.rs
│ │ ├── database_sync_lazy_storage.rs
│ │ ├── database_sync_operations.rs
│ │ ├── database_tape.rs
│ │ ├── errors.rs
│ │ ├── io_operations.rs
│ │ ├── lib.rs
│ │ ├── server_proto.rs
│ │ ├── sparse_io.rs
│ │ ├── types.rs
│ │ └── wal_session.rs
│ └── sdk-kit/
│ ├── Cargo.toml
│ ├── bindgen.sh
│ ├── src/
│ │ ├── bindings.rs
│ │ ├── capi.rs
│ │ ├── lib.rs
│ │ ├── rsapi.rs
│ │ ├── sync_engine_io.rs
│ │ └── turso_async_operation.rs
│ └── turso_sync.h
├── testing/
│ ├── README.md
│ ├── antithesis/
│ │ ├── README.md
│ │ ├── bank-test/
│ │ │ ├── anytime_validate.py
│ │ │ ├── eventually_validate.py
│ │ │ ├── finally_validate.py
│ │ │ ├── first_setup.py
│ │ │ └── parallel_driver_generate_transaction.py
│ │ ├── pyproject.toml
│ │ ├── stress/
│ │ │ └── singleton_driver_stress.sh
│ │ ├── stress-composer/
│ │ │ ├── first_setup.py
│ │ │ ├── helper_utils.py
│ │ │ ├── parallel_driver_alter_table.py
│ │ │ ├── parallel_driver_create_index.py
│ │ │ ├── parallel_driver_create_table.py
│ │ │ ├── parallel_driver_delete.py
│ │ │ ├── parallel_driver_drop_index.py
│ │ │ ├── parallel_driver_drop_table.py
│ │ │ ├── parallel_driver_insert.py
│ │ │ ├── parallel_driver_integritycheck.py
│ │ │ ├── parallel_driver_rollback.py
│ │ │ ├── parallel_driver_schema_rollback.py
│ │ │ ├── parallel_driver_update.py
│ │ │ ├── parallel_driver_wal_checkpoint.py
│ │ │ └── shuffle-run.sh
│ │ ├── stress-io_uring/
│ │ │ └── singleton_driver_stress.sh
│ │ ├── stress-io_uring-mvcc/
│ │ │ └── singleton_driver_stress.sh
│ │ ├── stress-mvcc/
│ │ │ └── singleton_driver_stress.sh
│ │ └── stress-unreliable/
│ │ └── singleton_driver_stress.sh
│ ├── cli_tests/
│ │ ├── cli_test_cases.py
│ │ ├── collate.py
│ │ ├── console.py
│ │ ├── constraint.py
│ │ ├── extensions.py
│ │ ├── memory.py
│ │ ├── mvcc.py
│ │ ├── sqlite_bench.py
│ │ ├── test_files/
│ │ │ ├── test.csv
│ │ │ └── test_w_header.csv
│ │ ├── test_turso_cli.py
│ │ ├── update.py
│ │ ├── vfs_bench.py
│ │ └── write.py
│ ├── concurrent-simulator/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── bin/
│ │ │ ├── explore
│ │ │ ├── run
│ │ │ └── run-elle
│ │ ├── chaotic_elle.rs
│ │ ├── elle.rs
│ │ ├── io.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── operations.rs
│ │ ├── properties.rs
│ │ ├── regression_tests.rs
│ │ └── workloads.rs
│ ├── differential-oracle/
│ │ ├── fuzzer/
│ │ │ ├── Cargo.toml
│ │ │ ├── custom_types_fuzzer.rs
│ │ │ ├── docker-runner/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── docker-entrypoint.fuzzer.ts
│ │ │ │ ├── github.ts
│ │ │ │ ├── levenshtein.ts
│ │ │ │ ├── logParse.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── random.ts
│ │ │ │ ├── slack.ts
│ │ │ │ └── tsconfig.json
│ │ │ ├── generate.rs
│ │ │ ├── lib.rs
│ │ │ ├── main.rs
│ │ │ ├── memory/
│ │ │ │ ├── file.rs
│ │ │ │ ├── io.rs
│ │ │ │ └── mod.rs
│ │ │ ├── oracle.rs
│ │ │ ├── printf_fuzzer.rs
│ │ │ ├── printf_gen.rs
│ │ │ ├── runner.rs
│ │ │ └── schema.rs
│ │ ├── sql_gen/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── ast.rs
│ │ │ ├── builder.rs
│ │ │ ├── capabilities.rs
│ │ │ ├── context.rs
│ │ │ ├── error.rs
│ │ │ ├── functions.rs
│ │ │ ├── generate/
│ │ │ │ ├── expr.rs
│ │ │ │ ├── literal.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── select.rs
│ │ │ │ └── stmt.rs
│ │ │ ├── lib.rs
│ │ │ ├── policy.rs
│ │ │ ├── schema.rs
│ │ │ ├── strategy.rs
│ │ │ └── trace.rs
│ │ ├── sql_gen_macros/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── sql_gen_prop/
│ │ ├── Cargo.toml
│ │ ├── alter_table.rs
│ │ ├── create_index.rs
│ │ ├── create_table.rs
│ │ ├── create_trigger.rs
│ │ ├── cte.rs
│ │ ├── delete.rs
│ │ ├── drop_index.rs
│ │ ├── drop_table.rs
│ │ ├── drop_trigger.rs
│ │ ├── expression.rs
│ │ ├── function.rs
│ │ ├── generator.rs
│ │ ├── insert.rs
│ │ ├── lib.rs
│ │ ├── profile.rs
│ │ ├── result.rs
│ │ ├── schema.rs
│ │ ├── select.rs
│ │ ├── statement.rs
│ │ ├── transaction.rs
│ │ ├── update.rs
│ │ ├── utility.rs
│ │ ├── value.rs
│ │ └── view.rs
│ ├── javascript/
│ │ ├── __test__/
│ │ │ ├── async.test.js
│ │ │ └── sync.test.js
│ │ ├── artifacts/
│ │ │ └── basic-test.sql
│ │ └── package.json
│ ├── pyproject.toml
│ ├── simulator/
│ │ ├── .gitignore
│ │ ├── COVERAGE.md
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── ROADMAP.md
│ │ ├── common/
│ │ │ └── mod.rs
│ │ ├── generation/
│ │ │ ├── mod.rs
│ │ │ ├── plan.rs
│ │ │ ├── property.rs
│ │ │ └── query.rs
│ │ ├── main.rs
│ │ ├── model/
│ │ │ ├── interactions.rs
│ │ │ ├── metrics.rs
│ │ │ ├── mod.rs
│ │ │ └── property.rs
│ │ ├── plan_to_test.rs
│ │ ├── profiles/
│ │ │ ├── io.rs
│ │ │ ├── mod.rs
│ │ │ └── query.rs
│ │ ├── run-miri.sh
│ │ ├── runner/
│ │ │ ├── bugbase.rs
│ │ │ ├── cli.rs
│ │ │ ├── clock.rs
│ │ │ ├── differential.rs
│ │ │ ├── doublecheck.rs
│ │ │ ├── env.rs
│ │ │ ├── execution.rs
│ │ │ ├── file.rs
│ │ │ ├── io.rs
│ │ │ ├── memory/
│ │ │ │ ├── file.rs
│ │ │ │ ├── io.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── mvcc_recovery.rs
│ │ │ │ └── statement_abandon.rs
│ │ │ └── mod.rs
│ │ ├── shrink/
│ │ │ ├── mod.rs
│ │ │ └── plan.rs
│ │ └── simulator-docker-runner/
│ │ ├── Dockerfile.simulator
│ │ ├── README.MD
│ │ ├── docker-entrypoint.simulator.ts
│ │ ├── github.ts
│ │ ├── levenshtein.test.ts
│ │ ├── levenshtein.ts
│ │ ├── logParse.ts
│ │ ├── package.json
│ │ ├── random.ts
│ │ ├── slack.ts
│ │ └── tsconfig.json
│ ├── sqlancer/
│ │ ├── README.md
│ │ ├── patches/
│ │ │ ├── LimboProvider.java
│ │ │ ├── LimboSchema.java
│ │ │ └── SQLite3Schema.patch
│ │ └── sqlancer-runner/
│ │ ├── Dockerfile.sqlancer
│ │ ├── README.md
│ │ ├── corruptionAnalysis.ts
│ │ ├── docker-entrypoint.sqlancer.ts
│ │ ├── github.ts
│ │ ├── levenshtein.ts
│ │ ├── logParse.ts
│ │ ├── package.json
│ │ ├── slack.ts
│ │ └── tsconfig.json
│ ├── sqlite3/
│ │ ├── README.md
│ │ ├── all.test
│ │ ├── alter.test
│ │ ├── alter2.test
│ │ ├── alter3.test
│ │ ├── alter4.test
│ │ ├── func.test
│ │ ├── func2.test
│ │ ├── func3.test
│ │ ├── func4.test
│ │ ├── func5.test
│ │ ├── func6.test
│ │ ├── func7.test
│ │ ├── func8.test
│ │ ├── func9.test
│ │ ├── insert.test
│ │ ├── insert2.test
│ │ ├── insert3.test
│ │ ├── insert4.test
│ │ ├── insert5.test
│ │ ├── join.test
│ │ ├── join2.test
│ │ ├── join3.test
│ │ ├── join4.test
│ │ ├── join5.test
│ │ ├── join6.test
│ │ ├── join7.test
│ │ ├── join8.test
│ │ ├── join9.test
│ │ ├── joinA.test
│ │ ├── joinB.test
│ │ ├── joinC.test
│ │ ├── joinD.test
│ │ ├── joinE.test
│ │ ├── joinF.test
│ │ ├── joinH.test
│ │ ├── select1.test
│ │ ├── select2.test
│ │ ├── select3.test
│ │ ├── select4.test
│ │ ├── select5.test
│ │ ├── select6.test
│ │ ├── select7.test
│ │ ├── select8.test
│ │ ├── select9.test
│ │ ├── selectA.test
│ │ ├── selectB.test
│ │ ├── selectC.test
│ │ ├── selectD.test
│ │ ├── selectE.test
│ │ ├── selectF.test
│ │ ├── selectG.test
│ │ ├── selectH.test
│ │ └── tester.tcl
│ ├── sqlite_test_ext/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── include/
│ │ │ ├── sqlite3.h
│ │ │ └── sqlite3ext.h
│ │ └── src/
│ │ ├── kvstore.c
│ │ └── lib.rs
│ ├── sqlright/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── collect_coverage.sh
│ │ ├── crash_reports/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── collect_crashes.py
│ │ │ ├── lib/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── database.py
│ │ │ │ ├── executor.py
│ │ │ │ ├── parser.py
│ │ │ │ └── scanner.py
│ │ │ ├── query_crashes.py
│ │ │ └── schema.sql
│ │ ├── patches/
│ │ │ ├── 0001-turso-increase-map-size-and-fix-gcc13.patch
│ │ │ ├── 0002-turso-fix-macos-bison-compatibility.patch
│ │ │ └── 0003-turso-fix-macos-compilation-errors.patch
│ │ ├── run.sh
│ │ └── setup.sh
│ ├── sqltests/
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── database/
│ │ │ └── .gitignore
│ │ ├── docs/
│ │ │ ├── README.md
│ │ │ ├── adding-backends.md
│ │ │ ├── architecture.md
│ │ │ ├── backends/
│ │ │ │ └── cli.md
│ │ │ ├── cli-usage.md
│ │ │ ├── dsl-spec.md
│ │ │ ├── parallelism.md
│ │ │ └── snapshot-testing.md
│ │ ├── examples/
│ │ │ ├── basic.sqltest
│ │ │ ├── joins.sqltest
│ │ │ ├── snapshot_example.sqltest
│ │ │ └── snapshots/
│ │ │ ├── snapshot_example__query-plan-by-id.snap
│ │ │ └── snapshot_example__query-plan-by-name.snap
│ │ ├── src/
│ │ │ ├── backends/
│ │ │ │ ├── cli.rs
│ │ │ │ ├── js.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── rust.rs
│ │ │ ├── comparison/
│ │ │ │ ├── exact.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pattern.rs
│ │ │ │ └── unordered.rs
│ │ │ ├── generator/
│ │ │ │ └── mod.rs
│ │ │ ├── lib.rs
│ │ │ ├── main.rs
│ │ │ ├── output/
│ │ │ │ ├── json.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── pretty.rs
│ │ │ ├── parser/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── lexer.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── sql_complete.rs
│ │ │ ├── runner/
│ │ │ │ └── mod.rs
│ │ │ ├── snapshot/
│ │ │ │ └── mod.rs
│ │ │ └── tcl_converter/
│ │ │ ├── mod.rs
│ │ │ ├── parser.rs
│ │ │ └── utils.rs
│ │ ├── syntax-highlighter/
│ │ │ └── vscode/
│ │ │ ├── README.md
│ │ │ ├── language-configuration.json
│ │ │ ├── package.json
│ │ │ └── syntaxes/
│ │ │ └── sqltest.tmLanguage.json
│ │ ├── tests/
│ │ │ ├── affinity.sqltest
│ │ │ ├── agg-functions/
│ │ │ │ ├── agg-extreme-exponent.sqltest
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── group-concat-types.sqltest
│ │ │ │ ├── is-true.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── sum-blob-types.sqltest
│ │ │ │ ├── sum-inf-cancel.sqltest
│ │ │ │ ├── sum-large-float.sqltest
│ │ │ │ └── sum-text-types.sqltest
│ │ │ ├── alter_rename_column_partial_idx.sqltest
│ │ │ ├── alter_table.sqltest
│ │ │ ├── autoincr.sqltest
│ │ │ ├── before-update-trigger-correlated-subquery.sqltest
│ │ │ ├── big.ignored_for_now
│ │ │ ├── boolean.sqltest
│ │ │ ├── btree-backward-scan.sqltest
│ │ │ ├── btree-large-page-overflow.sqltest
│ │ │ ├── btree_dump.sqltest
│ │ │ ├── changes.sqltest
│ │ │ ├── char.sqltest
│ │ │ ├── check_constraint.sqltest
│ │ │ ├── cmdlineshell.sqltest
│ │ │ ├── coalesce/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── collate.sqltest
│ │ │ ├── column_name_case.sqltest
│ │ │ ├── compare.sqltest
│ │ │ ├── composite-index-sort-elim.sqltest
│ │ │ ├── concat.sqltest
│ │ │ ├── correlated-subquery-hash-join.sqltest
│ │ │ ├── correlated-subquery-in-clause.sqltest
│ │ │ ├── correlated-subquery-window.sqltest
│ │ │ ├── create_index.sqltest
│ │ │ ├── create_table.sqltest
│ │ │ ├── cross_join.sqltest
│ │ │ ├── cte-real-affinity-join.sqltest
│ │ │ ├── cte-union-all-aggregate-literals.sqltest
│ │ │ ├── cte.sqltest
│ │ │ ├── cte_cardinality.sqltest
│ │ │ ├── cte_expressions.sqltest
│ │ │ ├── default_value.sqltest
│ │ │ ├── delete-correlated-subquery-rowid.sqltest
│ │ │ ├── delete-correlated-subquery.sqltest
│ │ │ ├── delete-limit-offset.sqltest
│ │ │ ├── delete.sqltest
│ │ │ ├── distinct.sqltest
│ │ │ ├── drop_index.sqltest
│ │ │ ├── drop_table.sqltest
│ │ │ ├── duplicate-trigger-names.sqltest
│ │ │ ├── expr-index-correlated-subquery.sqltest
│ │ │ ├── foreign_keys.sqltest
│ │ │ ├── generate_series.sqltest
│ │ │ ├── glob/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── graph_traversal_text_pk.sqltest
│ │ │ ├── group-by-expression-index.sqltest
│ │ │ ├── groupby/
│ │ │ │ ├── constant-expr.sqltest
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── duplicate-order-by.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── hex-real-compare.sqltest
│ │ │ ├── in-index-seek.sqltest
│ │ │ ├── in-null-or.sqltest
│ │ │ ├── in-subquery-ungrouped-aggregate.sqltest
│ │ │ ├── indexed_by.sqltest
│ │ │ ├── insert-cte-compound.sqltest
│ │ │ ├── insert.sqltest
│ │ │ ├── insert_autorowid_index.sqltest
│ │ │ ├── insert_not_null_default_index.sqltest
│ │ │ ├── insert_or_ignore_autoincrement.sqltest
│ │ │ ├── int64-overflow-seek.sqltest
│ │ │ ├── integrity_check/
│ │ │ │ ├── expression_index.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── parity_check_constraint.sqltest
│ │ │ │ ├── parity_corrupt_expression_index.sqltest
│ │ │ │ ├── parity_corrupt_index.sqltest
│ │ │ │ ├── parity_corrupt_partial_index.sqltest
│ │ │ │ ├── parity_freelist_count_mismatch.sqltest
│ │ │ │ ├── parity_freelist_trunk_corrupt.sqltest
│ │ │ │ ├── parity_missing_unique_index.sqltest
│ │ │ │ ├── parity_non_unique_index.sqltest
│ │ │ │ ├── parity_not_null_violation.sqltest
│ │ │ │ ├── parity_overflow_list_length_mismatch.sqltest
│ │ │ │ ├── parity_quick_check_constraint.sqltest
│ │ │ │ ├── snapshot_plans.sqltest
│ │ │ │ └── snapshots/
│ │ │ │ ├── snapshot_plans__integrity-check-multi-table-vdbe.snap
│ │ │ │ ├── snapshot_plans__integrity-check-vdbe.snap
│ │ │ │ ├── snapshot_plans__quick-check-multi-table-vdbe.snap
│ │ │ │ └── snapshot_plans__quick-check-vdbe.snap
│ │ │ ├── issue_5116.sqltest
│ │ │ ├── issue_5212.sqltest
│ │ │ ├── join/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── hash.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── natural_join_no_common.sqltest
│ │ │ │ └── outer_hash_join.sqltest
│ │ │ ├── json/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── json_subtype_strip.sqltest
│ │ │ │ ├── json_tree.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── last_insert_rowid.sqltest
│ │ │ ├── left-join-case-iif-null-masking.sqltest
│ │ │ ├── left-join-ifnull-optimization.sqltest
│ │ │ ├── like.sqltest
│ │ │ ├── limit.sqltest
│ │ │ ├── literal.sqltest
│ │ │ ├── math/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── degrees-radians-precision.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── matview-create-index.sqltest
│ │ │ ├── multi_index_dml.sqltest
│ │ │ ├── multi_index_intersection.sqltest
│ │ │ ├── multi_index_or_adversarial.sqltest
│ │ │ ├── multi_index_or_adversarial_extra.sqltest
│ │ │ ├── multi_index_or_compound.sqltest
│ │ │ ├── multi_index_or_join.sqltest
│ │ │ ├── mvcc-update-noop.sqltest
│ │ │ ├── negative_zero.sqltest
│ │ │ ├── not_between.sqltest
│ │ │ ├── null/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── offset/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── on_conflict.sqltest
│ │ │ ├── on_conflict_constraint_def.sqltest
│ │ │ ├── orderby/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── orderby_plan.sqltest
│ │ │ │ └── snapshots/
│ │ │ │ ├── orderby_plan__orderby_a_desc_uses_sorter.snap
│ │ │ │ ├── orderby_plan__orderby_a_uses_sorter.snap
│ │ │ │ ├── orderby_plan__orderby_rowid_desc_no_sorter.snap
│ │ │ │ └── orderby_plan__orderby_rowid_no_sorter.snap
│ │ │ ├── partial_idx.sqltest
│ │ │ ├── placeholder.sqltest
│ │ │ ├── pragma/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── index_info.sqltest
│ │ │ │ ├── index_list.sqltest
│ │ │ │ ├── index_xinfo.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── require_where.sqltest
│ │ │ │ ├── table_list.sqltest
│ │ │ │ └── user_version_10.sqltest
│ │ │ ├── pragma_query_only.sqltest
│ │ │ ├── returning-fk-constraint.sqltest
│ │ │ ├── returning.sqltest
│ │ │ ├── rollback.sqltest
│ │ │ ├── row-value-in.sqltest
│ │ │ ├── savepoint.sqltest
│ │ │ ├── scalar-functions-datetime.sqltest
│ │ │ ├── scalar-functions-format.sqltest
│ │ │ ├── scalar-functions-printf.sqltest
│ │ │ ├── scalar-functions.sqltest
│ │ │ ├── select/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ └── simple_min_max.sqltest
│ │ │ ├── simple-count-optimization.sqltest
│ │ │ ├── snapshot_tests/
│ │ │ │ ├── aggregation/
│ │ │ │ │ ├── aggregation.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── aggregation__aggregation-with-join.snap
│ │ │ │ │ ├── aggregation__count-column.snap
│ │ │ │ │ ├── aggregation__count-distinct.snap
│ │ │ │ │ ├── aggregation__count-star-plus-expr.snap
│ │ │ │ │ ├── aggregation__distinct-count-with-join.snap
│ │ │ │ │ ├── aggregation__group-by-with-having.snap
│ │ │ │ │ ├── aggregation__min-max-per-group.snap
│ │ │ │ │ ├── aggregation__min-max-with-index.snap
│ │ │ │ │ ├── aggregation__multi-column-group-by.snap
│ │ │ │ │ ├── aggregation__multiple-aggregates.snap
│ │ │ │ │ ├── aggregation__nested-aggregation.snap
│ │ │ │ │ ├── aggregation__simple-count-mixed-case.snap
│ │ │ │ │ ├── aggregation__simple-count-no-args.snap
│ │ │ │ │ ├── aggregation__simple-count-star.snap
│ │ │ │ │ ├── aggregation__simple-group-by-single-column.snap
│ │ │ │ │ └── aggregation__whole-table-aggregates.snap
│ │ │ │ ├── analyze/
│ │ │ │ │ ├── analyze.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── analyze__aggregate-after-analyze.snap
│ │ │ │ │ ├── analyze__analyze-all-stat1-exists.snap
│ │ │ │ │ ├── analyze__analyze-all.snap
│ │ │ │ │ ├── analyze__analyze-database.snap
│ │ │ │ │ ├── analyze__analyze-empty-table.snap
│ │ │ │ │ ├── analyze__analyze-index-stat1-exists.snap
│ │ │ │ │ ├── analyze__analyze-specific-index.snap
│ │ │ │ │ ├── analyze__analyze-stat1-exists.snap
│ │ │ │ │ ├── analyze__join-after-analyze.snap
│ │ │ │ │ ├── analyze__join-aggregate-after-analyze.snap
│ │ │ │ │ ├── analyze__max-after-analyze.snap
│ │ │ │ │ ├── analyze__min-after-analyze.snap
│ │ │ │ │ ├── analyze__order-by-index-after-analyze.snap
│ │ │ │ │ ├── analyze__query-after-analyze-category.snap
│ │ │ │ │ ├── analyze__query-after-analyze-equality.snap
│ │ │ │ │ ├── analyze__query-after-analyze-range.snap
│ │ │ │ │ ├── analyze__query-composite-full-after-analyze.snap
│ │ │ │ │ ├── analyze__query-composite-partial-after-analyze.snap
│ │ │ │ │ ├── analyze__query-composite-range-after-analyze.snap
│ │ │ │ │ ├── analyze__query-for-nulls-after-analyze.snap
│ │ │ │ │ ├── analyze__query-identical-composite-after-analyze.snap
│ │ │ │ │ ├── analyze__query-identical-values-after-analyze.snap
│ │ │ │ │ ├── analyze__query-three-column-first-only-after-analyze.snap
│ │ │ │ │ ├── analyze__query-three-column-full-after-analyze.snap
│ │ │ │ │ ├── analyze__query-three-column-partial-after-analyze.snap
│ │ │ │ │ └── analyze__query-with-nulls-after-analyze.snap
│ │ │ │ ├── indexes/
│ │ │ │ │ ├── indexes.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── indexes__aggregate-over-in-subquery-or-in-subquery.snap
│ │ │ │ │ ├── indexes__composite-index-first-column-only.snap
│ │ │ │ │ ├── indexes__composite-index-full-usage.snap
│ │ │ │ │ ├── indexes__composite-index-order-by-match.snap
│ │ │ │ │ ├── indexes__composite-index-range-on-second.snap
│ │ │ │ │ ├── indexes__composite-index-second-column-only.snap
│ │ │ │ │ ├── indexes__covering-index-all-columns.snap
│ │ │ │ │ ├── indexes__covering-index-subset.snap
│ │ │ │ │ ├── indexes__covering-index-with-aggregation.snap
│ │ │ │ │ ├── indexes__full-scan-function-on-indexed.snap
│ │ │ │ │ ├── indexes__full-scan-leading-wildcard.snap
│ │ │ │ │ ├── indexes__full-scan-no-index.snap
│ │ │ │ │ ├── indexes__full-scan-non-indexed-column.snap
│ │ │ │ │ ├── indexes__full-scan-with-aggregation.snap
│ │ │ │ │ ├── indexes__in-clause-multiple-values.snap
│ │ │ │ │ ├── indexes__in-composite-collation-mismatch-larger-table.snap
│ │ │ │ │ ├── indexes__in-composite-collation-mismatch.snap
│ │ │ │ │ ├── indexes__in-list-collation-match-explicit-nocase.snap
│ │ │ │ │ ├── indexes__in-list-collation-mismatch.snap
│ │ │ │ │ ├── indexes__in-list-composite-prefix.snap
│ │ │ │ │ ├── indexes__in-list-index-seek.snap
│ │ │ │ │ ├── indexes__in-list-no-index-scan.snap
│ │ │ │ │ ├── indexes__in-list-rowid-seek.snap
│ │ │ │ │ ├── indexes__in-subquery-collation-mismatch.snap
│ │ │ │ │ ├── indexes__in-subquery-or-in-list-left-join.snap
│ │ │ │ │ ├── indexes__in-subquery-or-in-subquery-indexed.snap
│ │ │ │ │ ├── indexes__index-for-correlated-max-materialized-cte-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-correlated-max-materialized-cte.snap
│ │ │ │ │ ├── indexes__index-for-max-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte-no-where-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte-no-where.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte.snap
│ │ │ │ │ ├── indexes__index-for-max.snap
│ │ │ │ │ ├── indexes__index-for-min-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-min.snap
│ │ │ │ │ ├── indexes__index-for-order-by.snap
│ │ │ │ │ ├── indexes__index-not-equal.snap
│ │ │ │ │ ├── indexes__indexed-by-delete-category.snap
│ │ │ │ │ ├── indexes__indexed-by-delete-sku.snap
│ │ │ │ │ ├── indexes__indexed-by-join-both.snap
│ │ │ │ │ ├── indexes__indexed-by-join-one-side.snap
│ │ │ │ │ ├── indexes__indexed-by-no-where-clause.snap
│ │ │ │ │ ├── indexes__indexed-by-select-category.snap
│ │ │ │ │ ├── indexes__indexed-by-select-price-range.snap
│ │ │ │ │ ├── indexes__indexed-by-select-sku.snap
│ │ │ │ │ ├── indexes__indexed-by-three-way-join.snap
│ │ │ │ │ ├── indexes__indexed-by-update-price.snap
│ │ │ │ │ ├── indexes__indexed-by-update-sku.snap
│ │ │ │ │ ├── indexes__join-with-index.snap
│ │ │ │ │ ├── indexes__max-with-equality-prefix-bytecode.snap
│ │ │ │ │ ├── indexes__multiple-indexes-choice.snap
│ │ │ │ │ ├── indexes__non-covering-needs-table-lookup.snap
│ │ │ │ │ ├── indexes__not-indexed-delete.snap
│ │ │ │ │ ├── indexes__not-indexed-select.snap
│ │ │ │ │ ├── indexes__not-indexed-update.snap
│ │ │ │ │ ├── indexes__or-different-columns.snap
│ │ │ │ │ ├── indexes__or-indexed-and-non-indexed.snap
│ │ │ │ │ ├── indexes__or-same-column.snap
│ │ │ │ │ ├── indexes__or-with-and-combinations.snap
│ │ │ │ │ ├── indexes__primary-key-lookup.snap
│ │ │ │ │ ├── indexes__range-scan-between.snap
│ │ │ │ │ ├── indexes__range-scan-greater-equal.snap
│ │ │ │ │ ├── indexes__range-scan-greater-than.snap
│ │ │ │ │ ├── indexes__range-scan-less-equal.snap
│ │ │ │ │ ├── indexes__range-scan-less-than.snap
│ │ │ │ │ ├── indexes__range-scan-timestamp.snap
│ │ │ │ │ ├── indexes__range-scan-with-equality.snap
│ │ │ │ │ ├── indexes__rowid-range-no-alias.snap
│ │ │ │ │ ├── indexes__rowid-seek-no-alias.snap
│ │ │ │ │ ├── indexes__simple-index-equality-lookup.snap
│ │ │ │ │ ├── indexes__simple-index-with-filter.snap
│ │ │ │ │ ├── indexes__subquery-with-index.snap
│ │ │ │ │ ├── indexes__unordered-correlated-max-materialized-cte-bytecode.snap
│ │ │ │ │ └── indexes__unordered-materialized-cte-max-bytecode.snap
│ │ │ │ ├── joins/
│ │ │ │ │ ├── joins.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── joins__bigass-three-table-join-rowid-seek.snap
│ │ │ │ │ ├── joins__cross-join-explicit.snap
│ │ │ │ │ ├── joins__cross-join-implicit.snap
│ │ │ │ │ ├── joins__cross-join-limited.snap
│ │ │ │ │ ├── joins__cross-join-with-filter.snap
│ │ │ │ │ ├── joins__four-table-join-with-aggregation.snap
│ │ │ │ │ ├── joins__hash-join-full-outer.snap
│ │ │ │ │ ├── joins__hash-join-inner-basic.snap
│ │ │ │ │ ├── joins__hash-join-left-outer-agg.snap
│ │ │ │ │ ├── joins__hash-join-left-outer.snap
│ │ │ │ │ ├── joins__hash-join-three-table.snap
│ │ │ │ │ ├── joins__hash-join-with-aggregation.snap
│ │ │ │ │ ├── joins__hash-join-with-order-by.snap
│ │ │ │ │ ├── joins__index-assisted-join-order-items.snap
│ │ │ │ │ ├── joins__index-assisted-join-product-lookup.snap
│ │ │ │ │ ├── joins__index-assisted-join-range-scan.snap
│ │ │ │ │ ├── joins__index-assisted-join-single-customer.snap
│ │ │ │ │ ├── joins__join-multiple-conditions.snap
│ │ │ │ │ ├── joins__join-with-exists.snap
│ │ │ │ │ ├── joins__join-with-subquery.snap
│ │ │ │ │ ├── joins__left-outer-join-basic.snap
│ │ │ │ │ ├── joins__left-outer-join-chained.snap
│ │ │ │ │ ├── joins__left-outer-join-find-nulls.snap
│ │ │ │ │ ├── joins__left-outer-join-with-aggregation.snap
│ │ │ │ │ ├── joins__mixed-join-types.snap
│ │ │ │ │ ├── joins__multi-table-join-complex-filter.snap
│ │ │ │ │ ├── joins__natural-join.snap
│ │ │ │ │ ├── joins__prefer-constant-bound-index-over-join-dependent.snap
│ │ │ │ │ ├── joins__self-join-category-hierarchy.snap
│ │ │ │ │ ├── joins__self-join-employee-manager.snap
│ │ │ │ │ ├── joins__self-join-find-subordinates.snap
│ │ │ │ │ ├── joins__self-join-prefer-join-dependent-index.snap
│ │ │ │ │ ├── joins__self-join-same-department.snap
│ │ │ │ │ ├── joins__three-table-join-explicit.snap
│ │ │ │ │ ├── joins__three-table-join-rowid-seek.snap
│ │ │ │ │ ├── joins__three-table-join.snap
│ │ │ │ │ ├── joins__two-table-inner-join-basic.snap
│ │ │ │ │ ├── joins__two-table-inner-join-explicit.snap
│ │ │ │ │ ├── joins__two-table-inner-join-with-filter.snap
│ │ │ │ │ └── joins__using-clause-join.snap
│ │ │ │ ├── modifications/
│ │ │ │ │ ├── modifications.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── modifications__delete-with-subquery.snap
│ │ │ │ │ ├── modifications__delete-with-where.snap
│ │ │ │ │ ├── modifications__insert-multiple-rows.snap
│ │ │ │ │ ├── modifications__insert-or-abort-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-fail-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-ignore-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-ignore.snap
│ │ │ │ │ ├── modifications__insert-or-replace-multi-notnull-default-partial.snap
│ │ │ │ │ ├── modifications__insert-or-replace-multi-notnull-default.snap
│ │ │ │ │ ├── modifications__insert-or-replace-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-replace.snap
│ │ │ │ │ ├── modifications__insert-or-rollback-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-select.snap
│ │ │ │ │ ├── modifications__insert-single-row.snap
│ │ │ │ │ └── modifications__update-simple.snap
│ │ │ │ ├── returning/
│ │ │ │ │ ├── returning.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── returning__delete-returning-expr.snap
│ │ │ │ │ ├── returning__delete-returning-star.snap
│ │ │ │ │ ├── returning__insert-returning-expr.snap
│ │ │ │ │ ├── returning__insert-returning-star.snap
│ │ │ │ │ ├── returning__update-returning-expr.snap
│ │ │ │ │ ├── returning__update-returning-star.snap
│ │ │ │ │ └── returning__upsert-returning.snap
│ │ │ │ ├── setops/
│ │ │ │ │ ├── setops.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── setops__compound-mixed-union.snap
│ │ │ │ │ ├── setops__compound-union-all-three-way.snap
│ │ │ │ │ ├── setops__compound-union-except.snap
│ │ │ │ │ ├── setops__compound-union-intersect.snap
│ │ │ │ │ ├── setops__except-basic.snap
│ │ │ │ │ ├── setops__except-multiple-columns.snap
│ │ │ │ │ ├── setops__intersect-basic.snap
│ │ │ │ │ ├── setops__intersect-multiple-columns.snap
│ │ │ │ │ ├── setops__subquery-with-union.snap
│ │ │ │ │ ├── setops__union-all-basic.snap
│ │ │ │ │ ├── setops__union-all-filtered.snap
│ │ │ │ │ ├── setops__union-distinct.snap
│ │ │ │ │ ├── setops__union-explicit-distinct.snap
│ │ │ │ │ ├── setops__union-subquery-aggregation.snap
│ │ │ │ │ └── setops__union-with-limit.snap
│ │ │ │ ├── sorting/
│ │ │ │ │ ├── snapshots/
│ │ │ │ │ │ ├── sorting__large-offset-small-limit.snap
│ │ │ │ │ │ ├── sorting__limit-with-offset.snap
│ │ │ │ │ │ ├── sorting__limit-without-order.snap
│ │ │ │ │ │ ├── sorting__order-by-desc.snap
│ │ │ │ │ │ ├── sorting__order-by-expression.snap
│ │ │ │ │ │ ├── sorting__order-by-index-with-range.snap
│ │ │ │ │ │ ├── sorting__order-by-limit-one.snap
│ │ │ │ │ │ ├── sorting__order-by-mixed-direction.snap
│ │ │ │ │ │ ├── sorting__order-by-multiple-columns.snap
│ │ │ │ │ │ ├── sorting__order-by-nullable-desc.snap
│ │ │ │ │ │ ├── sorting__order-by-single-column.snap
│ │ │ │ │ │ ├── sorting__order-by-with-index.snap
│ │ │ │ │ │ ├── sorting__order-by-with-limit.snap
│ │ │ │ │ │ ├── sorting__order-by-with-nulls.snap
│ │ │ │ │ │ ├── sorting__order-by-with-where.snap
│ │ │ │ │ │ ├── sorting__sort-elim-all-eq-order-non-index.snap
│ │ │ │ │ │ ├── sorting__sort-elim-eq-col-desc-direction.snap
│ │ │ │ │ │ ├── sorting__sort-elim-eq-prefix-order-suffix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-expr-index-eq-prefix-order-suffix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-expr-index-group-by-eq-prefix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-left-join-outer-rowid-suffix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-no-eq-order-non-leading.snap
│ │ │ │ │ │ ├── sorting__sort-elim-range-prefix-order-suffix.snap
│ │ │ │ │ │ └── sorting__sort-elim-two-eq-order-last.snap
│ │ │ │ │ └── sorting.sqltest
│ │ │ │ ├── subqueries/
│ │ │ │ │ ├── snapshots/
│ │ │ │ │ │ ├── subqueries__correlated-subquery-count.snap
│ │ │ │ │ │ ├── subqueries__correlated-subquery-salary.snap
│ │ │ │ │ │ ├── subqueries__correlated-subquery-where.snap
│ │ │ │ │ │ ├── subqueries__cte-aggregation.snap
│ │ │ │ │ │ ├── subqueries__cte-correlated-range-probe.snap
│ │ │ │ │ │ ├── subqueries__cte-in-subquery-and-main.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-aggregate-opposite-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-aggregate-same-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-all-flipped.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-mixed-clean-flip.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-partial-mismatch.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-same-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-outer-beyond-cte.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-prefix-match.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-reused-opposite-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-reused-same-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-scalar-probe.snap
│ │ │ │ │ │ ├── subqueries__cte-multiple-chained.snap
│ │ │ │ │ │ ├── subqueries__cte-multiple-independent.snap
│ │ │ │ │ │ ├── subqueries__cte-referenced-multiple-times.snap
│ │ │ │ │ │ ├── subqueries__cte-referencing-previous.snap
│ │ │ │ │ │ ├── subqueries__cte-self-join.snap
│ │ │ │ │ │ ├── subqueries__cte-simple.snap
│ │ │ │ │ │ ├── subqueries__cte-with-correlated-subquery.snap
│ │ │ │ │ │ ├── subqueries__cte-with-exists.snap
│ │ │ │ │ │ ├── subqueries__delete-returning-target-selfread.snap
│ │ │ │ │ │ ├── subqueries__derived-table-join.snap
│ │ │ │ │ │ ├── subqueries__derived-table-nested.snap
│ │ │ │ │ │ ├── subqueries__derived-table-simple.snap
│ │ │ │ │ │ ├── subqueries__exists-correlated.snap
│ │ │ │ │ │ ├── subqueries__exists-multiple-conditions.snap
│ │ │ │ │ │ ├── subqueries__grouped-correlated-subquery-having.snap
│ │ │ │ │ │ ├── subqueries__grouped-correlated-subquery-order-by.snap
│ │ │ │ │ │ ├── subqueries__in-subquery-aggregation.snap
│ │ │ │ │ │ ├── subqueries__in-subquery-simple.snap
│ │ │ │ │ │ ├── subqueries__not-exists-never-ordered.snap
│ │ │ │ │ │ ├── subqueries__not-exists-no-orders.snap
│ │ │ │ │ │ ├── subqueries__not-in-subquery.snap
│ │ │ │ │ │ ├── subqueries__run-length-current-window.snap
│ │ │ │ │ │ ├── subqueries__run-length-longest-window.snap
│ │ │ │ │ │ ├── subqueries__scalar-subquery-cross-table.snap
│ │ │ │ │ │ ├── subqueries__scalar-subquery-max-price.snap
│ │ │ │ │ │ ├── subqueries__scalar-subquery-simple-count.snap
│ │ │ │ │ │ ├── subqueries__subquery-within-cte.snap
│ │ │ │ │ │ ├── subqueries__update-returning-target-selfread.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-multi-hop-outer-orderby-elided.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-elided-by-cte.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-elided-by-group.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-not-elided-no-cte-order.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-not-elided-partial.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-elided-by-cte-order.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-elided-by-group.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-elided-multi-hop.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-not-elided-no-cte-order.snap
│ │ │ │ │ │ └── subquery-sort-elision__eqp-window-sort-not-elided-partial.snap
│ │ │ │ │ ├── subqueries.sqltest
│ │ │ │ │ └── subquery-sort-elision.sqltest
│ │ │ │ ├── tpch/
│ │ │ │ │ ├── snapshots/
│ │ │ │ │ │ ├── tpch__q1-pricing-summary.snap
│ │ │ │ │ │ ├── tpch__q10-returned-item.snap
│ │ │ │ │ │ ├── tpch__q11-important-stock.snap
│ │ │ │ │ │ ├── tpch__q12-shipping-modes.snap
│ │ │ │ │ │ ├── tpch__q13-customer-distribution.snap
│ │ │ │ │ │ ├── tpch__q14-promotion-effect.snap
│ │ │ │ │ │ ├── tpch__q15-top-supplier.snap
│ │ │ │ │ │ ├── tpch__q16-parts-supplier.snap
│ │ │ │ │ │ ├── tpch__q17-small-quantity-order.snap
│ │ │ │ │ │ ├── tpch__q18-large-volume-customer.snap
│ │ │ │ │ │ ├── tpch__q19-discounted-revenue.snap
│ │ │ │ │ │ ├── tpch__q2-minimum-cost-supplier.snap
│ │ │ │ │ │ ├── tpch__q20-potential-part-promotion.snap
│ │ │ │ │ │ ├── tpch__q21-suppliers-kept-waiting.snap
│ │ │ │ │ │ ├── tpch__q22-global-sales-opportunity.snap
│ │ │ │ │ │ ├── tpch__q3-shipping-priority.snap
│ │ │ │ │ │ ├── tpch__q4-order-priority.snap
│ │ │ │ │ │ ├── tpch__q5-local-supplier-volume.snap
│ │ │ │ │ │ ├── tpch__q6-forecasting-revenue.snap
│ │ │ │ │ │ ├── tpch__q7-volume-shipping.snap
│ │ │ │ │ │ ├── tpch__q8-national-market-share.snap
│ │ │ │ │ │ └── tpch__q9-product-type-profit.snap
│ │ │ │ │ └── tpch.sqltest
│ │ │ │ └── windows/
│ │ │ │ ├── snapshots/
│ │ │ │ │ ├── windows__aggregate-windows.snap
│ │ │ │ │ ├── windows__multiple-windows.snap
│ │ │ │ │ ├── windows__percent-of-total.snap
│ │ │ │ │ ├── windows__row-number-basic.snap
│ │ │ │ │ ├── windows__running-total.snap
│ │ │ │ │ ├── windows__window-order-by.snap
│ │ │ │ │ ├── windows__window-over-grouped.snap
│ │ │ │ │ └── windows__window-with-subquery.snap
│ │ │ │ └── windows.sqltest
│ │ │ ├── snapshots/
│ │ │ │ ├── cte_cardinality__cte-graph-traversal-multi-index-or.snap
│ │ │ │ ├── cte_cardinality__small-cte-materialized-big-cte-outer.snap
│ │ │ │ ├── cte_cardinality__small-cte-reordered-to-outer.snap
│ │ │ │ ├── cte_cardinality__small-subquery-reordered-to-outer.snap
│ │ │ │ ├── cte_cardinality__three-ctes-big-outer-others-materialized.snap
│ │ │ │ ├── graph_traversal_text_pk__cte-neighbor-traversal-text-pk.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-and-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-compound-or-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-or-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-or-one-row-subset-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-or-two-row-subset-access-shape.snap
│ │ │ │ ├── multi_index_dml__multi-index-or-access-shape.snap
│ │ │ │ ├── multi_index_dml__update-multi-index-and-access-shape.snap
│ │ │ │ ├── multi_index_dml__update-multi-index-or-access-shape.snap
│ │ │ │ ├── multi_index_intersection__composite-index-preferred-over-intersection-eqp.snap
│ │ │ │ ├── multi_index_intersection__multi-index-and-2-way-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-benchmark-shape-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-compound-branch-seek-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-correlated-subquery-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-cross-table-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-mixed-residual-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-rowid-branch-eqp.snap
│ │ │ │ ├── multi_index_or_join__cte-join-with-or-plan.snap
│ │ │ │ ├── multi_index_or_join__multi-index-or-in-join-parenthesized-plan.snap
│ │ │ │ └── multi_index_or_join__multi-index-or-in-join-plan.snap
│ │ │ ├── strict.sqltest
│ │ │ ├── subquery/
│ │ │ │ ├── cte_chain_regression.sqltest
│ │ │ │ ├── cte_materialization_adversarial.sqltest
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── expressions.sqltest
│ │ │ │ ├── materialized_cte_seek.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ └── subquery_cte_equivalence_tests.sqltest
│ │ │ ├── total-changes.sqltest
│ │ │ ├── transactions.sqltest
│ │ │ ├── trigger-before-insert-affinity.sqltest
│ │ │ ├── trigger-last-insert-rowid.sqltest
│ │ │ ├── trigger-quoted-identifiers.sqltest
│ │ │ ├── trigger-virtual-table-innocuous.sqltest
│ │ │ ├── trigger.sqltest
│ │ │ ├── trigger_attach_regression.sqltest
│ │ │ ├── trigger_fk_cascade.sqltest
│ │ │ ├── trigger_on_conflict.sqltest
│ │ │ ├── unnest-exists.sqltest
│ │ │ ├── update-returning-correlated-subquery.sqltest
│ │ │ ├── update.sqltest
│ │ │ ├── update_attached_db_index.sqltest
│ │ │ ├── update_expression_index.sqltest
│ │ │ ├── update_expression_index_affinity.sqltest
│ │ │ ├── update_index_affinity.sqltest
│ │ │ ├── update_or_replace_rowid_secondary_index.sqltest
│ │ │ ├── upsert-expr-index.sqltest
│ │ │ ├── upsert.sqltest
│ │ │ ├── vacuum_into.sqltest
│ │ │ ├── values.sqltest
│ │ │ ├── view-rowid.sqltest
│ │ │ ├── views.sqltest
│ │ │ ├── virtual-table-left-join.sqltest
│ │ │ ├── where/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ └── small.sqltest
│ │ │ ├── window/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── group-by-order-by-partition.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── window-agg-row-value.sqltest
│ │ │ └── window-selfjoin-reset-sorter.sqltest
│ │ └── turso-tests/
│ │ ├── alter_column.sqltest
│ │ ├── analyze.sqltest
│ │ ├── array-bugs.sqltest
│ │ ├── array-edge-cases.sqltest
│ │ ├── array.sqltest
│ │ ├── attach/
│ │ │ ├── cross_db_views_rejection.sqltest
│ │ │ ├── default.sqltest
│ │ │ ├── memory.sqltest
│ │ │ ├── small.sqltest
│ │ │ └── writes.sqltest
│ │ ├── builtin_pg_types.sqltest
│ │ ├── custom_type_alter_default.sqltest
│ │ ├── custom_type_datetime_validation.sqltest
│ │ ├── custom_type_default_values.sqltest
│ │ ├── custom_type_deterministic.sqltest
│ │ ├── custom_type_expr_index.sqltest
│ │ ├── custom_type_notnull_decode.sqltest
│ │ ├── custom_type_operators.sqltest
│ │ ├── custom_type_ordering.sqltest
│ │ ├── custom_type_upsert_trigger.sqltest
│ │ ├── custom_types.sqltest
│ │ ├── custom_types_fk_cascade.sqltest
│ │ ├── custom_types_non_strict.sqltest
│ │ ├── fts.sqltest
│ │ ├── json_object_star.sqltest
│ │ ├── materialized_view_text_arithmetic.sqltest
│ │ ├── materialized_views.sqltest
│ │ ├── matview_create_same_txn.sqltest
│ │ ├── matview_insert_or_replace.sqltest
│ │ ├── matview_integrity_check.sqltest
│ │ ├── multi-column-subquery-comparison.sqltest
│ │ ├── mvcc_feature_compat.sqltest
│ │ ├── mvcc_left_join_null_row.sqltest
│ │ ├── on_conflict_constraint.sqltest
│ │ ├── placeholder.sqltest
│ │ ├── raise.sqltest
│ │ ├── regexp.sqltest
│ │ ├── row-value-adversarial.sqltest
│ │ ├── strict_check_types.sqltest
│ │ ├── strict_custom_type_input_validation.sqltest
│ │ ├── time.sqltest
│ │ └── vector.sqltest
│ ├── stress/
│ │ ├── Cargo.toml
│ │ ├── Dockerfile.antithesis-config
│ │ ├── docker-compose.yaml
│ │ ├── docker-entrypoint.sh
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── opts.rs
│ │ ├── run-miri.sh
│ │ └── tests/
│ │ └── shuttle_mvcc.rs
│ ├── stress-go/
│ │ ├── README.md
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── main.go
│ ├── system/
│ │ ├── all.test
│ │ ├── gen-bigass-database.py
│ │ ├── gen-database.py
│ │ ├── tester.tcl
│ │ └── vtab.test
│ └── unreliable-libc/
│ ├── Makefile
│ └── file.c
├── tests/
│ ├── Cargo.toml
│ ├── README.md
│ ├── fuzz/
│ │ ├── cte.rs
│ │ ├── custom_types.rs
│ │ ├── expression_index.rs
│ │ ├── grammar_generator.rs
│ │ ├── helpers.rs
│ │ ├── join.rs
│ │ ├── journal_mode.rs
│ │ ├── mod.rs
│ │ ├── orderby_collation.rs
│ │ ├── raise.rs
│ │ ├── rowid_alias.rs
│ │ ├── savepoint.rs
│ │ ├── subjournal.rs
│ │ ├── subquery.rs
│ │ └── test_join_optimizer.rs
│ ├── integration/
│ │ ├── assert_details.rs
│ │ ├── common.rs
│ │ ├── conflict_resolution.rs
│ │ ├── custom_types.rs
│ │ ├── functions/
│ │ │ ├── mod.rs
│ │ │ ├── test_cdc.rs
│ │ │ ├── test_function_rowid.rs
│ │ │ ├── test_sum.rs
│ │ │ ├── test_uuid.rs
│ │ │ └── test_wal_api.rs
│ │ ├── fuzz_transaction/
│ │ │ └── mod.rs
│ │ ├── index_method/
│ │ │ └── mod.rs
│ │ ├── integrity_check.rs
│ │ ├── mod.rs
│ │ ├── mvcc.rs
│ │ ├── pragma.rs
│ │ ├── query_processing/
│ │ │ ├── encryption.rs
│ │ │ ├── mod.rs
│ │ │ ├── test_alter_table_reopen.rs
│ │ │ ├── test_btree.rs
│ │ │ ├── test_ddl.rs
│ │ │ ├── test_expr_index.rs
│ │ │ ├── test_hash_join_materialization.rs
│ │ │ ├── test_materialized_subquery.rs
│ │ │ ├── test_multi_thread.rs
│ │ │ ├── test_page1.rs
│ │ │ ├── test_read_path.rs
│ │ │ ├── test_schema_updated.rs
│ │ │ ├── test_transactions.rs
│ │ │ ├── test_type_affinity.rs
│ │ │ ├── test_vacuum.rs
│ │ │ └── test_write_path.rs
│ │ ├── statement_reset.rs
│ │ ├── stmt_journal.rs
│ │ ├── storage/
│ │ │ ├── autovacuum.rs
│ │ │ ├── checksum.rs
│ │ │ ├── header_version.rs
│ │ │ ├── mod.rs
│ │ │ └── short_read.rs
│ │ ├── trigger.rs
│ │ └── wal/
│ │ ├── mod.rs
│ │ └── test_wal.rs
│ └── lib.rs
├── tlaplus/
│ └── sqlite-tx/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── SqliteTx.cfg
│ └── SqliteTx.tla
└── tools/
└── dbhash/
├── Cargo.toml
├── README.md
├── src/
│ ├── encoder.rs
│ ├── lib.rs
│ └── main.rs
└── tests/
├── README.md
└── sqlite_compat.rs
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[env]
LIBSQLITE3_FLAGS = "-DSQLITE_ENABLE_MATH_FUNCTIONS" # necessary for rusqlite dependency in order to bundle SQLite with math functions included
[build]
# turso-sync package uses tokio_unstable to seed LocalRuntime and make it deterministic
# unfortunately, cargo commands invoked from workspace root didn't capture config.toml from dependent crate
# so, we set this cfg globally for workspace (see relevant issue build build-target: https://github.com/rust-lang/cargo/issues/7004)
rustflags = [
"--cfg=tokio_unstable",
]
# without these rustflags, cargo test failing because we are using shared napi library (turso_node)
# (these settings copied from napi-rs itself, see https://github.com/napi-rs/napi-rs/issues/2130#issuecomment-2239407809)
[target.'cfg(target_vendor = "apple")']
rustflags = [
"--cfg=tokio_unstable",
"-C",
"link-args=-Wl,-undefined,dynamic_lookup,-no_fixup_chains",
]
# To be able to run unit tests on Linux, support compilation to 'x86_64-unknown-linux-gnu'.
# pthread_key_create() destructors and segfault after a DSO unloading https://sourceware.org/bugzilla/show_bug.cgi?id=21031
[target.'cfg(all(target_os = "linux", target_env = "gnu"))']
rustflags = [
"--cfg=tokio_unstable",
"-C",
"link-args=-Wl,--warn-unresolved-symbols",
"-C",
"link-args=-Wl,-z,nodelete",
]
# To be able to run unit tests on Windows, support compilation to 'x86_64-pc-windows-msvc'.
[target.'cfg(target_env = "msvc")']
rustflags = [
"--cfg=tokio_unstable",
"-C",
"link-args=/FORCE"
]
# Android targets need 16KB page alignment for Android 15+ compatibility
[target.aarch64-linux-android]
rustflags = [
"--cfg=tokio_unstable",
"-C",
"link-args=-Wl,-z,max-page-size=16384",
]
[target.armv7-linux-androideabi]
rustflags = [
"--cfg=tokio_unstable",
"-C",
"link-args=-Wl,-z,max-page-size=16384",
]
[target.x86_64-linux-android]
rustflags = [
"--cfg=tokio_unstable",
"-C",
"link-args=-Wl,-z,max-page-size=16384",
]
[target.i686-linux-android]
rustflags = [
"--cfg=tokio_unstable",
"-C",
"link-args=-Wl,-z,max-page-size=16384",
]
================================================
FILE: .claude/skills/async-io-model/SKILL.md
================================================
---
name: async-io-model
description: Explanations of common asynchronous patterns used in tursodb. Involves IOResult, state machines, re-entrancy pitfalls, CompletionGroup. Always use these patterns in `core` when doing anything IO
---
# Async I/O Model Guide
Turso uses cooperative yielding with explicit state machines instead of Rust async/await.
## Core Types
```rust
pub enum IOCompletions {
Single(Completion),
}
#[must_use]
pub enum IOResult<T> {
Done(T), // Operation complete, here's the result
IO(IOCompletions), // Need I/O, call me again after completions finish
}
```
Functions returning `IOResult` must be called repeatedly until `Done`.
## Completion and CompletionGroup
A `Completion` tracks a single I/O operation:
```rust
pub struct Completion { /* ... */ }
impl Completion {
pub fn finished(&self) -> bool;
pub fn succeeded(&self) -> bool;
pub fn get_error(&self) -> Option<CompletionError>;
}
```
To wait for multiple I/O operations, use `CompletionGroup`:
```rust
let mut group = CompletionGroup::new(|_| {});
// Add individual completions
group.add(&completion1);
group.add(&completion2);
// Build into single completion that finishes when all complete
let combined = group.build();
io_yield_one!(combined);
```
`CompletionGroup` features:
- Aggregates multiple completions into one
- Calls callback when all complete (or any errors)
- Can nest groups (add a group's completion to another group)
- Cancellable via `group.cancel()`
## Helper Macros
### `return_if_io!`
Unwraps `IOResult`, propagates IO variant up the call stack:
```rust
let result = return_if_io!(some_io_operation());
// Only reaches here if operation returned Done
```
### `io_yield_one!`
Yields a single completion:
```rust
io_yield_one!(completion); // Returns Ok(IOResult::IO(Single(completion)))
```
## State Machine Pattern
Operations that may yield use explicit state enums:
```rust
enum MyOperationState {
Start,
WaitingForRead { page: PageRef },
Processing { data: Vec<u8> },
Done,
}
```
The function loops, matching on state and transitioning:
```rust
fn my_operation(&mut self) -> Result<IOResult<Output>> {
loop {
match &mut self.state {
MyOperationState::Start => {
let (page, completion) = start_read();
self.state = MyOperationState::WaitingForRead { page };
io_yield_one!(completion);
}
MyOperationState::WaitingForRead { page } => {
let data = page.get_contents();
self.state = MyOperationState::Processing { data: data.to_vec() };
// No yield, continue loop
}
MyOperationState::Processing { data } => {
let result = process(data);
self.state = MyOperationState::Done;
return Ok(IOResult::Done(result));
}
MyOperationState::Done => unreachable!(),
}
}
}
```
## Re-Entrancy: The Critical Pitfall
**State mutations before yield points cause bugs on re-entry.**
### Wrong
```rust
fn bad_example(&mut self) -> Result<IOResult<()>> {
self.counter += 1; // Mutates state
return_if_io!(something_that_might_yield()); // If yields, re-entry will increment again!
Ok(IOResult::Done(()))
}
```
If `something_that_might_yield()` returns `IO`, caller waits for completion, then calls `bad_example()` again. `counter` gets incremented twice (or more).
### Correct: Mutate After Yield
```rust
fn good_example(&mut self) -> Result<IOResult<()>> {
return_if_io!(something_that_might_yield());
self.counter += 1; // Only reached once, after IO completes
Ok(IOResult::Done(()))
}
```
### Correct: Use State Machine
```rust
enum State { Start, AfterIO }
fn good_example(&mut self) -> Result<IOResult<()>> {
loop {
match self.state {
State::Start => {
// Don't mutate shared state here
self.state = State::AfterIO;
return_if_io!(something_that_might_yield());
}
State::AfterIO => {
self.counter += 1; // Safe: only entered once
return Ok(IOResult::Done(()));
}
}
}
}
```
## Common Re-Entrancy Bugs
| Pattern | Problem |
|---------|---------|
| `vec.push(x); return_if_io!(...)` | Vec grows on each re-entry |
| `idx += 1; return_if_io!(...)` | Index advances multiple times |
| `map.insert(k,v); return_if_io!(...)` | Duplicate inserts or overwrites |
| `flag = true; return_if_io!(...)` | Usually ok, but check logic |
## State Enum Design
Encode progress in state variants:
```rust
// Good: index is part of state, preserved across yields
enum ProcessState {
Start,
ProcessingItem { idx: usize, items: Vec<Item> },
Done,
}
// Loop advances idx only when transitioning states
ProcessingItem { idx, items } => {
return_if_io!(process_item(&items[idx]));
if idx + 1 < items.len() {
self.state = ProcessingItem { idx: idx + 1, items };
} else {
self.state = Done;
}
}
```
## Turso Implementation
Key files:
- `core/types.rs` - `IOResult`, `IOCompletions`, `return_if_io!`, `return_and_restore_if_io!`
- `core/io/completions.rs` - `Completion`, `CompletionGroup`
- `core/util.rs` - `io_yield_one!` macro
- `core/state_machine.rs` - Generic `StateMachine` wrapper
- `core/storage/btree.rs` - Many state machine examples
- `core/storage/pager.rs` - `CompletionGroup` usage examples
## Testing Async Code
Re-entrancy bugs often only manifest under specific IO timing. Use:
- Deterministic simulation (`testing/simulator/`)
- Whopper concurrent DST (`testing/concurrent-simulator/`)
- Fault injection to force yields at different points
## References
- `docs/manual.md` section on I/O
================================================
FILE: .claude/skills/cdc/SKILL.md
================================================
---
name: cdc
description: Change Data Capture - architecture, entrypoints, bytecode emission, sync engine integration, tests
---
# CDC (Change Data Capture) - Internal Feature Map
## Overview
CDC tracks INSERT/UPDATE/DELETE changes on database tables by writing change records into a
dedicated CDC table (`turso_cdc` by default). It is per-connection, enabled via PRAGMA, and
operates at the bytecode generation (translate) layer. The sync engine consumes CDC records
to push local changes to the remote.
## Architecture Diagram
```
User SQL (INSERT/UPDATE/DELETE/DDL)
|
v
┌─────────────────────────────────────────────────┐
│ Translate layer (core/translate/) │
│ ┌───────────────────────────────────────────┐ │
│ │ prepare_cdc_if_necessary() │ │
│ │ - checks CaptureDataChangesInfo │ │
│ │ - opens CDC table cursor (OpenWrite) │ │
│ │ - skips if target == CDC table itself │ │
│ └───────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────┐ │
│ │ emit_cdc_insns() │ │
│ │ - writes (change_id, change_time, │ │
│ │ change_type, table_name, id, │ │
│ │ before, after, updates) into CDC tbl │ │
│ └───────────────────────────────────────────┘ │
│ + emit_cdc_full_record() / emit_cdc_patch_record() │
└─────────────────────────────────────────────────┘
|
v
CDC table (turso_cdc or custom name)
|
v
┌─────────────────────────────────────────────────┐
│ Sync engine (sync/engine/) │
│ DatabaseTape reads CDC table → DatabaseChange │
│ → apply/revert → push to remote │
└─────────────────────────────────────────────────┘
```
## Core Data Types
### `CaptureDataChangesMode` + `CaptureDataChangesInfo` — `core/lib.rs`
CDC behavior is controlled by two types:
```rust
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
#[repr(u8)]
enum CdcVersion {
V1 = 1,
V2 = 2,
}
const CDC_VERSION_CURRENT: CdcVersion = CdcVersion::V2;
enum CaptureDataChangesMode {
Id, // capture only rowid
Before, // capture before-image
After, // capture after-image
Full, // before + after + updates
}
struct CaptureDataChangesInfo {
mode: CaptureDataChangesMode,
table: String, // CDC table name
version: Option<CdcVersion>, // schema version (V1 or V2)
}
```
The connection stores `Option<CaptureDataChangesInfo>` — `None` means CDC is off.
Key methods on `CdcVersion`:
- `has_commit_record()` — `self >= V2`, gates COMMIT record emission
- `Display`/`FromStr` — round-trips `"v1"` ↔ `V1`, `"v2"` ↔ `V2`
Key methods on `CaptureDataChangesInfo`:
- `parse(value: &str, version: Option<CdcVersion>)` — parses PRAGMA argument `"<mode>[,<table_name>]"`, returns `None` for "off"
- `cdc_version()` — returns `CdcVersion` (panics if version is None). Single accessor replacing old `is_v1()`/`is_v2()`/`version()` methods.
- `has_before()` / `has_after()` / `has_updates()` — mode capability checks
- `mode_name()` — returns mode as string
Convenience trait `CaptureDataChangesExt` on `Option<CaptureDataChangesInfo>` provides:
- `has_before()` / `has_after()` / `has_updates()` — delegates to inner, returns false for None
- `table()` — returns `Option<&str>`, None when CDC is off
### CDC Table Schema v1
Default table name: `turso_cdc` (constant `TURSO_CDC_DEFAULT_TABLE_NAME`)
```sql
CREATE TABLE turso_cdc (
change_id INTEGER PRIMARY KEY AUTOINCREMENT,
change_time INTEGER, -- unixepoch()
change_type INTEGER, -- 1=INSERT, 0=UPDATE, -1=DELETE
table_name TEXT,
id <untyped>, -- rowid of changed row
before BLOB, -- binary record (before-image)
after BLOB, -- binary record (after-image)
updates BLOB -- binary record of per-column changes
);
```
### CDC Table Schema v2 (current)
```sql
CREATE TABLE turso_cdc (
change_id INTEGER PRIMARY KEY AUTOINCREMENT,
change_time INTEGER, -- unixepoch()
change_type INTEGER, -- 1=INSERT, 0=UPDATE, -1=DELETE, 2=COMMIT
table_name TEXT,
id <untyped>, -- rowid of changed row
before BLOB, -- binary record (before-image)
after BLOB, -- binary record (after-image)
updates BLOB, -- binary record of per-column changes
change_txn_id INTEGER -- transaction ID (groups rows into transactions)
);
```
v2 adds:
- `change_txn_id` column — groups CDC rows by transaction. Assigned via `conn_txn_id(candidate)` opcode which get-or-sets a per-connection transaction ID.
- `change_type=2` (COMMIT) records — mark transaction boundaries. Emitted once per statement in autocommit mode, or on explicit `COMMIT`.
The CDC table is created at runtime by the `InitCdcVersion` opcode via `CREATE TABLE IF NOT EXISTS`.
### CDC Version Table
When CDC is first enabled, a version tracking table is created:
```sql
CREATE TABLE turso_cdc_version (
table_name TEXT PRIMARY KEY,
version TEXT NOT NULL
);
```
Current version: `CDC_VERSION_CURRENT = CdcVersion::V2` (defined in `core/lib.rs`, re-exported from `core/translate/pragma.rs`)
### Version Detection in InitCdcVersion
The `InitCdcVersion` opcode detects v1 vs v2 by checking whether the CDC table already exists before creating it:
- If CDC table already exists but has no version row → v1 (pre-existing table from before version tracking)
- If CDC table doesn't exist → create with current version (v2)
- If version row already exists → use that version as-is
### `DatabaseChange` — `sync/engine/src/types.rs:229-249`
Sync engine's Rust representation of a CDC row. Has `into_apply()` and `into_revert()` methods
for forward/backward replay.
### `OperationMode` — `core/translate/emitter.rs`
Used by `emit_cdc_insns()` to determine `change_type` value:
- `INSERT` → 1
- `UPDATE` / `SELECT` → 0
- `DELETE` → -1
- `COMMIT` → 2 (v2 only, emitted by `emit_cdc_commit_insns`)
## Entry Points
### 1. PRAGMA — Enable/Disable CDC
**Set:** `core/translate/pragma.rs`
- Checks MVCC is not enabled (CDC and MVCC are mutually exclusive)
- Parses mode string via `CaptureDataChangesInfo::parse()` with `CDC_VERSION_CURRENT`
- Emits a single `InitCdcVersion` opcode — all CDC setup (table creation, version tracking, state change) happens at execution time
**Get (read current mode):** `core/translate/pragma.rs`
- Returns 3 columns: `mode`, `table`, `version`
- When off: returns `("off", NULL, NULL)`
- When active: returns `(mode_name, table, version)`
**Pragma registration:** `core/pragma.rs` — `CaptureDataChangesConn` (and deprecated alias `UnstableCaptureDataChangesConn`) with columns `["mode", "table", "version"]`
### 2. Connection State
**Field:** `core/connection.rs` — `capture_data_changes: RwLock<Option<CaptureDataChangesInfo>>`
**Getter:** `get_capture_data_changes_info()` — returns read guard
**Setter:** `set_capture_data_changes_info(opts: Option<CaptureDataChangesInfo>)`
**Default:** initialized as `None` (CDC off)
### 3. ProgramBuilder Integration
**Field:** `core/vdbe/builder.rs` — `capture_data_changes_info: Option<CaptureDataChangesInfo>`
**Accessor:** `capture_data_changes_info()` — returns `&Option<CaptureDataChangesInfo>`
**Passed from:** `core/translate/mod.rs` — read from connection when creating builder
### 4. PrepareContext
**Field:** `core/vdbe/mod.rs` — `capture_data_changes: Option<CaptureDataChangesInfo>`
**Set from:** `PrepareContext::from_connection()` — clones from `connection.get_capture_data_changes_info()`
### 5. InitCdcVersion Opcode — `core/vdbe/execute.rs`
Always emitted by PRAGMA SET. Handles all CDC setup at execution time:
1. For "off": stores `None` in `state.pending_cdc_info`, returns early
2. Checks if CDC table already exists (for v1 backward compatibility)
3. Creates CDC table (`CREATE TABLE IF NOT EXISTS <cdc_table_name> ...`) — v2 schema with `change_txn_id` column
4. Creates version table (`CREATE TABLE IF NOT EXISTS turso_cdc_version ...`)
5. Inserts version row: if CDC table pre-existed → "v1", otherwise → current version ("v2"). Uses `INSERT OR IGNORE` to preserve existing version rows.
6. Reads back actual version from the table
7. Stores computed `CaptureDataChangesInfo` in `state.pending_cdc_info`
The connection's CDC state is **not applied in the opcode**. Instead, `pending_cdc_info` is applied in `halt()` only after the transaction commits successfully. This ensures atomicity: if any step fails and the transaction rolls back, the connection's CDC state remains unchanged.
All table creation is done via nested `conn.prepare()`/`run_ignore_rows()` calls rather than bytecode emission, because the PRAGMA plan can't contain DML against tables that don't exist yet in the schema.
## Bytecode Emission (core/translate/emitter.rs)
These are the core CDC code generation functions:
| Function | Purpose |
|----------|---------|
| `prepare_cdc_if_necessary()` | Opens CDC table cursor if CDC is active and target != CDC table |
| `emit_cdc_full_record()` | Reads all columns from cursor into a MakeRecord (for before/after image) |
| `emit_cdc_patch_record()` | Builds record from in-flight register values (for after-image of INSERT/UPDATE) |
| `emit_cdc_insns()` | Writes a single CDC row per changed row (INSERT/UPDATE/DELETE). Called per-row inside DML loops. |
| `emit_cdc_commit_insns()` | Writes a COMMIT record (change_type=2) into CDC table (v2 only). Raw emission, no autocommit check. |
| `emit_cdc_autocommit_commit()` | End-of-statement COMMIT emission. Checks `is_autocommit()` at runtime — only emits COMMIT if in autocommit mode. v2 only. |
### COMMIT Emission Strategy (v2)
Per-row call sites use `emit_cdc_insns()` (no COMMIT). End-of-statement sites call `emit_cdc_autocommit_commit()` which checks `is_autocommit()` at runtime:
- **Autocommit mode:** emits a COMMIT record after the statement completes
- **Explicit transaction (`BEGIN...COMMIT`):** skips per-statement COMMIT; the explicit `COMMIT` statement emits the COMMIT record via `emit_cdc_commit_insns()`
This ensures multi-row statements like `INSERT INTO t VALUES (1),(2),(3)` produce one COMMIT at the end, not one per row.
## Integration Points — Where CDC Records Are Emitted
### INSERT — `core/translate/insert.rs`
- **Per-row:** `emit_cdc_insns()` after insert, and before delete for REPLACE/conflict
- **End-of-statement:** `emit_cdc_autocommit_commit()` in `emit_epilogue()` after the insert loop
### UPDATE — `core/translate/emitter.rs`
- **Per-row:** captures before-image, after-image via patch record, emits `emit_cdc_insns()`
- **End-of-statement:** `emit_cdc_autocommit_commit()` after the update loop
### DELETE — `core/translate/emitter.rs`
- **Per-row:** captures before-image and emits `emit_cdc_insns()`
- **End-of-statement:** `emit_cdc_autocommit_commit()` after the delete loop
### UPSERT (ON CONFLICT DO UPDATE) — `core/translate/upsert.rs`
- **Per-row:** `emit_cdc_insns()` for all three cases: pure insert, update after conflict, replace
- No end-of-statement COMMIT — upsert shares INSERT's epilogue
### Schema Changes (DDL) — `core/translate/schema.rs`
- **CREATE TABLE:** `emit_cdc_insns()` (insert into `sqlite_schema`) + `emit_cdc_autocommit_commit()`
- **DROP TABLE:** `emit_cdc_insns()` per-row in metadata loop + `emit_cdc_autocommit_commit()` after loop
- **CREATE INDEX:** `emit_cdc_insns()` + `emit_cdc_autocommit_commit()` (`core/translate/schema.rs`)
- **DROP INDEX:** `emit_cdc_insns()` per-row + `emit_cdc_autocommit_commit()` after loop (`core/translate/index.rs`)
DDL in explicit transactions (`BEGIN; CREATE TABLE t(x); COMMIT`) does NOT emit per-statement COMMIT — the autocommit check prevents it.
### ALTER TABLE — `core/translate/update.rs`
- Sets `cdc_update_alter_statement` on the update plan when CDC has updates mode
### Views/Triggers — Explicitly excluded
- `core/translate/view.rs` — passes `None` for CDC cursor
- `core/translate/trigger.rs` — passes `None` for CDC cursor
### Subqueries — No CDC
- `core/translate/subquery.rs` — `cdc_cursor_id: None`
## Helper Functions (for reading CDC data)
### `table_columns_json_array(table_name)` — `core/function.rs`, `core/vdbe/execute.rs`
Returns JSON array of column names for a table. Used to interpret binary records.
### `bin_record_json_object(columns_json, blob)` — `core/function.rs`, `core/vdbe/execute.rs`
Decodes a binary record (from `before`/`after`/`updates` columns) into a JSON object using column names.
## Sync Engine Integration
The sync engine is the primary consumer of CDC data.
### DatabaseTape — `sync/engine/src/database_tape.rs`
- **CDC config:** `DEFAULT_CDC_TABLE_NAME = "turso_cdc"`, `DEFAULT_CDC_MODE = "full"`
- **PRAGMA name:** `CDC_PRAGMA_NAME = "capture_data_changes_conn"`
- **Initialization:** `connect()` sets CDC pragma and caches `cdc_version` from `turso_cdc_version` table. Must be called before `iterate_changes()`.
- **Version caching:** `cdc_version: RwLock<Option<CdcVersion>>` — set by `connect()`, read by `iterate_changes()`. Panics if not set.
- **Iterator:** `DatabaseChangesIterator` reads CDC table in batches, emits `DatabaseTapeOperation`. For v2, real COMMIT records from the table are emitted. For v1, a synthetic Commit is appended at end of batch. `ignore_schema_changes: true` (default) filters out `sqlite_schema` row changes but not COMMIT records.
### Sync Operations — `sync/engine/src/database_sync_operations.rs`
- **Change counting:** `SELECT COUNT(*) FROM turso_cdc WHERE change_id > ?`
### Sync Engine — `sync/engine/src/database_sync_engine.rs`
- **Initialization:** `open_db()` calls `main_tape.connect(coro)` to ensure CDC is set up and version is cached before any `iterate_changes()` calls.
- During `apply_changes`, checks if CDC table existed, re-creates it after sync
### Replay Generator — `sync/engine/src/database_replay_generator.rs`
- Requires `updates` column to be populated (full mode)
## Bindings CDC Surface
All bindings expose `cdc_operations` as part of sync stats:
| Binding | File |
|---------|------|
| Python | `bindings/python/src/turso_sync.rs` |
| JavaScript | `bindings/javascript/sync/src/lib.rs` |
| JS (generator) | `bindings/javascript/sync/src/generator.rs` |
| Go | `bindings/go/bindings_sync.go` |
| React Native | `bindings/react-native/src/types.ts` |
| SDK Kit (C header) | `sync/sdk-kit/turso_sync.h` |
| SDK Kit (Rust) | `sync/sdk-kit/src/bindings.rs` |
## Tests
- **Integration tests:** `tests/integration/functions/test_cdc.rs` — covers all modes, CRUD, transactions, schema changes, version table, backward compatibility. Registered in `tests/integration/functions/mod.rs`.
- **Sync engine tests:** `sync/engine/src/database_tape.rs` — CDC table reads, tape iteration, replay of schema changes.
- **JS binding tests:** `bindings/javascript/sync/packages/{wasm,native}/promise.test.ts`
Run: `cargo test -- test_cdc` (integration) or `cargo test -p turso_sync_engine -- database_tape` (sync engine).
## User-facing Documentation
- **CLI manual page:** `cli/manuals/cdc.md` — accessible via `.manual cdc` in the REPL
- **Database manual:** `docs/manual.md` — CDC section linked in TOC
## Key Design Decisions
1. **Per-connection, not per-database.** Each connection has its own CDC mode and can target different tables.
2. **Bytecode-level implementation.** CDC instructions are emitted alongside the actual DML bytecode during translation — no runtime hooks or triggers.
3. **Self-exclusion.** Changes to the CDC table and `turso_cdc_version` table are never captured (checked in `prepare_cdc_if_necessary`).
4. **Schema changes tracked.** DDL operations are recorded as changes to `sqlite_schema` table.
5. **Binary record format.** Before/after/updates columns use SQLite's MakeRecord format (same as B-tree payload).
6. **Transaction-aware.** CDC writes happen within the same transaction as the DML, so rollback naturally discards CDC entries.
7. **Version tracking.** CDC schema version is recorded in `turso_cdc_version` table and carried in `CaptureDataChangesInfo.version` for future schema evolution.
8. **Atomic PRAGMA.** Connection CDC state is deferred via `pending_cdc_info` in `ProgramState` and applied only at Halt. If the PRAGMA's disk writes fail and the transaction rolls back, the connection state stays unchanged.
9. **Per-statement COMMIT (v2).** COMMIT records are emitted once per statement (not per row), using `emit_cdc_autocommit_commit()` which checks `is_autocommit()` at runtime. In explicit transactions, only the final `COMMIT` emits a COMMIT CDC record.
10. **Backward-compatible version detection.** Pre-existing v1 CDC tables (without `turso_cdc_version`) are detected by checking table existence before creation. Existing tables get `CdcVersion::V1` inserted into the version table.
11. **Typed version enum.** `CdcVersion` enum with `#[repr(u8)]` and `Ord`/`PartialOrd` enables feature gating via integer comparison (`has_commit_record()` = `self >= V2`). `Display`/`FromStr` handles database round-trip.
12. **CDC and MVCC mutual exclusion.** Enabling CDC when MVCC is active (or vice versa) returns an error. Checked at PRAGMA set time and journal mode switch time.
================================================
FILE: .claude/skills/code-quality/SKILL.md
================================================
---
name: code-quality
description: General Correctness rules, Rust patterns, comments, avoiding over-engineering. When writing code always take these into account
---
# Code Quality Guide
## Core Principle
Production database. Correctness paramount. Crash > corrupt.
## Correctness Rules
1. **No workarounds or quick hacks.** Handle all errors, check invariants
2. **Assert often.** Never silently fail or swallow edge cases
3. **Crash on invalid state** if it risks data integrity. Don't continue in undefined state
4. **Consider edge cases.** On long enough timeline, all possible bugs will happen
## Rust Patterns
- Make illegal states unrepresentable
- Exhaustive pattern matching
- Prefer enums over strings/sentinels
- Minimize heap allocations
- Write CPU-friendly code (microsecond = long time)
## If-Statements
Wrong:
```rust
if condition {
// happy path
} else {
// "shouldn't happen" - silently ignored
}
```
Right:
```rust
// If only one branch should ever be hit:
assert!(condition, "invariant violated: ...");
// OR
return Err(LimboError::InternalError("unexpected state".into()));
// OR
unreachable!("impossible state: ...");
```
Use if-statements only when both branches are expected paths.
## Comments
**Do:**
- Document WHY, not what
- Document functions, structs, enums, variants
- Focus on why something is necessary
**Don't:**
- Comments that repeat code
- References to AI conversations ("This test should trigger the bug")
- Temporal markers ("added", "existing code", "Phase 1")
## Avoid Over-Engineering
- Only changes directly requested or clearly necessary
- Don't add features beyond what's asked
- Don't add docstrings/comments to unchanged code
- Don't add error handling for impossible scenarios
- Don't create abstractions for one-time operations
- Three similar lines > premature abstraction
## Index Mutations
When code involves index inserts, deletes, or conflict resolution, double-check the ordering against SQLite. Wrong ordering causes index inconsistencies. and easy to miss.
## Ensure understanding of IO model
- [Async IO model](../async-io-model/SKILL.md)
## Cleanup
- Delete unused code completely
- No backwards-compat hacks (renamed `_vars`, re-exports, `// removed` comments)
================================================
FILE: .claude/skills/debugging/SKILL.md
================================================
---
name: debugging
description: How to debug tursodb using Bytecode comparison, logging, ThreadSanitizer, deterministic simulation, and corruption analysis tools
---
# Debugging Guide
## Bytecode Comparison Flow
Turso aims for SQLite compatibility. When behavior differs:
```
1. EXPLAIN query in sqlite3
2. EXPLAIN query in tursodb
3. Compare bytecode
├─ Different → bug in code generation
└─ Same but results differ → bug in VM or storage layer
```
### Example
```bash
# SQLite
sqlite3 :memory: "EXPLAIN SELECT 1 + 1;"
# Turso
cargo run --bin tursodb :memory: "EXPLAIN SELECT 1 + 1;"
```
## Manual Query Inspection
```bash
cargo run --bin tursodb :memory: 'SELECT * FROM foo;'
cargo run --bin tursodb :memory: 'EXPLAIN SELECT * FROM foo;'
```
## Logging
```bash
# Trace core during tests
RUST_LOG=none,turso_core=trace make test
# Output goes to testing/test.log
# Warning: can be megabytes per test run
```
## Threading Issues
Use stress tests with ThreadSanitizer:
```bash
rustup toolchain install nightly
rustup override set nightly
cargo run -Zbuild-std --target x86_64-unknown-linux-gnu \
-p turso_stress -- --vfs syscall --nr-threads 4 --nr-iterations 1000
```
## Deterministic Simulation
Reproduce bugs with seed. Note: simulator uses legacy "limbo" naming.
```bash
# Simulator
RUST_LOG=limbo_sim=debug cargo run --bin limbo_sim -- -s <seed>
# Whopper (concurrent DST)
SEED=1234 ./testing/concurrent-simulator/bin/run
```
## Architecture Reference
- **Parser** → AST from SQL strings
- **Code generator** → bytecode from AST
- **Virtual machine** → executes SQLite-compatible bytecode
- **Storage layer** → B-tree operations, paging
## Corruption Debugging
For WAL corruption and database integrity issues, use the corruption debug tools in [scripts](./scripts).
See [references/CORRUPTION-TOOLS.md](./references/CORRUPTION-TOOLS.md) for detailed usage.
================================================
FILE: .claude/skills/differential-fuzzer/SKILL.md
================================================
---
name: differential-fuzzer
description: Information about the differential fuzzer tool, how to run it and use it catch bugs in Turso. Always load this skill when running this tool
---
# Differential Fuzzer
Always load [Debugging skill for reference](../debugging/)
The differential fuzzer compares Turso results against SQLite for generated SQL statements to find correctness bugs.
## Location
`testing/differential-oracle/fuzzer/`
## Running the Fuzzer
### Single Run
```bash
# Basic run (100 statements, random seed)
cargo run --bin differential_fuzzer
# With specific seed for reproducibility
cargo run --bin differential_fuzzer -- --seed 12345
# More statements with verbose output
cargo run --bin differential_fuzzer -- -n 1000 --verbose
# Keep database files after run (for debugging)
cargo run --bin differential_fuzzer -- --seed 12345 --keep-files
# All options
cargo run --bin differential_fuzzer -- \
--seed <SEED> # Deterministic seed
-n <NUM> # Number of statements (default: 100)
-t <NUM> # Number of tables (default: 2)
-c <NUM> # Columns per table (default: 5)
--verbose # Print each SQL statement
--keep-files # Persist .db files to disk
```
### Continuous Fuzzing (Loop Mode)
```bash
# Run forever with random seeds
cargo run --bin differential_fuzzer -- loop
# Run 50 iterations
cargo run --bin differential_fuzzer -- loop 50
```
### Docker Runner (CI/Production)
```bash
# Build and run from repo root
docker build -f testing/differential-oracle/fuzzer/docker-runner/Dockerfile -t fuzzer .
docker run -e GITHUB_TOKEN=xxx -e SLACK_WEBHOOK_URL=xxx fuzzer
```
Environment variables for docker-runner:
- `TIME_LIMIT_MINUTES` - Total runtime (default: 1440 = 24h)
- `PER_RUN_TIMEOUT_SECONDS` - Per-run timeout (default: 1200 = 20min)
- `NUM_STATEMENTS` - Statements per run (default: 1000)
- `LOG_TO_STDOUT` - Print fuzzer output (default: false)
- `GITHUB_TOKEN` - For auto-filing issues
- `SLACK_WEBHOOK_URL` - For notifications
## Output Files
All output goes to `simulator-output/` directory:
| File | Description |
|------|-------------|
| `test.sql` | All executed SQL statements. Failed statements prefixed with `-- FAILED:`, errors with `-- ERROR:` |
| `schema.json` | Database schema at end of run (or at failure) |
| `test.db` | Turso database file (only with `--keep-files`) |
| `test-sqlite.db` | SQLite database file (only with `--keep-files`) |
## Reproducing Errors
Always follow these steps
1. **Find the seed** in the error output:
```
INFO: Starting differential_fuzzer with config: SimConfig { seed: 12345, ... }
```
2. **Re-run with that seed**:
```bash
cargo run --bin differential_fuzzer -- --seed 12345 --verbose --keep-files
```
3. **Check output files**:
- `simulator-output/test.sql` - Find the failing statement (look for `-- FAILED:`)
- `simulator-output/schema.json` - Check table structure at failure time
4. **Create a minimal reproducer**
- Create reproducer in `.sqltest` or in `.rs` always load [Debugging skill for reference](../debugging/)
5. **Compare behavior manually**:
If needed try to compare the behaviour and produce a report in the end.
Always write to a tmp file first with Edit tool to test the sql and then pass it to the binaries.
```bash
# Run failing SQL against SQLite
sqlite3 :memory: < simulator-output/test.sql
# Run against tursodb CLI
tursodb :memory: < simulator-output/test.sql
```
## Understanding Failures
### Oracle Failure Types
1. **Row set mismatch** - Turso returned different rows than SQLite
2. **Turso errored but SQLite succeeded** - Turso rejected valid SQL
3. **SQLite errored but Turso succeeded** - Turso accepted invalid SQL
4. **Schema mismatch** - Tables/columns differ after DDL
### Warning (non-fatal)
- **Unordered LIMIT mismatch** - LIMIT without ORDER BY may return different valid rows
## Key Source Files
| File | Purpose |
|------|---------|
| `main.rs` | CLI parsing, entry point |
| `runner.rs` | Main simulation loop, executes statements on both DBs |
| `oracle.rs` | Compares Turso vs SQLite results |
| `schema.rs` | Introspects schema from both databases |
| `memory/` | In-memory IO for deterministic simulation |
## Tracing
Set `RUST_LOG` for more detailed output:
```bash
RUST_LOG=debug cargo run --bin differential_fuzzer -- --seed 12345
```
================================================
FILE: .claude/skills/index-knowledge/SKILL.md
================================================
---
name: index-knowledge
description: Generate hierarchical AGENTS.md knowledge base for a codebase. Creates root + complexity-scored subdirectory documentation.
---
# index-knowledge
Generate hierarchical AGENTS.md files. Root + complexity-scored subdirectories.
## Usage
```
--create-new # Read existing → remove all → regenerate from scratch
--max-depth=2 # Limit directory depth (default: 5)
```
Default: Update mode (modify existing + create new where warranted)
---
## Workflow (High-Level)
1. **Discovery + Analysis** (concurrent)
- Launch parallel explore agents (multiple Task calls in one message)
- Main session: bash structure + LSP codemap + read existing AGENTS.md
2. **Score & Decide** - Determine AGENTS.md locations from merged findings
3. **Generate** - Root first, then subdirs in parallel
4. **Review** - Deduplicate, trim, validate
<critical>
**TodoWrite ALL phases. Mark in_progress → completed in real-time.**
```
TodoWrite([
{ id: "discovery", content: "Fire explore agents + LSP codemap + read existing", status: "pending", priority: "high" },
{ id: "scoring", content: "Score directories, determine locations", status: "pending", priority: "high" },
{ id: "generate", content: "Generate AGENTS.md files (root + subdirs)", status: "pending", priority: "high" },
{ id: "review", content: "Deduplicate, validate, trim", status: "pending", priority: "medium" }
])
```
</critical>
---
## Phase 1: Discovery + Analysis (Concurrent)
**Mark "discovery" as in_progress.**
### Launch Parallel Explore Agents
Multiple Task calls in a single message execute in parallel. Results return directly.
```
// All Task calls in ONE message = parallel execution
Task(
description="project structure",
subagent_type="explore",
prompt="Project structure: PREDICT standard patterns for detected language → REPORT deviations only"
)
Task(
description="entry points",
subagent_type="explore",
prompt="Entry points: FIND main files → REPORT non-standard organization"
)
Task(
description="conventions",
subagent_type="explore",
prompt="Conventions: FIND config files (.eslintrc, pyproject.toml, .editorconfig) → REPORT project-specific rules"
)
Task(
description="anti-patterns",
subagent_type="explore",
prompt="Anti-patterns: FIND 'DO NOT', 'NEVER', 'ALWAYS', 'DEPRECATED' comments → LIST forbidden patterns"
)
Task(
description="build/ci",
subagent_type="explore",
prompt="Build/CI: FIND .github/workflows, Makefile → REPORT non-standard patterns"
)
Task(
description="test patterns",
subagent_type="explore",
prompt="Test patterns: FIND test configs, test structure → REPORT unique conventions"
)
```
<dynamic-agents>
**DYNAMIC AGENT SPAWNING**: After bash analysis, spawn ADDITIONAL explore agents based on project scale:
| Factor | Threshold | Additional Agents |
|--------|-----------|-------------------|
| **Total files** | >100 | +1 per 100 files |
| **Total lines** | >10k | +1 per 10k lines |
| **Directory depth** | ≥4 | +2 for deep exploration |
| **Large files (>500 lines)** | >10 files | +1 for complexity hotspots |
| **Monorepo** | detected | +1 per package/workspace |
| **Multiple languages** | >1 | +1 per language |
```bash
# Measure project scale first
total_files=$(find . -type f -not -path '*/node_modules/*' -not -path '*/.git/*' | wc -l)
total_lines=$(find . -type f \( -name "*.ts" -o -name "*.py" -o -name "*.go" \) -not -path '*/node_modules/*' -exec wc -l {} + 2>/dev/null | tail -1 | awk '{print $1}')
large_files=$(find . -type f \( -name "*.ts" -o -name "*.py" \) -not -path '*/node_modules/*' -exec wc -l {} + 2>/dev/null | awk '$1 > 500 {count++} END {print count+0}')
max_depth=$(find . -type d -not -path '*/node_modules/*' -not -path '*/.git/*' | awk -F/ '{print NF}' | sort -rn | head -1)
```
Example spawning (all in ONE message for parallel execution):
```
// 500 files, 50k lines, depth 6, 15 large files → spawn additional agents
Task(
description="large files",
subagent_type="explore",
prompt="Large file analysis: FIND files >500 lines, REPORT complexity hotspots"
)
Task(
description="deep modules",
subagent_type="explore",
prompt="Deep modules at depth 4+: FIND hidden patterns, internal conventions"
)
Task(
description="cross-cutting",
subagent_type="explore",
prompt="Cross-cutting concerns: FIND shared utilities across directories"
)
// ... more based on calculation
```
</dynamic-agents>
### Main Session: Concurrent Analysis
**While Task agents execute**, main session does:
#### 1. Bash Structural Analysis
```bash
# Directory depth + file counts
find . -type d -not -path '*/\.*' -not -path '*/node_modules/*' -not -path '*/venv/*' -not -path '*/dist/*' -not -path '*/build/*' | awk -F/ '{print NF-1}' | sort -n | uniq -c
# Files per directory (top 30)
find . -type f -not -path '*/\.*' -not -path '*/node_modules/*' | sed 's|/[^/]*$||' | sort | uniq -c | sort -rn | head -30
# Code concentration by extension
find . -type f \( -name "*.py" -o -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.go" -o -name "*.rs" \) -not -path '*/node_modules/*' | sed 's|/[^/]*$||' | sort | uniq -c | sort -rn | head -20
# Existing AGENTS.md / CLAUDE.md
find . -type f \( -name "AGENTS.md" -o -name "CLAUDE.md" \) -not -path '*/node_modules/*' 2>/dev/null
```
#### 2. Read Existing AGENTS.md
```
For each existing file found:
Read(filePath=file)
Extract: key insights, conventions, anti-patterns
Store in EXISTING_AGENTS map
```
If `--create-new`: Read all existing first (preserve context) → then delete all → regenerate.
#### 3. LSP Codemap (if available)
```
lsp_servers() # Check availability
# Entry points (parallel)
lsp_document_symbols(filePath="src/index.ts")
lsp_document_symbols(filePath="main.py")
# Key symbols (parallel)
lsp_workspace_symbols(filePath=".", query="class")
lsp_workspace_symbols(filePath=".", query="interface")
lsp_workspace_symbols(filePath=".", query="function")
# Centrality for top exports
lsp_find_references(filePath="...", line=X, character=Y)
```
**LSP Fallback**: If unavailable, rely on explore agents + AST-grep.
**Merge: bash + LSP + existing + Task agent results. Mark "discovery" as completed.**
---
## Phase 2: Scoring & Location Decision
**Mark "scoring" as in_progress.**
### Scoring Matrix
| Factor | Weight | High Threshold | Source |
|--------|--------|----------------|--------|
| File count | 3x | >20 | bash |
| Subdir count | 2x | >5 | bash |
| Code ratio | 2x | >70% | bash |
| Unique patterns | 1x | Has own config | explore |
| Module boundary | 2x | Has index.ts/__init__.py | bash |
| Symbol density | 2x | >30 symbols | LSP |
| Export count | 2x | >10 exports | LSP |
| Reference centrality | 3x | >20 refs | LSP |
### Decision Rules
| Score | Action |
|-------|--------|
| **Root (.)** | ALWAYS create |
| **>15** | Create AGENTS.md |
| **8-15** | Create if distinct domain |
| **<8** | Skip (parent covers) |
### Output
```
AGENTS_LOCATIONS = [
{ path: ".", type: "root" },
{ path: "src/hooks", score: 18, reason: "high complexity" },
{ path: "src/api", score: 12, reason: "distinct domain" }
]
```
**Mark "scoring" as completed.**
---
## Phase 3: Generate AGENTS.md
**Mark "generate" as in_progress.**
### Root AGENTS.md (Full Treatment)
```markdown
# PROJECT KNOWLEDGE BASE
**Generated:** {TIMESTAMP}
**Commit:** {SHORT_SHA}
**Branch:** {BRANCH}
## OVERVIEW
{1-2 sentences: what + core stack}
## STRUCTURE
\`\`\`
{root}/
├── {dir}/ # {non-obvious purpose only}
└── {entry}
\`\`\`
## WHERE TO LOOK
| Task | Location | Notes |
|------|----------|-------|
## CODE MAP
{From LSP - skip if unavailable or project <10 files}
| Symbol | Type | Location | Refs | Role |
## CONVENTIONS
{ONLY deviations from standard}
## ANTI-PATTERNS (THIS PROJECT)
{Explicitly forbidden here}
## UNIQUE STYLES
{Project-specific}
## COMMANDS
\`\`\`bash
{dev/test/build}
\`\`\`
## NOTES
{Gotchas}
```
**Quality gates**: 50-150 lines, no generic advice, no obvious info.
### Subdirectory AGENTS.md (Parallel)
Launch general agents for each location in ONE message (parallel execution):
```
// All in single message = parallel
Task(
description="AGENTS.md for src/hooks",
subagent_type="general",
prompt="Generate AGENTS.md for: src/hooks
- Reason: high complexity
- 30-80 lines max
- NEVER repeat parent content
- Sections: OVERVIEW (1 line), STRUCTURE (if >5 subdirs), WHERE TO LOOK, CONVENTIONS (if different), ANTI-PATTERNS
- Write directly to src/hooks/AGENTS.md"
)
Task(
description="AGENTS.md for src/api",
subagent_type="general",
prompt="Generate AGENTS.md for: src/api
- Reason: distinct domain
- 30-80 lines max
- NEVER repeat parent content
- Sections: OVERVIEW (1 line), STRUCTURE (if >5 subdirs), WHERE TO LOOK, CONVENTIONS (if different), ANTI-PATTERNS
- Write directly to src/api/AGENTS.md"
)
// ... one Task per AGENTS_LOCATIONS entry
```
**Results return directly. Mark "generate" as completed.**
---
## Phase 4: Review & Deduplicate
**Mark "review" as in_progress.**
For each generated file:
- Remove generic advice
- Remove parent duplicates
- Trim to size limits
- Verify telegraphic style
**Mark "review" as completed.**
---
## Final Report
```
=== index-knowledge Complete ===
Mode: {update | create-new}
Files:
✓ ./AGENTS.md (root, {N} lines)
✓ ./src/hooks/AGENTS.md ({N} lines)
Dirs Analyzed: {N}
AGENTS.md Created: {N}
AGENTS.md Updated: {N}
Hierarchy:
./AGENTS.md
└── src/hooks/AGENTS.md
```
---
## Anti-Patterns
- **Static agent count**: MUST vary agents based on project size/depth
- **Sequential execution**: MUST parallel (multiple Task calls in one message)
- **Ignoring existing**: ALWAYS read existing first, even with --create-new
- **Over-documenting**: Not every dir needs AGENTS.md
- **Redundancy**: Child never repeats parent
- **Generic content**: Remove anything that applies to ALL projects
- **Verbose style**: Telegraphic or die
================================================
FILE: .claude/skills/mvcc/SKILL.md
================================================
---
name: mvcc
description: Overview of Experimental MVCC feature - snapshot isolation, versioning, limitations
---
# MVCC Guide (Experimental)
Multi-Version Concurrency Control. **Work in progress, not production-ready.**
**CRITICAL**: Ignore MVCC when debugging unless the bug is MVCC-specific.
## Enabling MVCC
```sql
PRAGMA journal_mode = 'mvcc';
```
Runtime configuration, not a compile-time feature flag. Per-database setting.
## How It Works
Standard WAL: single version per page, readers see snapshot at read mark time.
MVCC: multiple row versions, snapshot isolation. Each transaction sees consistent snapshot at begin time.
### Key Differences from WAL
| Aspect | WAL | MVCC |
|--------|-----|------|
| Write granularity | Every commit writes full pages | Affected rows only
| Readers/Writers | Don't block each other | Don't block each other |
| Persistence | `.db-wal` | `.db-log` (logical log) |
| Isolation | Snapshot (page-level) | Snapshot (row-level) |
### Versioning
Each row version tracks:
- `begin` - timestamp when visible
- `end` - timestamp when deleted/replaced
- `btree_resident` - existed before MVCC enabled
## Architecture
```
Database
└─ mv_store: MvStore
├─ rows: SkipMap<RowID, Vec<RowVersion>>
├─ txs: SkipMap<TxID, Transaction>
├─ Storage (.db-log file)
└─ CheckpointStateMachine
```
**Per-connection**: `mv_tx` tracks current MVCC transaction.
**Shared**: `MvStore` with lock-free `crossbeam_skiplist` structures.
## Key Files
- `core/mvcc/mod.rs` - Module overview
- `core/mvcc/database/mod.rs` - Main implementation (~3000 lines)
- `core/mvcc/cursor.rs` - Merged MVCC + B-tree cursor
- `core/mvcc/persistent_storage/logical_log.rs` - Disk format
- `core/mvcc/database/checkpoint_state_machine.rs` - Checkpoint logic
## Checkpointing
Flushes row versions to B-tree periodically.
```sql
PRAGMA mvcc_checkpoint_threshold = <pages>;
```
Process: acquire lock → begin pager txn → write rows → commit → truncate log → fsync → release.
## Current Limitations
**Not implemented:**
- Garbage collection (old versions accumulate)
- Recovery from logical log on restart
**Known issues:**
- Checkpoint blocks other transactions, even reads!
- No spilling to disk; memory use concerns
## Testing
```bash
# Run MVCC-specific tests
cargo test mvcc
# TCL tests with MVCC
make test-mvcc
```
Use `#[turso_macros::test(mvcc)]` attribute for MVCC-enabled tests.
```rust
#[turso_macros::test(mvcc)]
fn test_something() {
// runs with MVCC enabled
}
```
## References
- `core/mvcc/mod.rs` documents data anomalies (dirty reads, lost updates, etc.)
- Snapshot isolation vs serializability: MVCC provides the former, not the latter
================================================
FILE: .claude/skills/pr-workflow/SKILL.md
================================================
---
name: pr-workflow
description: General guidelines for Commits, formatting, CI, dependencies, security
---
# PR Workflow Guide
## Commit Practices
- **Atomic commits.** Small, focused, single purpose
- **Don't mix:** logic + formatting, logic + refactoring
- **Good message** = easy to write short description of intent
Learn `git rebase -i` for clean history.
## PR Guidelines
- Keep PRs focused and small
- Run relevant tests before submitting
- Each commit tells part of the story
## CI Environment Notes
If running as GitHub Action:
- Max-turns limit in `.github/workflows/claude.yml`
- OK to commit WIP state and push
- OK to open WIP PR and continue in another action
- Don't spiral into rabbit holes. Stay focused on key task
## Security
Never commit:
- `.env` files
- Credentials
- Secrets
## Third-Party Dependencies
When adding:
1. Add license file under `licenses/`
2. Update `NOTICE.md` with dependency info
## External APIs/Tools
- Never guess API params or CLI args
- Search official docs first
- Ask for clarification if ambiguous
================================================
FILE: .claude/skills/storage-format/SKILL.md
================================================
---
name: storage-format
description: SQLite file format, B-trees, pages, cells, overflow, freelist that is used in tursodb
---
# Storage Format Guide
## Database File Structure
```
┌─────────────────────────────┐
│ Page 1: Header + Schema │ ← First 100 bytes = DB header
├─────────────────────────────┤
│ Page 2..N: B-tree pages │ ← Tables and indexes
│ Overflow pages │
│ Freelist pages │
└─────────────────────────────┘
```
Page size: power of 2, 512-65536 bytes. Default 4096.
## Database Header (First 100 Bytes)
| Offset | Size | Field |
|--------|------|-------|
| 0 | 16 | Magic: `"SQLite format 3\0"` |
| 16 | 2 | Page size (big-endian) |
| 18 | 1 | Write format version (1=rollback, 2=WAL) |
| 19 | 1 | Read format version |
| 24 | 4 | Change counter |
| 28 | 4 | Database size in pages |
| 32 | 4 | First freelist trunk page |
| 36 | 4 | Total freelist pages |
| 40 | 4 | Schema cookie |
| 56 | 4 | Text encoding (1=UTF8, 2=UTF16LE, 3=UTF16BE) |
All multi-byte integers: **big-endian**.
## Page Types
| Flag | Type | Purpose |
|------|------|---------|
| 0x02 | Interior index | Index B-tree internal node |
| 0x05 | Interior table | Table B-tree internal node |
| 0x0a | Leaf index | Index B-tree leaf |
| 0x0d | Leaf table | Table B-tree leaf |
| - | Overflow | Payload exceeding cell capacity |
| - | Freelist | Unused pages (trunk or leaf) |
## B-tree Structure
Two B-tree types:
- **Table B-tree**: 64-bit rowid keys, stores row data
- **Index B-tree**: Arbitrary keys (index columns + rowid)
```
Interior page: [ptr0] key1 [ptr1] key2 [ptr2] ...
│ │ │
▼ ▼ ▼
child child child
pages pages pages
Leaf page: key1:data key2:data key3:data ...
```
Page 1 always root of `sqlite_schema` table.
## Cell Format
### Table Leaf Cell
```
[payload_size: varint] [rowid: varint] [payload] [overflow_ptr: u32?]
```
### Table Interior Cell
```
[left_child_page: u32] [rowid: varint]
```
### Index Cells
Similar but key is arbitrary (columns + rowid), not just rowid.
## Record Format (Payload)
```
[header_size: varint] [type1: varint] [type2: varint] ... [data1] [data2] ...
```
Serial types:
| Type | Meaning |
|------|---------|
| 0 | NULL |
| 1-4 | 1/2/3/4 byte signed int |
| 5 | 6 byte signed int |
| 6 | 8 byte signed int |
| 7 | IEEE 754 float |
| 8 | Integer 0 |
| 9 | Integer 1 |
| ≥12 even | BLOB, length=(N-12)/2 |
| ≥13 odd | Text, length=(N-13)/2 |
## Overflow Pages
When payload exceeds threshold, excess stored in overflow chain:
```
[next_page: u32] [data...]
```
Last page has next_page=0.
## Freelist
Linked list of trunk pages, each containing leaf page numbers:
```
Trunk: [next_trunk: u32] [leaf_count: u32] [leaf_pages: u32...]
```
## Turso Implementation
Key files:
- `core/storage/sqlite3_ondisk.rs` - On-disk format, `PageType` enum
- `core/storage/btree.rs` - B-tree operations (large file)
- `core/storage/pager.rs` - Page management
- `core/storage/buffer_pool.rs` - Page caching
## Debugging Storage
```bash
# Integrity check
cargo run --bin tursodb test.db "PRAGMA integrity_check;"
# Page count
cargo run --bin tursodb test.db "PRAGMA page_count;"
# Freelist info
cargo run --bin tursodb test.db "PRAGMA freelist_count;"
```
## References
- [SQLite File Format](https://sqlite.org/fileformat.html)
- [SQLite B-Tree Module](https://sqlite.org/btreemodule.html)
- [SQLite Internals: Pages & B-trees](https://fly.io/blog/sqlite-internals-btree/)
================================================
FILE: .claude/skills/testing/SKILL.md
================================================
---
name: testing
description: How to write tests, when to use each type of test, and how to run them. Contains information about conversion of `.test` to `.sqltest`, and how to write `.sqltest` and rust tests
---
# Testing Guide
## Test Types & When to Use
| Type | Location | Use Case |
|------|----------|----------|
| `.sqltest` | `testing/sqltests/tests/` | SQL compatibility. **Preferred for new tests** |
| TCL `.test` | `testing/` | Legacy SQL compat (being phased out) |
| Rust integration | `tests/integration/` | Regression tests, complex scenarios |
| Fuzz | `tests/fuzz/` | Complex features, edge case discovery |
**Note:** TCL tests are being phased out in favor of testing/sqltests. The `.sqltest` format allows the same test cases to run against multiple backends (CLI, Rust bindings, etc.).
## Running Tests
```bash
# Main test suite (TCL compat, sqlite3 compat, Python wrappers)
make test
# Single TCL test
make test-single TEST=select.test
# SQL test runner
make -C testing/sqltests run-cli
# OR
cargo run -p test-runner -- run <test-file or directory>
# Rust unit/integration tests (full workspace)
cargo test
```
## Writing Tests
### .sqltest (Preferred)
```
@database :default:
test example-addition {
SELECT 1 + 1;
}
expect {
2
}
test example-multiple-rows {
SELECT id, name FROM users WHERE id < 3;
}
expect {
1|alice
2|bob
}
```
Location: `testing/sqltests/tests/*.sqltest`
You must start converting TCL tests with the `convert` command from the test runner (e.g `cargo run -- convert <TCL_test_path> -o <out_dir>`). It is not always accurate, but it will convert most of the tests. If some conversion emits a warning you will have to write by hand whatever is missing from it (e.g unroll a for each loop by hand). Then you need to verify the tests work by running them with `make -C testing/sqltests run-rust`, and adjust their output if something was wrong with the conversion. Also, we use harcoded databases in TCL, but with `.sqltest` we generate the database with a different seed, so you will probably need to change the expected test result to match the new database query output. Avoid changing the SQL statements from the test, just change the expected result
### TCL
```tcl
do_execsql_test_on_specific_db {:memory:} test-name {
SELECT 1 + 1;
} {2}
```
Location: `testing/*.test`
### Rust Integration
```rust
// tests/integration/test_foo.rs
#[test]
fn test_something() {
let conn = Connection::open_in_memory().unwrap();
// ...
}
```
## Key Rules
- Every functional change needs a test
- Test must fail without change, pass with it
- Prefer in-memory DBs: `:memory:` (sqltest) or `{:memory:}` (TCL)
- Don't invent new test formats. Follow existing patterns
- Write tests first when possible
## Test Database Schema
`testing/system/testing.db` has `users` and `products` tables. See [docs/testing.md](../../../docs/testing.md) for schema.
## Logging During Tests
```bash
RUST_LOG=none,turso_core=trace make test
```
Output: `testing/system/test.log`. Warning: very verbose.
================================================
FILE: .claude/skills/transaction-correctness/SKILL.md
================================================
---
name: transaction-correctness
description: How WAL mechanics, checkpointing, concurrency rules, recovery work in tursodb
---
# Transaction Correctness Guide
Turso uses WAL (Write-Ahead Logging) mode exclusively.
Files: `.db`, `.db-wal` (no `.db-shm` - Turso uses in-memory WAL index)
## WAL Mechanics
### Write Path
1. Writer appends frames (page data) to WAL file (sequential I/O)
2. COMMIT = frame with non-zero db_size in header (marks transaction end)
3. Original DB unchanged until checkpoint
### Read Path
1. Reader acquires read mark (mxFrame = last valid commit frame)
2. For each page: check WAL up to mxFrame, fall back to main DB
3. Reader sees consistent snapshot at its read mark
### Checkpointing
Transfers WAL content back to main DB.
```
WAL grows → checkpoint triggered (default: 1000 pages) → pages copied to DB → WAL reused
```
Checkpoint types:
- **PASSIVE**: Non-blocking, stops at pages needed by active readers
- **FULL**: Waits for readers, checkpoints everything
- **RESTART**: Like FULL, also resets WAL to beginning
- **TRUNCATE**: Like RESTART, also truncates WAL file to zero length
### WAL-Index
SQLite uses a shared memory file (`-shm`) for WAL index. **Turso does not** - it uses in-memory data structures (`frame_cache` hashmap, atomic read marks) since multi-process access is not supported.
## Concurrency Rules
- One writer at a time
- Readers don't block writer, writer doesn't block readers
- Checkpoint must stop at pages needed by active readers
## Recovery
On crash:
1. First connection acquires exclusive lock
2. Replays valid commits from WAL
3. Releases lock, normal operation resumes
## Turso Implementation
Key files:
- [WAL implementation](../../../core/storage/wal.rs) - WAL implementation
- [Page management, transactions](../../../core/storage/pager.rs)
### Connection-Private vs Shared
**Per-Connection (private):**
- `Pager` - page cache, dirty pages, savepoints, commit state
- `WalFile` - connection's snapshot view:
- `max_frame` / `min_frame` - frame range for this connection's snapshot
- `max_frame_read_lock_index` - which read lock slot this connection holds
- `last_checksum` - rolling checksum state
**Shared across connections:**
- `WalFileShared` - global WAL state:
- `frame_cache` - page-to-frame index (replaces `.shm` file)
- `max_frame` / `nbackfills` - global WAL progress
- `read_locks[5]` - read mark slots (TursoRwLock with embedded frame values)
- `write_lock` - exclusive writer lock
- `checkpoint_lock` - checkpoint serialization
- `file` - WAL file handle
- `DatabaseStorage` - main `.db` file
- `BufferPool` - shared memory allocation
## Correctness Invariants
1. **Durability**: COMMIT record must be fsynced before returning success
2. **Atomicity**: Partial transactions never visible to readers
3. **Isolation**: Each reader sees consistent snapshot
4. **No lost updates**: Checkpoint can't overwrite uncommitted changes
## References
- [SQLite WAL](https://sqlite.org/wal.html)
- [WAL File Format](https://sqlite.org/walformat.html)
================================================
FILE: .config/nextest.toml
================================================
[profile.loom]
# Filter to only run tests with "loom_" in the name
default-filter = 'test(/loom_/)'
# Loom tests are slow - model checking explores all interleavings
slow-timeout = { period = "120s", terminate-after = 2 }
fail-fast = false
failure-output = "final"
test-threads = 1
[profile.shuttle]
# Filter to only run tests containing "shuttle_" in the name
default-filter = 'test(/shuttle_/)'
slow-timeout = { period = "60s", terminate-after = 2 }
fail-fast = false
failure-output = "final"
test-threads = 1
================================================
FILE: .devcontainer/Dockerfile
================================================
FROM node:20
ARG TZ
ARG CLAUDE_CODE_VERSION
ARG GIT_DELTA_VERSION
ARG ZSH_IN_DOCKER_VERSION
ARG GO_VERSION
ARG RUST_VERSION
ARG PYTHON_VERSION
ENV TZ="$TZ"
# Install build dependencies needed for further installations
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
curl \
ca-certificates \
build-essential \
pkg-config \
gnupg2 \
python${PYTHON_VERSION}-dev \
sudo \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Ensure default node user has access to /usr/local/share
RUN mkdir -p /usr/local/share/npm-global && \
chown -R node:node /usr/local/share
ARG USERNAME=node
# Persist bash history.
RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
&& mkdir /commandhistory \
&& touch /commandhistory/.bash_history \
&& chown -R $USERNAME /commandhistory
# Set `DEVCONTAINER` environment variable to help with orientation
ENV DEVCONTAINER=true
# Create workspace and config directories and set permissions
RUN mkdir -p /workspace /home/node/.claude && \
chown -R node:node /workspace /home/node/.claude
WORKDIR /workspace
RUN ARCH=$(dpkg --print-architecture) && \
wget "https://github.com/dandavison/delta/releases/download/${GIT_DELTA_VERSION}/git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb" && \
sudo dpkg -i "git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb" && \
rm "git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb"
# Install Go
ENV GOROOT=/usr/local/go
ENV GOPATH=/home/node/go
ENV PATH=$PATH:/usr/local/go/bin:/home/node/go/bin
RUN set -eux; \
OS="$(uname -s)"; \
ARCH="$(uname -m)"; \
\
case "$OS" in \
Linux) \
GOOS=linux ;; \
Darwin) \
GOOS=darwin ;; \
*) \
echo "Unsupported OS: $OS" && exit 1 ;; \
esac; \
\
case "$ARCH" in \
x86_64|amd64) \
GOARCH=amd64 ;; \
aarch64|arm64) \
GOARCH=arm64 ;; \
*) \
echo "Unsupported arch: $ARCH" && exit 1 ;; \
esac; \
\
curl -fsSL "https://go.dev/dl/go${GO_VERSION}.${GOOS}-${GOARCH}.tar.gz" \
| sudo tar -C /usr/local -xz
RUN go install golang.org/x/tools/gopls@latest
RUN go install honnef.co/go/tools/cmd/staticcheck@latest
RUN chown -R node:node /home/node/go
# Set up non-root user
USER node
# Install Rust
ENV RUSTUP_HOME=/home/node/.rustup \
CARGO_HOME=/home/node/.cargo
ENV PATH=$PATH:/home/node/.cargo/bin
RUN curl https://sh.rustup.rs -sSf | sh -s -- \
-y \
--default-toolchain ${RUST_VERSION} \
--profile minimal \
&& rustup component add rustfmt clippy
# Install Python
ENV UV_HOME=/home/node/.uv
ENV PATH=$PATH:/home/node/.cargo/bin:/home/node/.local/bin
RUN curl -Ls https://astral.sh/uv/install.sh | sh
RUN uv python install ${PYTHON_VERSION}
# Check installation
RUN rustc --version \
&& cargo --version \
&& go version \
&& uv --version
# Install global packages
ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
ENV PATH=$PATH:/usr/local/share/npm-global/bin
# Set the default shell to zsh rather than sh
ENV SHELL=/bin/zsh
# Set the default editor and visual
ENV EDITOR=vim
ENV VISUAL=vim
# Switch back to root to install runtime dependencies
USER root
# Install runtime dependencies for final image
RUN apt-get update && apt-get install -y --no-install-recommends \
traceroute \
iputils-ping \
sqlite3 \
less \
git \
procps \
fzf \
zsh \
man-db \
unzip \
gh \
iptables \
ipset \
iproute2 \
dnsutils \
aggregate \
jq \
nano \
vim \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Switch back to node user
USER node
# Default powerline10k theme
RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v${ZSH_IN_DOCKER_VERSION}/zsh-in-docker.sh)" -- \
-p git \
-p fzf \
-a "source /usr/share/doc/fzf/examples/key-bindings.zsh" \
-a "source /usr/share/doc/fzf/examples/completion.zsh" \
-a "export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
-x
# Install Claude
RUN npm install -g @anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}
================================================
FILE: .devcontainer/Dockerfile.squid
================================================
FROM ubuntu/squid:latest
RUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/*
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"name": "tursodb sandbox",
"dockerComposeFile": ["docker-compose.yml"],
"service": "tursodb",
"remoteUser": "node",
"workspaceFolder": "/workspace",
"waitFor": "postStartCommand",
"customizations": {
"vscode": {
"extensions": [
"anthropic.claude-code",
"eamodio.gitlens",
// Rust
"rust-lang.rust-analyzer",
// Go
"golang.Go",
// Python
"ms-python.python",
"ms-python.vscode-pylance",
// JavaScript / TypeScript
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"ms-vscode.vscode-typescript-next"
],
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.integrated.profiles.linux": {
"bash": {
"path": "bash",
"icon": "terminal-bash"
},
"zsh": {
"path": "zsh"
}
}
}
}
}
}
================================================
FILE: .devcontainer/docker-compose.yml
================================================
version: "3.9"
services:
proxy:
build:
context: .
dockerfile: Dockerfile.squid
networks: [sandbox, egress]
volumes:
- ./squid.conf:/etc/squid/squid.conf:ro
healthcheck:
test: ["CMD", "nc", "-z", "127.0.0.1", "3128"]
interval: 1s
timeout: 5s
retries: 10
start_period: 1s
tursodb:
depends_on:
proxy:
condition: service_healthy
build:
context: .
dockerfile: Dockerfile
args:
TZ: ${TZ:-America/Los_Angeles}
CLAUDE_CODE_VERSION: "latest"
GIT_DELTA_VERSION: "0.18.2"
ZSH_IN_DOCKER_VERSION: "1.2.0"
GO_VERSION: "1.24.10"
RUST_VERSION: "1.88.0"
PYTHON_VERSION: "3.11"
environment:
NODE_OPTIONS: "--max-old-space-size=4096"
CLAUDE_CONFIG_DIR: "/home/node/.claude"
POWERLEVEL9K_DISABLE_GITSTATUS: "true"
HTTP_PROXY: "http://proxy:3128"
HTTPS_PROXY: "http://proxy:3128"
ALL_PROXY: "http://proxy:3128"
NO_PROXY: "localhost,127.0.0.1"
networks: [sandbox]
volumes:
- ..:/workspace:delegated
- claude-code-bashhistory:/commandhistory
- claude-code-config:/home/node/.claude
cap_add:
- NET_ADMIN
- NET_RAW
init: true
tty: true
volumes:
claude-code-bashhistory:
claude-code-config:
networks:
sandbox:
internal: true
egress:
driver: bridge
================================================
FILE: .devcontainer/init-firewall.sh
================================================
#!/bin/bash
set -euo pipefail # Exit on error, undefined vars, and pipeline failures
IFS=$'\n\t' # Stricter word splitting
# 1. Extract Docker DNS info BEFORE any flushing
DOCKER_DNS_RULES=$(iptables-save -t nat | grep "127\.0\.0\.11" || true)
# Flush existing rules and delete existing ipsets
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
ipset destroy allowed-domains 2>/dev/null || true
# 2. Selectively restore ONLY internal Docker DNS resolution
if [ -n "$DOCKER_DNS_RULES" ]; then
echo "Restoring Docker DNS rules..."
iptables -t nat -N DOCKER_OUTPUT 2>/dev/null || true
iptables -t nat -N DOCKER_POSTROUTING 2>/dev/null || true
echo "$DOCKER_DNS_RULES" | xargs -L 1 iptables -t nat
else
echo "No Docker DNS rules to restore"
fi
# First allow DNS and localhost before any restrictions
# Allow outbound DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# Allow inbound DNS responses
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# Allow outbound SSH
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
# Allow inbound SSH responses
iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# Allow localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Create ipset with CIDR support
ipset create allowed-domains hash:net
# Fetch GitHub meta information and aggregate + add their IP ranges
echo "Fetching GitHub IP ranges..."
gh_ranges=$(curl -s https://api.github.com/meta)
if [ -z "$gh_ranges" ]; then
echo "ERROR: Failed to fetch GitHub IP ranges"
exit 1
fi
if ! echo "$gh_ranges" | jq -e '.web and .api and .git' >/dev/null; then
echo "ERROR: GitHub API response missing required fields"
exit 1
fi
echo "Processing GitHub IPs..."
while read -r cidr; do
if [[ ! "$cidr" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$ ]]; then
echo "ERROR: Invalid CIDR range from GitHub meta: $cidr"
exit 1
fi
echo "Adding GitHub range $cidr"
ipset add allowed-domains "$cidr"
done < <(echo "$gh_ranges" | jq -r '(.web + .api + .git)[]' | aggregate -q)
# Resolve and add other allowed domains
for domain in \
"files.pythonhosted.org" \
"static.crates.io" \
"index.crates.io" \
"proxy.golang.org" \
"registry.npmjs.org" \
"api.anthropic.com" \
"sentry.io" \
"statsig.anthropic.com" \
"statsig.com" \
"marketplace.visualstudio.com" \
"vscode.blob.core.windows.net" \
"update.code.visualstudio.com"; do
echo "Resolving $domain..."
ips=$(dig +noall +answer A "$domain" | awk '$4 == "A" {print $5}')
if [ -z "$ips" ]; then
echo "ERROR: Failed to resolve $domain"
exit 1
fi
while read -r ip; do
if [[ ! "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo "ERROR: Invalid IP from DNS for $domain: $ip"
exit 1
fi
echo "Adding $ip for $domain"
ipset add allowed-domains "$ip"
done < <(echo "$ips")
done
# Get host IP from default route
HOST_IP=$(ip route | grep default | cut -d" " -f3)
if [ -z "$HOST_IP" ]; then
echo "ERROR: Failed to detect host IP"
exit 1
fi
HOST_NETWORK=$(echo "$HOST_IP" | sed "s/\.[0-9]*$/.0\/24/")
echo "Host network detected as: $HOST_NETWORK"
# Set up remaining iptables rules
iptables -A INPUT -s "$HOST_NETWORK" -j ACCEPT
iptables -A OUTPUT -d "$HOST_NETWORK" -j ACCEPT
# Set default policies to DROP first
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# First allow established connections for already approved traffic
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Then allow only specific outbound traffic to allowed domains
iptables -A OUTPUT -m set --match-set allowed-domains dst -j ACCEPT
# Explicitly REJECT all other outbound traffic for immediate feedback
iptables -A OUTPUT -j REJECT --reject-with icmp-admin-prohibited
echo "Firewall configuration complete"
echo "Verifying firewall rules..."
if curl --connect-timeout 5 https://example.com >/dev/null 2>&1; then
echo "ERROR: Firewall verification failed - was able to reach https://example.com"
exit 1
else
echo "Firewall verification passed - unable to reach https://example.com as expected"
fi
# Verify GitHub API access
if ! curl --connect-timeout 5 https://api.github.com/zen >/dev/null 2>&1; then
echo "ERROR: Firewall verification failed - unable to reach https://api.github.com"
exit 1
else
echo "Firewall verification passed - able to reach https://api.github.com as expected"
fi
================================================
FILE: .devcontainer/squid.conf
================================================
http_port 3128
# DNS
dns_v4_first on
# Allowed domains
acl allowed dstdomain \
.pythonhosted.org \
.pypi.org \
.crates.io \
.static.rust-lang.org \
.npmjs.org \
.github.com \
.githubusercontent.com \
.go.dev \
.golang.org \
.anthropic.com \
.openai.com \
.sentry.io \
.statsig.com \
.visualstudio.com \
.windows.net
# Allow HTTPS CONNECT only to allowed domains
acl SSL_ports port 443
acl Safe_ports port 80 443
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow allowed
http_access deny all
# Logging
access_log stdio:/var/log/squid/access.log
================================================
FILE: .dockerignore
================================================
*target
.git
turso-test-runner
assets
perf/clickbench
perf/tpc-h
testing/sqlright/build
================================================
FILE: .github/labeler.yml
================================================
simulator:
- changed-files:
- any-glob-to-any-file: "testing/simulator/**/*"
docs:
- changed-files:
- any-glob-to-any-file: "docs/**/*"
extensionlib:
- changed-files:
- any-glob-to-any-file:
["extensions/core/**/*", "macros/src/ext/*", "core/ext/*"]
macros:
- changed-files:
- any-glob-to-any-file: ["macros/**/*"]
extensions-other:
- all:
- changed-files:
- any-glob-to-any-file: "extensions/**/*"
- all-globs-to-all-files: "!extensions/core/**/*"
fuzzing:
- changed-files:
- any-glob-to-any-file: "fuzz/**/*"
perf/benchmarks:
- changed-files:
- any-glob-to-any-file: ["perf/**/*", "core/benches/*"]
go-bindings:
- changed-files:
- any-glob-to-any-file: "bindings/go/**/*"
python-bindings:
- changed-files:
- any-glob-to-any-file: "bindings/python/**/*"
js-bindings:
- changed-files:
- any-glob-to-any-file: "bindings/javascript/**/*"
rust-bindings:
- changed-files:
- any-glob-to-any-file: "bindings/rust/**/*"
java-bindings:
- changed-files:
- any-glob-to-any-file: "bindings/java/**/*"
parser:
- changed-files:
- any-glob-to-any-file: "vendored/sqlite3-parser/*"
cli:
- changed-files:
- any-glob-to-any-file: "cli/**/*"
sqlite3:
- changed-files:
- any-glob-to-any-file: "sqlite3/**/*"
core:
- changed-files:
- any-glob-to-any-file: "core/**/*"
optimizer:
- changed-files:
- any-glob-to-any-file: "core/translate/optimizer/*"
translation/planning:
- changed-files:
- any-glob-to-any-file: "core/translate/*.rs"
io:
- changed-files:
- any-glob-to-any-file: "core/io/*"
mvcc:
- changed-files:
- any-glob-to-any-file: "core/mvcc/**/*"
vdbe:
- changed-files:
- any-glob-to-any-file: "core/vdbe/*"
json:
- changed-files:
- any-glob-to-any-file: "core/json/*"
storage:
- changed-files:
- any-glob-to-any-file: "core/storage/*"
vector:
- changed-files:
- any-glob-to-any-file: "core/vector/*"
turso-serverless:
- changed-files:
- any-glob-to-any-file: 'packages/turso-serverless'
turso-sync:
- changed-files:
- any-glob-to-any-file: 'packages/turso-sync'
antithesis:
- changed-files:
- any-glob-to-any-file:
["testing/antithesis/**/*", "scripts/antithesis/*", "testing/stress/**/*"]
ci-actions:
- changed-files:
- any-glob-to-any-file: ".github/workflows/*.yml"
================================================
FILE: .github/pull_request_template.md
================================================
# NOTICE:
<!--
In order to streamline the contribution process, please check the "allow edits from maintainers" checkbox on your PR. If needed, this allows us to push tweaks to your PR and avoid a potentially lengthy back-and-forth. Your original commits will stay on the branch, and you will keep authorship of those commits.
-->
## Description
<!--
Please include a summary of the changes and the related issue.
-->
## Motivation and context
<!--
Please include relevant motivation and context.
Link relevant issues here.
-->
## Description of AI Usage
<!--
Please disclose how AI was used to help create this PR. For example, you can share prompts,
specific tools, or ways of working that you took advantage of. You can also share whether the
creation of the PR was mainly driven by AI, or whether it was used for assistance.
This is a good way of sharing knowledge to other contributors about how we can work more efficiently with
AI tools. Note that the use of AI is encouraged, but the committer is still fully responsible for understanding
and reviewing the output.
-->
================================================
FILE: .github/shared/install_sqlite/action.yml
================================================
name: "Install SQLite"
description: "Installs sqlite3 CLI for compat tests that invoke it as a subprocess (make test-compat)"
runs:
using: "composite"
steps:
- name: Install SQLite
env:
SQLITE_VERSION: "3510100"
YEAR: 2025
run: |
curl -o /tmp/sqlite.zip https://sqlite.org/$YEAR/sqlite-tools-linux-x64-$SQLITE_VERSION.zip > /dev/null
echo "y" | unzip -j /tmp/sqlite.zip sqlite3 -d /usr/local/bin/
sqlite3 --version
shell: bash
================================================
FILE: .github/shared/setup-mold/action.yml
================================================
name: "Setup mold linker"
description: "Installs mold linker with retry logic to handle transient GitHub download failures"
inputs:
mold-version:
description: "Version of mold to install"
required: false
default: "2.40.4"
runs:
using: "composite"
steps:
- name: Install mold linker
shell: bash
run: |
MOLD_VERSION="${{ inputs.mold-version }}"
ARCH="$(uname -m)"
URL="https://github.com/rui314/mold/releases/download/v${MOLD_VERSION}/mold-${MOLD_VERSION}-${ARCH}-linux.tar.gz"
TMPFILE="/tmp/mold.tar.gz"
MAX_RETRIES=5
for i in $(seq 1 $MAX_RETRIES); do
echo "Downloading mold v${MOLD_VERSION} (attempt $i/$MAX_RETRIES)..."
if curl -fsSL --retry 3 --retry-delay 5 -o "$TMPFILE" "$URL"; then
echo "Download succeeded."
break
fi
if [ "$i" -eq "$MAX_RETRIES" ]; then
echo "::warning::Failed to download mold after $MAX_RETRIES attempts. Building without mold."
exit 0
fi
SLEEP=$((i * 5))
echo "Download failed. Retrying in ${SLEEP}s..."
sleep "$SLEEP"
done
sudo tar -C /usr/local --strip-components=1 --no-overwrite-dir -xzf "$TMPFILE"
rm -f "$TMPFILE"
echo "mold $(mold --version) installed successfully."
================================================
FILE: .github/shared/setup-sccache/action.yml
================================================
name: "Setup sccache"
description: "Installs sccache with graceful fallback if cache service is unavailable"
runs:
using: "composite"
steps:
- name: Install sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Enable sccache
shell: bash
run: |
export SCCACHE_GHA_ENABLED=true
if sccache -s >/dev/null 2>&1; then
echo "SCCACHE_GHA_ENABLED=true" >> "$GITHUB_ENV"
echo "RUSTC_WRAPPER=sccache" >> "$GITHUB_ENV"
echo "sccache is available and configured"
else
echo "::warning::sccache cache service is unavailable, building without cache"
fi
================================================
FILE: .github/turso-bot.yml
================================================
# Turso Bot configuration
# Place this file in your repository at .github/turso-bot.yml
# Enable or disable the bot for this repository
enabled: true
# BetterStack schedule ID to fetch on-call users
scheduleId: "335158"
================================================
FILE: .github/workflows/antithesis-schedule.yml
================================================
name: Antithesis nightly
on:
schedule:
- cron: "0 0 * * 0-5" # Sun-Fri: 4 hour run
- cron: "0 0 * * 6" # Saturday: 24 hour run
jobs:
test:
uses: ./.github/workflows/antithesis.yml
with:
duration: ${{ github.event.schedule == '0 0 * * 6' && 1440 || 240 }}
test_name: ${{ github.event.schedule == '0 0 * * 6' && 'weekend run' || 'scheduled run' }}
secrets: inherit
================================================
FILE: .github/workflows/antithesis.yml
================================================
name: Antithesis experiment
on:
# Allows the workflow to be triggered manually
workflow_dispatch:
inputs:
test_name:
description: "Name to differentiate this run (optional)"
required: false
default: ""
type: string
duration:
description: "Duration in minutes (min 15, default 4 hours)"
required: false
default: 240
type: number
workflow_call:
inputs:
test_name:
required: true
type: string
duration:
required: true
type: number
env:
ANTITHESIS_DOCKER_HOST: us-central1-docker.pkg.dev
ANTITHESIS_DOCKER_REPO: ${{ secrets.ANTITHESIS_DOCKER_REPO }}
ANTITHESIS_REGISTRY_KEY: ${{ secrets.ANTITHESIS_REGISTRY_KEY }}
jobs:
test:
runs-on: blacksmith
timeout-minutes: 30
steps:
- uses: actions/checkout@v3
- name: Publish workload
run: bash ./scripts/antithesis/publish-workload.sh
- name: Publish config
run: bash ./scripts/antithesis/publish-config.sh
- name: Run Antithesis Tests
uses: antithesishq/antithesis-trigger-action@v0.5
with:
notebook_name: limbo
tenant: ${{ secrets.ANTITHESIS_TENANT }}
username: ${{ secrets.ANTITHESIS_USER }}
password: ${{ secrets.ANTITHESIS_PASSWD }}
github_token: ${{ secrets.ANTITHESIS_GITHUB_TOKEN }}
config_image: ${{ secrets.ANTITHESIS_DOCKER_REPO }}/limbo-config:antithesis-latest
images: ${{ secrets.ANTITHESIS_DOCKER_REPO }}/limbo-workload:antithesis-latest
description: >-
Turso - ${{ github.event_name }}
on ${{ github.ref_name }} (${{ github.sha }})
by ${{ github.actor }}${{ inputs.test_name && format(' ({0})', inputs.test_name) || '' }}
email_recipients: ${{ secrets.ANTITHESIS_EMAIL }}
test_name: ${{ inputs.test_name }}
additional_parameters: |-
antithesis.duration=${{ inputs.duration }}
antithesis.source=${{ github.ref_name }}
================================================
FILE: .github/workflows/build-sim.yml
================================================
name: Build and push limbo-sim image
on:
workflow_dispatch:
push:
branches:
- main
# Add permissions needed for OIDC authentication with AWS
permissions:
id-token: write # allow getting OIDC token
contents: read # allow reading repository contents
# Ensure only one build runs at a time. A new push to main will cancel any in-progress build.
concurrency:
group: "build-sim"
cancel-in-progress: true
env:
AWS_REGION: ${{ secrets.LIMBO_SIM_AWS_REGION }}
IAM_ROLE: ${{ secrets.LIMBO_SIM_DEPLOYER_IAM_ROLE }}
ECR_URL: ${{ secrets.LIMBO_SIM_ECR_URL }}
ECR_IMAGE_NAME: ${{ secrets.LIMBO_SIM_IMAGE_NAME }}
GIT_HASH: ${{ github.sha }}
jobs:
deploy:
runs-on: blacksmith
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ env.IAM_ROLE }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
uses: aws-actions/amazon-ecr-login@v2
- name: Build and push limbo-sim docker image
run: |
docker build -f testing/simulator/simulator-docker-runner/Dockerfile.simulator -t ${{ env.ECR_URL }}/${{ env.ECR_IMAGE_NAME }} --build-arg GIT_HASH=${{ env.GIT_HASH }} .
docker push ${{ env.ECR_URL }}/${{ env.ECR_IMAGE_NAME }}
================================================
FILE: .github/workflows/build-sqlancer.yml
================================================
name: Build and push sqlancer-runner image
on:
workflow_dispatch:
push:
branches:
- main
paths:
- "bindings/java/**"
- "scripts/corruption-debug-tools/**"
- "testing/sqlancer/**"
- ".github/workflows/build-sqlancer.yml"
# Add permissions needed for OIDC authentication with AWS
permissions:
id-token: write # allow getting OIDC token
contents: read # allow reading repository contents
# Ensure only one build runs at a time. A new push to main will cancel any in-progress build.
concurrency:
group: "build-sqlancer"
cancel-in-progress: true
env:
AWS_REGION: ${{ secrets.LIMBO_SIM_AWS_REGION }}
IAM_ROLE: ${{ secrets.SQLANCER_DEPLOYER_IAM_ROLE }}
ECR_URL: ${{ secrets.SQLANCER_ECR_URL }}
GIT_HASH: ${{ github.sha }}
jobs:
deploy:
runs-on: blacksmith
timeout-minutes: 45
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ env.IAM_ROLE }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
uses: aws-actions/amazon-ecr-login@v2
- name: Build and push sqlancer-runner docker image
run: |
docker build -f testing/sqlancer/sqlancer-runner/Dockerfile.sqlancer -t ${{ env.ECR_URL }}:latest --build-arg GIT_HASH=${{ env.GIT_HASH }} .
docker push ${{ env.ECR_URL }}:latest
================================================
FILE: .github/workflows/c-compat.yml
================================================
name: C compat Tests
on:
workflow_dispatch:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust(stable)
uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: rui314/setup-mold@v1
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Build Turso C bindings
run: cargo build -p turso_sqlite3 --features capi --locked
- name: Run C compat tests from Rust
working-directory: sqlite3
run: cargo test --locked
- name: Run C compat C tests linking against real SQLite
working-directory: sqlite3/tests
run: |
make clean
make LIBS="-lsqlite3"
./sqlite3-tests
- name: Run C compat C tests linking against Turso
working-directory: sqlite3/tests
run: |
make clean
make LIBS="-L../../target/debug -lturso_sqlite3"
LD_LIBRARY_PATH=../../target/debug ./sqlite3-tests
================================================
FILE: .github/workflows/claude.yml
================================================
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
pull_request_review:
types: [submitted]
issues:
types: [assigned]
jobs:
claude:
concurrency:
group: claude-${{ github.event.issue.number || github.event.pull_request.number }}
cancel-in-progress: false
# Only run when:
# 1. @claude is mentioned in a comment on an issue or PR by an authorized user
# 2. @claude is mentioned in a PR review by an authorized user
# 3. claude[bot] is assigned to an issue
#
# Authorized users: OWNER, MEMBER, COLLABORATOR (prevents abuse by external users)
if: |
(
contains(fromJSON('["issue_comment", "pull_request_review_comment"]'), github.event_name) &&
contains(github.event.comment.body, '@claude') &&
contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
) ||
(
github.event_name == 'pull_request_review' &&
contains(github.event.review.body, '@claude') &&
contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.review.author_association)
) ||
(
github.event_name == 'issues' &&
github.event.assignee.login == 'claude[bot]'
)
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: write
issues: write
pull-requests: write
actions: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Run Claude
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
branch_prefix: "claude/"
additional_permissions: |
actions: read
claude_args: |
--model claude-opus-4-5-20251101
--max-turns 100
--allowedTools "Bash(cargo:*),Bash(git:*),Bash(make:*),Bash(rustfmt:*),Bash(python:*),Edit,Write,Read,Glob,Grep,TodoWrite,Task,WebSearch"
--disallowedTools "Bash(rm -rf *),Bash(sudo *),Bash(curl *),Bash(wget *)"
================================================
FILE: .github/workflows/codspeed.yml
================================================
name: CodSpeed
on:
push:
branches:
- "main"
pull_request:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
permissions:
contents: read
id-token: write
jobs:
benchmarks:
runs-on: ubuntu-24.04
timeout-minutes: 60
# Allow this job to fail without failing the entire CI run
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@1.88.0
- name: Setup mold linker
uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust-codspeed"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Install cargo-codspeed
uses: taiki-e/install-action@v2
with:
tool: cargo-codspeed
- name: Generate graph-queries DBs
run: |
python3 perf/graph-queries/generate_seed.py | sqlite3 perf/graph-queries/graph-queries.db
cp perf/graph-queries/graph-queries.db perf/graph-queries/graph-queries-analyzed.db
sqlite3 perf/graph-queries/graph-queries-analyzed.db "ANALYZE;"
- name: Build benchmarks (excluding TPC-H)
run: make codspeed-build-bench-exclude-tpc-h
- name: Run benchmarks (excluding TPC-H)
uses: CodSpeedHQ/action@v4.5.2
with:
mode: simulation
run: cargo codspeed run
# tpc-h:
# runs-on: ubuntu-latest
# timeout-minutes: 60
# env:
# DB_FILE: "perf/tpc-h/TPC-H.db"
# steps:
# - uses: actions/checkout@v4
# - name: Setup Rust toolchain
# uses: dtolnay/rust-toolchain@stable
# - name: Setup mold linker
# uses: rui314/setup-mold@v1
# - uses: Swatinem/rust-cache@v2
# with:
# prefix-key: "v1-rust-codspeed"
# cache-on-failure: true
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@v0.0.9
# - name: Install cargo-codspeed
# uses: taiki-e/install-action@v2
# with:
# tool: cargo-codspeed
# - name: Cache TPC-H
# id: cache-tpch
# uses: actions/cache@v4
# with:
# path: ${{ env.DB_FILE }}
# key: tpc-h
# - name: Download TPC-H
# if: steps.cache-tpch.outputs.cache-hit != 'true'
# env:
# DB_URL: "https://github.com/lovasoa/TPCH-sqlite/releases/download/v1.0/TPC-H.db"
# run: wget -O $DB_FILE --no-verbose $DB_URL
# - name: Build TPC-H benchmark
# env:
# SCCACHE_GHA_ENABLED: "true"
# RUSTC_WRAPPER: "sccache"
# run: cargo codspeed build --features codspeed --bench tpc_h_benchmark
# - name: Run TPC-H benchmark
# uses: CodSpeedHQ/action@v4.5.2
# with:
# mode: simulation
# run: cargo codspeed run --bench tpc_h_benchmark
================================================
FILE: .github/workflows/dotnet-publish.yml
================================================
name: Dotnet Publish
on:
# Manually trigger the workflow
workflow_dispatch:
env:
working-directory: bindings/dotnet
jobs:
# Build native libraries for each platform
build-natives:
strategy:
matrix:
include:
- os: ubuntu-latest
make-target: build-rust-linux64
artifact-name: linux64
target: x86_64-unknown-linux-gnu
- os: macos-latest
make-target: build-rust-macos64
artifact-name: macos64
target: x86_64-apple-darwin
- os: macos-latest
make-target: build-rust-macosarm64
target: aarch64-apple-darwin
artifact-name: macosarm64
- os: windows-latest
make-target: build-rust-windows64
target: x86_64-pc-windows-msvc
artifact-name: windows64
runs-on: ${{ matrix.os }}
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Add target
run: rustup target add ${{ matrix.target }}
- name: Build rust native library
run: make ${{ matrix.make-target }} RUST_RELEASE_OPT='--profile release-official'
- name: Upload rust native library
uses: actions/upload-artifact@v4
with:
name: native-${{ matrix.artifact-name }}
path: |
${{ env.working-directory }}/rs_compiled/**/turso_dotnet.dll
${{ env.working-directory }}/rs_compiled/**/libturso_dotnet.so
${{ env.working-directory }}/rs_compiled/**/libturso_dotnet.dylib
retention-days: 1
# Create Turso.Raw and Turso nuget packages
publish:
needs: build-natives
runs-on: ubuntu-latest
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install dotnet sdk 9.0
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
- name: Download all native libraries
uses: actions/download-artifact@v4
with:
pattern: native-*
path: ${{ env.working-directory }}/rs_compiled
merge-multiple: true
- name: Build and pack
run:
make pack
# https://learn.microsoft.com/en-us/nuget/nuget-org/publish-a-package
- name: Publish to nuget
if: false # TODO: Get nuget api key and publish packages
run: |
dotnet nuget push ${{ env.working-directory }}/src/Turso.Raw/bin/Release/Turso.Raw.*.nupkg --api-key ... --source https://api.nuget.org/v3/index.json
dotnet nuget push ${{ env.working-directory }}/src/Turso/bin/Release/Turso.*.nupkg --api-key ... --source https://api.nuget.org/v3/index.json
- name: Upload Turso.Raw to artifacts
uses: actions/upload-artifact@v4
with:
name: Turso.Raw
path: ${{ env.working-directory }}/src/Turso.Raw/bin/Release/Turso.Raw.*.nupkg
retention-days: 7
- name: Upload Turso to artifacts
uses: actions/upload-artifact@v4
with:
name: Turso
path: ${{ env.working-directory }}/src/Turso/bin/Release/Turso.*.nupkg
retention-days: 7
================================================
FILE: .github/workflows/dotnet-test.yml
================================================
name: Dotnet Tests
on:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
working-directory: bindings/dotnet
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
test:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust(stable)
uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: rui314/setup-mold@v1
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Install dotnet sdk 9.0
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
- name: Run tests
run: make test
================================================
FILE: .github/workflows/elle.yml
================================================
name: Elle Consistency Check
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:
inputs:
max_steps:
description: "Maximum simulation steps"
required: false
default: "100000"
seed:
description: "Random seed (leave empty for random)"
required: false
default: ""
schedule:
# Run nightly at 3am UTC
- cron: "0 3 * * *"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
jobs:
elle-check:
name: Elle ${{ matrix.elle_model }} (${{ matrix.mvcc && 'MVCC' || 'default' }})
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mvcc: [false, true]
elle_model: [list-append, rw-register]
steps:
- uses: actions/checkout@v4
- uses: useblacksmith/rust-cache@v3
with:
prefix-key: "v1-rust"
- uses: "./.github/shared/setup-sccache"
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "21"
- name: Cache Leiningen
uses: actions/cache@v4
with:
path: |
/tmp/lein
~/.lein
key: lein-${{ runner.os }}
- name: Cache elle-cli
uses: actions/cache@v4
with:
path: /tmp/elle-cli
key: elle-cli-${{ runner.os }}-${{ hashFiles('.github/workflows/elle.yml') }}
- name: Build simulator
run: cargo build -p turso_whopper
- name: Run simulation with Elle
env:
SEED: ${{ github.event.inputs.seed }}
run: |
SEED_ARG=""
if [ -n "$SEED" ]; then
export SEED="$SEED"
fi
MAX_STEPS="${{ github.event.inputs.max_steps }}"
MAX_STEPS="${MAX_STEPS:-100000}"
MVCC_FLAG=""
if [ "${{ matrix.mvcc }}" = "true" ]; then
MVCC_FLAG="--enable-mvcc"
fi
./target/debug/turso_whopper \
--elle ${{ matrix.elle_model }} \
--elle-output elle-history.edn \
--max-steps "$MAX_STEPS" \
$MVCC_FLAG
- name: Setup Leiningen
run: |
if [ ! -x /tmp/lein/lein ]; then
mkdir -p /tmp/lein
curl -sL https://raw.githubusercontent.com/technomancy/leiningen/2.11.2/bin/lein -o /tmp/lein/lein
chmod +x /tmp/lein/lein
/tmp/lein/lein version
fi
- name: Build elle-cli
run: |
if [ ! -d /tmp/elle-cli ]; then
git clone --depth 1 https://github.com/ligurio/elle-cli.git /tmp/elle-cli
fi
cd /tmp/elle-cli
if [ ! -f target/*-standalone.jar ]; then
/tmp/lein/lein uberjar
fi
- name: Install Graphviz
run: sudo apt-get update && sudo apt-get install -y graphviz
- name: Run Elle analysis
run: |
ELLE_JAR=$(ls -t /tmp/elle-cli/target/*-standalone.jar | head -1)
mkdir -p elle-results
echo "Using JAR: $ELLE_JAR"
echo "History file: $(pwd)/elle-history.edn"
echo "History size: $(wc -l < elle-history.edn) events"
echo ""
CONSISTENCY_FLAG="--consistency-models serializable"
if [ "${{ matrix.mvcc }}" = "true" ]; then
CONSISTENCY_FLAG="--consistency-models snapshot-isolation"
fi
java -jar "$ELLE_JAR" --model ${{ matrix.elle_model }} $CONSISTENCY_FLAG --verbose --directory elle-results elle-history.edn
- name: Upload Elle results
uses: actions/upload-artifact@v4
if: always()
with:
name: elle-results-${{ matrix.elle_model }}-${{ matrix.mvcc && 'mvcc' || 'default' }}
path: |
elle-history.edn
elle-results/
retention-days: 30
================================================
FILE: .github/workflows/fuzz.yml
================================================
name: Run long fuzz tests and stress test
on:
workflow_dispatch:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
run-fuzz-tests:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
- name: Set up Python 3.10
uses: useblacksmith/setup-python@v6
with:
python-version: "3.10"
- name: Build
run: cargo build --verbose --locked --all-features
- name: Run fuzz tests
env:
RUST_BACKTRACE: 1
FUZZ_MULTIPLIER: "0.5"
run: cargo nextest run --locked --no-fail-fast -E 'binary(fuzz_tests)' --failure-output=final
run-long-fuzz-tests:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
- name: Set up Python 3.10
uses: useblacksmith/setup-python@v6
with:
python-version: "3.10"
- name: Build
run: cargo build --verbose --locked --all-features
- name: Run ignored long fuzz tests
env:
RUST_BACKTRACE: 1
FUZZ_MULTIPLIER: "0.5"
run: cargo nextest run --locked --no-fail-fast --run-ignored ignored-only -E 'test(/fuzz_long/)' --failure-output=final
simple-stress-test:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Set up Python 3.10
uses: useblacksmith/setup-python@v6
with:
python-version: "3.10"
- name: Build
run: cargo build --verbose --locked --all-features
- name: Run ignored long tests
env:
RUST_BACKTRACE: 1
run: RUSTFLAGS="--cfg shuttle" cargo run -p turso_stress --locked -- --nr-threads 3 --nr-iterations 300
shuttle-stress-test:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust-shuttle"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Run shuttle mvcc tests
env:
RUST_BACKTRACE: "full"
RUSTFLAGS: "--cfg=shuttle"
run: cargo test -p turso_stress --locked --test shuttle_mvcc
- name: Run shuttle stress test
env:
RUST_BACKTRACE: 1
RUSTFLAGS: "--cfg=shuttle"
run: cargo run -p turso_stress --locked -- --nr-threads 2 --nr-iterations 1000
libfuzzer-scalar-func:
# Allow this job to fail without failing the entire CI run
continue-on-error: true
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- name: Setup mold linker
uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust-fuzz"
cache-on-failure: true
- name: Install cargo-fuzz
run: cargo install cargo-fuzz
- name: Run scalar_func fuzzer
run: cargo +nightly fuzz run scalar_func -- -max_total_time=300
================================================
FILE: .github/workflows/go.yml
================================================
## path=../../.github/workflows/go-publish.yml
name: Build & Publish Go Driver
on:
workflow_dispatch:
push:
branches: ["main"]
tags:
- "v*"
pull_request:
branches: ["main"]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: write
env:
# Token with repo access to tursodatabase/turso-go-platform-libs
GH_TOKEN: ${{ secrets.TURSO_GO_PLATFORM_LIBS_TOKEN }}
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
test:
name: Build Rust and run Go tests
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
matrix:
os:
- blacksmith-4vcpu-ubuntu-2404
- macos-latest
- windows-latest
env:
CARGO_TERM_COLOR: always
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
if: runner.os == 'Linux'
uses: rui314/setup-mold@v1
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.24.10"
cache: true
cache-dependency-path: bindings/go/go.sum
- name: Build Rust (debug)
run: cargo build --verbose --locked
# Linux: use LD_LIBRARY_PATH to point to Rust target dir
- name: Run Go tests (Linux)
if: runner.os == 'Linux'
working-directory: bindings/go
env:
LOCAL_SYNC_SERVER: ../../target/debug/tursodb
LD_LIBRARY_PATH: ${{ github.workspace }}/target/debug
run: go test ./... -v
# macOS: use DYLD_LIBRARY_PATH to point to Rust target dir
- name: Run Go tests (macOS)
if: runner.os == 'macOS'
working-directory: bindings/go
env:
LOCAL_SYNC_SERVER: ../../target/debug/tursodb
DYLD_LIBRARY_PATH: ${{ github.workspace }}/target/debug
run: go test ./... -v
# Windows: prepend Rust target dir to PATH so .dll can be found
- name: Run Go tests (Windows)
if: runner.os == 'Windows'
working-directory: bindings/go
shell: pwsh
run: |
$env:PATH = "${{ github.workspace }}\target\debug;$env:PATH"
$env:LOCAL_SYNC_SERVER = "..\..\target\debug\tursodb.exe"
go test ./... -v
publish:
name: Publish Go driver
needs: test
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Ensure tooling (jq, coreutils)
run: |
sudo apt-get update
sudo apt-get install -y jq coreutils
- name: Compute publish variables
id: vars
shell: bash
run: |
set -euo pipefail
EVENT="${{ github.event_name }}"
REF="${{ github.ref }}"
# Determine whether to publish for real:
# - Manual dispatch: publish
# - Tag push (refs/tags/v*): publish
# - Everything else (including PR): dry-run
if [[ "$EVENT" == "workflow_dispatch" ]]; then
DO_PUBLISH="true"
elif [[ "$REF" == refs/tags/v* ]]; then
DO_PUBLISH="true"
else
DO_PUBLISH="false"
fi
if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
# For tag events, github.ref_name is correct
TURSO_REF="${GITHUB_REF_NAME}"
elif [[ -n "${GITHUB_HEAD_REF}" ]]; then
# For PRs, github.head_ref contains the real source branch
TURSO_REF="${GITHUB_HEAD_REF}"
else
# For push events to branches
TURSO_REF="${GITHUB_REF_NAME}"
fi
# Branch to push into this repository
if [[ "$EVENT" == "workflow_dispatch" ]]; then
TARGET_TAG=""
TARGET_BRANCH="go-release-${TURSO_REF}"
elif [[ "$REF" == refs/tags/* ]]; then
TARGET_TAG="${TURSO_REF}"
TARGET_BRANCH="go-release-${TURSO_REF}"
else
TARGET_TAG=""
TARGET_BRANCH="go-release-${TURSO_REF}"
fi
# Generate a unique nonce
NONCE="$(uuidgen 2>/dev/null || true)"
if [[ -z "$NONCE" ]]; then
NONCE="$(date +%s)-$RANDOM-$RANDOM"
fi
echo "do_publish=$DO_PUBLISH" >> "$GITHUB_OUTPUT"
echo "turso_ref=$TURSO_REF" >> "$GITHUB_OUTPUT"
echo "target_branch=$TARGET_BRANCH" >> "$GITHUB_OUTPUT"
echo "target_tag=$TARGET_TAG" >> "$GITHUB_OUTPUT"
echo "nonce=$NONCE" >> "$GITHUB_OUTPUT"
echo "Event: $EVENT"
echo "Ref: $REF"
echo "DO_PUBLISH=$DO_PUBLISH"
echo "TURSO_REF=$TURSO_REF"
echo "TARGET_BRANCH=$TARGET_BRANCH"
echo "TARGET_TAG=$TARGET_TAG"
echo "NONCE=$NONCE"
- name: Dry-run (PRs and non-tag non-manual runs)
if: steps.vars.outputs.do_publish != 'true'
run: |
echo "Dry run: not triggering turso-go-platform-libs and not pushing any commits."
echo "Would have used:"
echo " - turso_ref=${{ steps.vars.outputs.turso_ref }}"
echo " - target_branch=${{ steps.vars.outputs.target_branch }}"
echo " - nonce=${{ steps.vars.outputs.nonce }}"
echo "Exiting."
- name: Check token available for external repo
if: steps.vars.outputs.do_publish == 'true'
shell: bash
run: |
if [[ -z "${GH_TOKEN:-}" ]]; then
echo "TURSO_GO_PLATFORM_LIBS_TOKEN is not set; cannot publish."
exit 1
fi
# Trigger turso-go-platform-libs build+publish workflow
- name: Trigger external prebuilt-libs workflow
if: steps.vars.outputs.do_publish == 'true'
shell: bash
env:
TURSO_REF: ${{ steps.vars.outputs.turso_ref }}
NONCE: ${{ steps.vars.outputs.nonce }}
run: |
set -euo pipefail
echo "Triggering tursodatabase/turso-go-platform-libs build.yml with:"
echo " - turso_ref=$TURSO_REF"
echo " - push_changes=true"
echo " - nonce=$NONCE"
# Use gh to dispatch workflow
gh workflow run build.yml \
-R tursodatabase/turso-go-platform-libs \
-f turso_ref="$TURSO_REF" \
-f push_changes=true \
-f nonce="$NONCE"
# Wait for the external workflow to complete by locating the run that has our nonce in job names
- name: Wait for external workflow completion
if: steps.vars.outputs.do_publish == 'true'
id: wait_external
shell: bash
env:
NONCE: ${{ steps.vars.outputs.nonce }}
run: |
set -euo pipefail
REPO="tursodatabase/turso-go-platform-libs"
WORKFLOW_FILE="build.yml"
echo "Searching for workflow run in $REPO matching nonce=$NONCE"
# Try to find the run that includes the nonce in job names.
FOUND_RUN_ID=""
ATTEMPTS=0
MAX_ATTEMPTS=60 # ~15 minutes (with 15s sleep)
while [[ -z "$FOUND_RUN_ID" && $ATTEMPTS -lt $MAX_ATTEMPTS ]]; do
ATTEMPTS=$((ATTEMPTS+1))
# Fetch recent runs of the workflow
RUN_IDS=$(gh api -H "Accept: application/vnd.github+json" \
repos/$REPO/actions/workflows/$WORKFLOW_FILE/runs \
-q '.workflow_runs[0:30][] | .id' || true)
for RID in $RUN_IDS; do
# List jobs and search for nonce in any job name
if gh api -H "Accept: application/vnd.github+json" repos/$REPO/actions/runs/$RID/jobs -q '.jobs[].name' | grep -q "nonce=${NONCE}"; then
FOUND_RUN_ID="$RID"
break
fi
done
if [[ -z "$FOUND_RUN_ID" ]]; then
echo "Nonce not found yet (attempt $ATTEMPTS/$MAX_ATTEMPTS). Sleeping 15s..."
sleep 15
fi
done
if [[ -z "$FOUND_RUN_ID" ]]; then
echo "Failed to locate external workflow run with nonce=$NONCE"
exit 1
fi
echo "Found external run id: $FOUND_RUN_ID"
echo "run_id=$FOUND_RUN_ID" >> "$GITHUB_OUTPUT"
echo "Waiting for external run to complete..."
while true; do
STATUS=$(gh api repos/$REPO/actions/runs/$FOUND_RUN_ID -q '.status')
CONCLUSION=$(gh api repos/$REPO/actions/runs/$FOUND_RUN_ID -q '.conclusion')
echo "Status: $STATUS, Conclusion: $CONCLUSION"
if [[ "$STATUS" == "completed" ]]; then
if [[ "$CONCLUSION" != "success" ]]; then
echo "External workflow did not succeed. Conclusion: $CONCLUSION"
exit 1
fi
break
fi
sleep 15
done
- name: Determine libs branch name from turso_ref
if: steps.vars.outputs.do_publish == 'true'
id: libs_branch
shell: bash
env:
TURSO_REF: ${{ steps.vars.outputs.turso_ref }}
run: |
set -euo pipefail
BRANCH="turso-branch-$TURSO_REF"
echo "branch=$BRANCH" >> "$GITHUB_OUTPUT"
echo "Resolved libs branch: $BRANCH"
- name: Setup Go (for dependency update)
if: steps.vars.outputs.do_publish == 'true'
uses: actions/setup-go@v5
with:
go-version: "1.24.10"
- name: Create branch
if: steps.vars.outputs.do_publish == 'true'
shell: bash
working-directory: bindings/go
env:
TARGET_TAG: ${{ steps.vars.outputs.target_tag }}
TARGET_BRANCH: ${{ steps.vars.outputs.target_branch }}
NONCE: ${{ steps.vars.outputs.nonce }}
RESOLVED_VERSION: ${{ steps.update_dep.outputs.resolved_version }}
run: |
set -euo pipefail
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# Create/update branch
# If branch exists locally/remote, check it out; otherwise create
if git ls-remote --exit-code --heads origin "$TARGET_BRANCH" >/dev/null 2>&1; then
echo "Branch $TARGET_BRANCH exists on remote — checking it out."
git fetch origin "$TARGET_BRANCH":"$TARGET_BRANCH"
git checkout "$TARGET_BRANCH"
else
echo "Creating new branch $TARGET_BRANCH"
git checkout -b "$TARGET_BRANCH"
fi
- name: Update dependency to freshly built libs
if: steps.vars.outputs.do_publish == 'true'
id: update_dep
working-directory: bindings/go
shell: bash
env:
LIBS_BRANCH: ${{ steps.libs_branch.outputs.branch }}
run: |
set -euo pipefail
echo "Updating github.com/tursodatabase/turso-go-platform-libs to branch: $LIBS_BRANCH"
# Update dependency and tidy
go get "github.com/tursodatabase/turso-go-platform-libs@${LIBS_BRANCH}"
go mod tidy
# Determine the resolved pseudo-version
RESOLVED_VERSION="$(go list -m -json github.com/tursodatabase/turso-go-platform-libs | jq -r .Version)"
echo "resolved_version=$RESOLVED_VERSION" >> "$GITHUB_OUTPUT"
echo "Resolved version: $RESOLVED_VERSION"
echo "Changed files:"
git status --porcelain
- name: Push branch and tag with updated go.mod
if: steps.vars.outputs.do_publish == 'true'
shell: bash
working-directory: bindings/go
env:
TARGET_TAG: ${{ steps.vars.outputs.target_tag }}
TARGET_BRANCH: ${{ steps.vars.outputs.target_branch }}
NONCE: ${{ steps.vars.outputs.nonce }}
RESOLVED_VERSION: ${{ steps.update_dep.outputs.resolved_version }}
run: |
set -euo pipefail
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# Stage changes if any
git add go.mod go.sum || true
if git diff --cached --quiet; then
echo "No changes in go.mod/go.sum to commit; skipping push."
exit 0
fi
COMMIT_MSG="go: update turso-go-platform-libs to ${RESOLVED_VERSION} (nonce: ${NONCE})"
git commit -m "$COMMIT_MSG"
# Push branch
git push --set-upstream origin "$TARGET_BRANCH" --force-with-lease || git push --set-upstream origin "$TARGET_BRANCH"
echo "Pushed branch: $TARGET_BRANCH"
if [[ "$TARGET_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([\-+][0-9A-Za-z\.-]+)?$ ]]; then
# module is in the subdirectory - prepend path to the version tag
git tag "bindings/go/$TARGET_TAG"
git push origin tag "bindings/go/$TARGET_TAG"
fi
================================================
FILE: .github/workflows/java-publish.yml
================================================
name: Publish Java Bindings to Maven Central
on:
# Manually trigger the workflow
workflow_dispatch:
env:
working-directory: bindings/java
jobs:
# Build native libraries for each platform
build-natives:
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
make-target: linux_x86
artifact-name: linux-x86_64
- os: macos-latest
target: x86_64-apple-darwin
make-target: macos_x86
artifact-name: macos-x86_64
- os: macos-latest
target: aarch64-apple-darwin
make-target: macos_arm64
artifact-name: macos-arm64
- os: ubuntu-latest
target: x86_64-pc-windows-gnu
make-target: windows
artifact-name: windows-x86_64
runs-on: ${{ matrix.os }}
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Verify and install Rust target
run: |
echo "Installing target: ${{ matrix.target }}"
rustup target add ${{ matrix.target }}
echo "Installed targets:"
rustup target list --installed
echo "Rust version:"
rustc --version
- name: Install cross-compilation tools (Windows on Linux)
if: matrix.target == 'x86_64-pc-windows-gnu'
run: |
sudo apt-get update
sudo apt-get install -y mingw-w64
- name: Build native library
run: make ${{ matrix.make-target }}
- name: Verify build output
run: |
echo "Build completed for ${{ matrix.target }}"
ls -lah libs/
find libs/ -type f
- name: Upload native library
uses: actions/upload-artifact@v4
with:
name: native-${{ matrix.artifact-name }}
path: ${{ env.working-directory }}/libs/
retention-days: 1
# Publish to Maven Central with all native libraries
publish:
needs: build-natives
runs-on: ubuntu-latest
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '8'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
- name: Install Rust (for test builds)
uses: dtolnay/rust-toolchain@stable
- name: Download all native libraries
uses: actions/download-artifact@v4
with:
pattern: native-*
path: ${{ env.working-directory }}/libs-temp
merge-multiple: true
- name: Organize native libraries
run: |
# Move downloaded artifacts to libs directory
rm -rf libs
mv libs-temp libs
echo "Native libraries collected:"
ls -R libs/
- name: Build test natives
run: make build_test
- name: Run tests
run: ./gradlew test
- name: Publish to Maven Central
env:
MAVEN_UPLOAD_USERNAME: ${{ secrets.MAVEN_UPLOAD_USERNAME }}
MAVEN_UPLOAD_PASSWORD: ${{ secrets.MAVEN_UPLOAD_PASSWORD }}
MAVEN_SIGNING_KEY: ${{ secrets.MAVEN_SIGNING_KEY }}
MAVEN_SIGNING_PASSPHRASE: ${{ secrets.MAVEN_SIGNING_PASSPHRASE }}
run: |
echo "Building, signing, and publishing to Maven Central..."
./gradlew clean publishToMavenCentral --no-daemon --stacktrace
- name: Upload bundle artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: maven-central-bundle
path: ${{ env.working-directory }}/build/maven-central/*.zip
retention-days: 7
================================================
FILE: .github/workflows/java.yml
================================================
name: Java Tests
on:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
working-directory: bindings/java
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
test:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust(stable)
uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: rui314/setup-mold@v1
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Set up JDK
uses: useblacksmith/setup-java@v5
with:
distribution: 'temurin'
java-version: '8'
- name: Run Java tests
run: make test
================================================
FILE: .github/workflows/labeler.yml
================================================
name: "Pull Request Labeler"
on:
- pull_request_target
jobs:
labeler:
timeout-minutes: 30
permissions:
contents: read
issues: write
pull-requests: write
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v4
- uses: actions/labeler@v5
================================================
FILE: .github/workflows/napi.yml
================================================
name: Build & publish @tursodatabase/database
on:
workflow_dispatch:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
env:
DEBUG: napi:*
APP_NAME: turso
MACOSX_DEPLOYMENT_TARGET: "10.13"
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
defaults:
run:
working-directory: bindings/javascript
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
settings:
- host: windows-latest
target: x86_64-pc-windows-msvc
artifact: db-bindings-x86_64-pc-windows-msvc
build: yarn workspace @tursodatabase/database napi-build --target x86_64-pc-windows-msvc
- host: windows-latest
target: x86_64-pc-windows-msvc
artifact: sync-bindings-x86_64-pc-windows-msvc
build: yarn workspace @tursodatabase/sync napi-build --target x86_64-pc-windows-msvc
- host: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact: db-bindings-x86_64-unknown-linux-gnu
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
build: yarn workspace @tursodatabase/database napi-build --target x86_64-unknown-linux-gnu
- host: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact: sync-bindings-x86_64-unknown-linux-gnu
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
build: yarn workspace @tursodatabase/sync napi-build --target x86_64-unknown-linux-gnu
- host: macos-latest
target: aarch64-apple-darwin
artifact: db-bindings-aarch64-apple-darwin
build: yarn workspace @tursodatabase/database napi-build --target aarch64-apple-darwin
- host: macos-latest
target: aarch64-apple-darwin
artifact: sync-bindings-aarch64-apple-darwin
build: yarn workspace @tursodatabase/sync napi-build --target aarch64-apple-darwin
- host: blacksmith-2vcpu-ubuntu-2404-arm
target: aarch64-unknown-linux-gnu
artifact: db-bindings-aarch64-unknown-linux-gnu
build: yarn workspace @tursodatabase/database napi-build --target aarch64-unknown-linux-gnu
- host: blacksmith-2vcpu-ubuntu-2404-arm
target: aarch64-unknown-linux-gnu
artifact: sync-bindings-aarch64-unknown-linux-gnu
build: yarn workspace @tursodatabase/sync napi-build --target aarch64-unknown-linux-gnu
- host: ubuntu-latest
target: wasm32-wasip1-threads
artifact: db-bindings-wasm32-wasip1-threads
setup: |
rustup target add wasm32-wasip1-threads
wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-25/wasi-sdk-25.0-x86_64-linux.tar.gz
tar -xvf wasi-sdk-25.0-x86_64-linux.tar.gz
build: |
export WASI_SDK_PATH="$(pwd)/wasi-sdk-25.0-x86_64-linux"
export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)
export TARGET_CXXFLAGS="--target=wasm32-wasi-threads --sysroot=$(pwd)/wasi-sdk-25.0-x86_64-linux/share/wasi-sysroot -pthread -mllvm -wasm-enable-sjlj -lsetjmp"
export TARGET_CFLAGS="$TARGET_CXXFLAGS"
yarn workspace @tursodatabase/database-common build
yarn workspace @tursodatabase/database-wasm-common build
yarn workspace @tursodatabase/database-wasm build
- host: ubuntu-latest
target: wasm32-wasip1-threads
artifact: sync-bindings-wasm32-wasip1-threads
setup: |
rustup target add wasm32-wasip1-threads
wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-25/wasi-sdk-25.0-x86_64-linux.tar.gz
tar -xvf wasi-sdk-25.0-x86_64-linux.tar.gz
build: |
export WASI_SDK_PATH="$(pwd)/wasi-sdk-25.0-x86_64-linux"
export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)
export TARGET_CXXFLAGS="--target=wasm32-wasi-threads --sysroot=$(pwd)/wasi-sdk-25.0-x86_64-linux/share/wasi-sysroot -pthread -mllvm -wasm-enable-sjlj -lsetjmp"
export TARGET_CFLAGS="$TARGET_CXXFLAGS"
yarn workspace @tursodatabase/database-common build
yarn workspace @tursodatabase/database-wasm-common build
yarn workspace @tursodatabase/sync-common build
yarn workspace @tursodatabase/sync-wasm build
name: ${{ matrix.settings.artifact }} - node@20
runs-on: ${{ matrix.settings.host }}
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v4
if: ${{ !matrix.settings.docker }}
with:
node-version: 20
- name: Install
uses: dtolnay/rust-toolchain@stable
if: ${{ !matrix.settings.docker }}
with:
toolchain: stable
targets: ${{ matrix.settings.target }}
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
.cargo-cache
target/
key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }}-
save-always: true
- uses: mlugg/setup-zig@v2
if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' || matrix.settings.target == 'armv7-unknown-linux-musleabihf' }}
with:
version: 0.13.0
- name: Setup toolchain
run: ${{ matrix.settings.setup }}
if: ${{ matrix.settings.setup }}
shell: bash
- name: Install dependencies
run: yarn install
- name: Build common
run: yarn workspace @tursodatabase/database-common build
- name: Setup node x86
uses: actions/setup-node@v4
if: matrix.settings.target == 'x86_64-pc-windows-msvc'
with:
node-version: 20
architecture: x64
- name: Build in docker
if: ${{ matrix.settings.docker }}
shell: bash
working-directory: .
run: |
docker run --rm --user 0:0 \
-v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db \
-v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache \
-v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index \
-v ${{ github.workspace }}:/build \
-w /build/bindings/javascript \
${{ matrix.settings.docker }} \
bash -c "${{ matrix.settings.build }}"
- name: Build
run: ${{ matrix.settings.build }}
if: ${{ !matrix.settings.docker }}
shell: bash
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.settings.artifact }}
path: |
bindings/javascript/packages/native/turso.*.node
bindings/javascript/packages/wasm/turso.*.wasm
bindings/javascript/sync/packages/native/sync.*.node
bindings/javascript/sync/packages/wasm/sync.*.wasm
if-no-files-found: error
test-db-linux-x64-gnu-binding:
name: Test DB bindings on Linux-x64-gnu - node@${{ matrix.node }}
timeout-minutes: 30
needs:
- build
strategy:
fail-fast: false
matrix:
node:
- "20"
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: useblacksmith/setup-node@v5
with:
node-version: ${{ matrix.node }}
- name: Install dependencies
run: yarn install
- name: Build common
run: yarn workspace @tursodatabase/database-common build
- name: Download all DB artifacts
uses: actions/download-artifact@v4
with:
path: bindings/javascript
merge-multiple: true
pattern: 'db*'
- name: List packages
run: ls -R .
shell: bash
- name: Test bindings
run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim yarn workspace @tursodatabase/database test
test-db-wasm-binding:
name: Test DB bindings on browser@${{ matrix.node }}
timeout-minutes: 30
needs:
- build
strategy:
fail-fast: false
matrix:
node:
- "20"
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: useblacksmith/setup-node@v5
with:
node-version: ${{ matrix.node }}
- name: Install dependencies
run: yarn install
- name: Build common
run: yarn workspace @tursodatabase/database-common build
- name: Build wasm-common
run: yarn workspace @tursodatabase/database-wasm-common build
- name: Install playwright with deps
run: yarn workspace @tursodatabase/database-wasm playwright install --with-deps
- name: Download all DB artifacts
uses: actions/download-artifact@v4
with:
path: bindings/javascript
merge-multiple: true
pattern: 'db*'
- name: List packages
run: ls -R .
shell: bash
- name: Test bindings
run: yarn workspace @tursodatabase/database-wasm test
publish:
name: Publish
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
id-token: write
needs:
- test-db-linux-x64-gnu-binding
- test-db-wasm-binding
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Update npm
run: npm install -g npm@11
- name: Download all DB artifacts
uses: actions/download-artifact@v4
with:
path: bindings/javascript
merge-multiple: true
pattern: 'db*'
- name: Download all sync artifacts
uses: actions/download-artifact@v4
with:
path: bindings/javascript
merge-multiple: true
pattern: 'sync*'
- name: List packages
run: ls -R .
shell: bash
- name: Install dependencies
run: yarn install
- name: Install dependencies
run: yarn tsc-build
- name: Publish
if: "startsWith(github.ref, 'refs/tags/v')"
run: |
if git log -1 --pretty=%B | grep "^Turso [0-9]\+\.[0-9]\+\.[0-9]\+$";
then
npm publish --workspaces --access public --provenance
elif git log -1 --pretty=%B | grep "^Turso [0-9]\+\.[0-9]\+\.[0-9]\+";
then
npm publish --workspaces --access public --provenance --tag next
else
echo "git log structure is unexpected, skip publishing"
npm publish --workspaces --dry-run
fi
- name: Publish (dry-run)
if: "!startsWith(github.ref, 'refs/tags/v')"
run: |
npm pack --workspaces
================================================
FILE: .github/workflows/perf_nightly.yml
================================================
name: Nightly Benchmarks on Nyrkiö Runners (stability)
on:
workflow_dispatch:
branches: ["main", "notmain", "master"]
schedule:
- cron: '24 4 * * *'
push:
# branches: ["main", "notmain", "master"]
branches: ["notmain"]
pull_request:
# branches: ["main", "notmain", "master"]
branches: ["notmain"]
env:
CARGO_TERM_COLOR: never
jobs:
bench:
runs-on: nyrkio_perf_server_4cpu_ubuntu2404
timeout-minutes: 45 # FIXME: make this run faster
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/setup-node@v5
with:
node-version: 20
# cache: 'npm'
# - name: Install dependencies
# run: npm install && npm run build
- name: Generate graph-queries DB
run: |
python3 perf/graph-queries/generate_seed.py | sqlite3 perf/graph-queries/graph-queries.db
cp perf/graph-queries/graph-queries.db perf/graph-queries/graph-queries-analyzed.db
sqlite3 perf/graph-queries/graph-queries-analyzed.db "ANALYZE;"
- name: Bench
run: make bench-exclude-tpc-h 2>&1 | tee output.txt
- name: Analyze benchmark result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: nightly/turso
tool: criterion
output-file-path: output.txt
github-token: ${{ secrets.GITHUB_TOKEN }}
# What to do if a change is immediately detected by Nyrkiö.
# Note that smaller changes are only detected with delay, usually after a change
# persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
# Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
# on pull events isn't compatible with this workflow being required to pass branch protection.
fail-on-alert: false
comment-on-alert: false
comment-always: false
# Nyrkiö configuration
# Get yours from https://nyrkio.com/docs/getting-started
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
# HTTP requests will fail for all non-core contributors that don't have their own token.
# Don't want that to spoil the build, so:
never-fail: true
# Make results and change points public, so that any oss contributor can see them
nyrkio-public: true
# parameters of the algorithm. Note: These are global, so we only set them once and for all.
# Smaller p-value = less change points found. Larger p-value = more, but also more false positives.
nyrkio-settings-pvalue: 0.00001
# Ignore changes smaller than this.
nyrkio-settings-threshold: 0%
clickbench:
runs-on: nyrkio_perf_server_4cpu_ubuntu2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/setup-node@v5
with:
node-version: 20
- name: Clickbench
run: make clickbench
- name: Analyze TURSO result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: nightly/clickbench/turso
tool: time
output-file-path: clickbench-tursodb.txt
github-token: ${{ secrets.GITHUB_TOKEN }}
# What to do if a change is immediately detected by Nyrkiö.
# Note that smaller changes are only detected with delay, usually after a change
# persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
# Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
# on pull events isn't compatible with this workflow being required to pass branch protection.
fail-on-alert: false
comment-on-alert: false
comment-always: false
# Nyrkiö configuration
# Get yours from https://nyrkio.com/docs/getting-started
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
# HTTP requests will fail for all non-core contributors that don't have their own token.
# Don't want that to spoil the build, so:
never-fail: true
# Make results and change points public, so that any oss contributor can see them
nyrkio-public: true
nyrkio-settings-pvalue: 0.00001
nyrkio-settings-threshold: 0%
- name: Analyze SQLITE3 result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: nightly/clickbench/sqlite3
tool: time
output-file-path: clickbench-sqlite3.txt
fail-on-alert: false
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: false
comment-always: false
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
never-fail: true
nyrkio-public: true
nyrkio-settings-pvalue: 0.00001
nyrkio-settings-threshold: 0%
tpc-h-criterion:
runs-on: nyrkio_perf_server_4cpu_ubuntu2404
timeout-minutes: 60
env:
DB_FILE: "perf/tpc-h/TPC-H.db"
steps:
- uses: actions/checkout@v3
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- name: Cache TPC-H
id: cache-primes
uses: useblacksmith/cache@v5
with:
path: ${{ env.DB_FILE }}
key: tpc-h
- name: Download TPC-H
if: steps.cache-primes.outputs.cache-hit != 'true'
env:
DB_URL: "https://github.com/lovasoa/TPCH-sqlite/releases/download/v1.0/TPC-H.db"
run: wget -O $DB_FILE --no-verbose $DB_URL
- name: Bench
run: cargo bench --bench tpc_h_benchmark 2>&1 | tee output.txt
- name: Analyze benchmark result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: nightly/tpc-h
tool: criterion
output-file-path: output.txt
github-token: ${{ secrets.GITHUB_TOKEN }}
# What to do if a change is immediately detected by Nyrkiö.
# Note that smaller changes are only detected with delay, usually after a change
# persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
# Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
# on pull events isn't compatible with this workflow being required to pass branch protection.
fail-on-alert: false
comment-on-alert: false
comment-always: false
# Nyrkiö configuration
# Get yours from https://nyrkio.com/docs/getting-started
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
# HTTP requests will fail for all non-core contributors that don't have their own token.
# Don't want that to spoil the build, so:
never-fail: true
# Make results and change points public, so that any oss contributor can see them
nyrkio-public: true
# parameters of the algorithm. Note: These are global, so we only set them once and for all.
# Smaller p-value = less change points found. Larger p-value = more, but also more false positives.
nyrkio-settings-pvalue: 0.00001
nyrkio-settings-threshold: 0%
================================================
FILE: .github/workflows/publish-crates.yml
================================================
name: Publish Crates
on:
push:
tags:
- '**[0-9]+.[0-9]+.[0-9]+*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: dtolnay/rust-toolchain@stable
- name: Publish crates
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: ./scripts/publish-crates.sh
================================================
FILE: .github/workflows/python.yml
================================================
name: Python
on:
workflow_dispatch:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
working-directory: bindings/python
PIP_DISABLE_PIP_VERSION_CHECK: "true"
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
configure-strategy:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
outputs:
python-versions: ${{ steps.gen-matrix.outputs.python-versions }}
steps:
- id: gen-matrix
run: |
echo "python-versions=[\"3.9\",\"3.13\"]" >> $GITHUB_OUTPUT
test:
needs: configure-strategy
timeout-minutes: 30
strategy:
matrix:
os:
- blacksmith-4vcpu-ubuntu-2404
- macos-latest
- windows-latest
python-version: ${{ fromJson(needs.configure-strategy.outputs.python-versions) }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
if: runner.os == 'Linux'
uses: rui314/setup-mold@v1
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Build Rust (debug)
run: cargo build --verbose --locked
- name: Set up Python ${{ matrix.python-version }}
uses: useblacksmith/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install uv
uses: useblacksmith/setup-uv@v4
with:
enable-cache: true
- name: Install the project
working-directory: ${{ env.working-directory }}
run: uv sync --all-extras --dev --all-packages
- name: Run Pytest
working-directory: ${{ env.working-directory }}
run: uv run pytest tests/test_database.py
- name: Run Pytest (async driver)
working-directory: ${{ env.working-directory }}
run: uv run pytest tests/test_database_aio.py
- name: Run Pytest (sync)
working-directory: ${{ env.working-directory }}
if: runner.os != 'Windows'
env:
LOCAL_SYNC_SERVER: "../../target/debug/tursodb"
run: uv run pytest tests/test_database_sync.py
- name: Run Pytest (sync, async driver)
working-directory: ${{ env.working-directory }}
if: runner.os != 'Windows'
env:
LOCAL_SYNC_SERVER: "../../target/debug/tursodb"
run: uv run pytest tests/test_database_sync_aio.py
- name: Run Pytest (windows, sync)
working-directory: ${{ env.working-directory }}
if: runner.os == 'Windows'
env:
LOCAL_SYNC_SERVER: "..\\..\\target\\debug\\tursodb.exe"
run: uv run pytest tests/test_database_sync.py
- name: Run Pytest (windows, sync, async driver)
working-directory: ${{ env.working-directory }}
if: runner.os == 'Windows'
env:
LOCAL_SYNC_SERVER: "..\\..\\target\\debug\\tursodb.exe"
run: uv run pytest tests/test_database_sync_aio.py
lint:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: useblacksmith/setup-python@v6
- name: Install uv
uses: useblacksmith/setup-uv@v4
with:
enable-cache: true
- name: Install the project
run: uv sync --all-extras --dev --all-packages
- name: Ruff lint
run: uvx ruff check
linux:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
strategy:
matrix:
target: [x86_64]
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/setup-python@v6
with:
python-version: '3.10'
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: ${{ env.working-directory }}
target: ${{ matrix.target }}
args: --profile release-official --out dist --find-interpreter
sccache: 'true'
manylinux: auto
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-linux
path: bindings/python/dist
macos-arm64:
runs-on: macos-latest
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
strategy:
matrix:
target: [aarch64]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
env:
CXX: clang++
CC: clang
with:
python-version: '3.10'
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: ${{ env.working-directory }}
target: ${{ matrix.target }}
args: --profile release-official --out dist --find-interpreter
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-macos-arm64
path: bindings/python/dist
sdist:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- uses: actions/checkout@v3
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
working-directory: ${{ env.working-directory }}
command: sdist
args: --out dist
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: wheels-sdist
path: bindings/python/dist
release:
name: Release
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
if: "startsWith(github.ref, 'refs/tags/')"
needs: [linux, macos-arm64, sdist]
steps:
- uses: actions/download-artifact@v4
with:
path: bindings/python/dist
pattern: wheels-*
merge-multiple: true
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
with:
working-directory: ${{ env.working-directory }}
command: upload
args: --skip-existing dist/*
================================================
FILE: .github/workflows/react-native.yml
================================================
name: Build & publish @tursodatabase/sync-react-native
on:
workflow_dispatch:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
env:
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
working-directory: bindings/react-native
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build-ios:
name: Build iOS libraries
runs-on: macos-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-ios,aarch64-apple-ios-sim
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust-ios"
cache-on-failure: true
- name: Build iOS libraries
run: make ios-build
working-directory: ${{ env.working-directory }}
- name: Package iOS xcframework
run: make package-dylibs
working-directory: ${{ env.working-directory }}
- name: Upload iOS artifacts
uses: actions/upload-artifact@v4
with:
name: ios-libs
path: |
bindings/react-native/libs/ios/
if-no-files-found: error
build-android:
name: Build Android libraries
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android,armv7-linux-androideabi,x86_64-linux-android,i686-linux-android
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust-android"
cache-on-failure: true
- name: Set up Android NDK
uses: android-actions/setup-android@v3
- name: Install cargo-ndk
run: cargo install cargo-ndk
- name: Build Android libraries
run: make android
working-directory: ${{ env.working-directory }}
- name: Upload Android artifacts
uses: actions/upload-artifact@v4
with:
name: android-libs
path: |
bindings/react-native/libs/android/
if-no-files-found: error
build-typescript:
name: Build TypeScript
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm install
working-directory: ${{ env.working-directory }}
- name: Build TypeScript
run: npm run build
working-directory: ${{ env.working-directory }}
- name: Type check
run: npm run typescript
working-directory: ${{ env.working-directory }}
- name: Upload TypeScript build
uses: actions/upload-artifact@v4
with:
name: typescript-build
path: |
bindings/react-native/lib/
if-no-files-found: error
publish:
name: Publish to npm
runs-on: ubuntu-latest
timeout-minutes: 15
needs:
- build-ios
- build-android
- build-typescript
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Update npm
run: npm install -g npm@11
- name: Download iOS artifacts
uses: actions/download-artifact@v4
with:
name: ios-libs
path: bindings/react-native/libs/ios/
- name: Download Android artifacts
uses: actions/download-artifact@v4
with:
name: android-libs
path: bindings/react-native/libs/android/
- name: Download TypeScript build
uses: actions/download-artifact@v4
with:
name: typescript-build
path: bindings/react-native/lib/
- name: Install dependencies
run: npm install
working-directory: ${{ env.working-directory }}
- name: List package contents
run: |
echo "=== Package contents ==="
ls -la
echo "=== libs/ios ==="
ls -laR libs/ios/ || echo "No iOS libs"
echo "=== libs/android ==="
ls -laR libs/android/ || echo "No Android libs"
echo "=== lib (TypeScript) ==="
ls -laR lib/ || echo "No lib"
working-directory: ${{ env.working-directory }}
- name: Publish
if: startsWith(github.ref, 'refs/tags/v')
run: |
if git log -1 --pretty=%B | grep "^Turso [0-9]\+\.[0-9]\+\.[0-9]\+$";
then
npm publish --access public --provenance
elif git log -1 --pretty=%B | grep "^Turso [0-9]\+\.[0-9]\+\.[0-9]\+";
then
npm publish --access public --provenance --tag next
else
echo "git log structure is unexpected, skip publishing"
npm publish --dry-run
fi
working-directory: ${{ env.working-directory }}
- name: Publish (dry-run)
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
run: npm pack
working-directory: ${{ env.working-directory }}
- name: Upload package tarball
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
uses: actions/upload-artifact@v4
with:
name: npm-package
path: bindings/react-native/*.tgz
================================================
FILE: .github/workflows/release.yml
================================================
# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist
#
# Copyright 2022-2024, axodotdev
# SPDX-License-Identifier: MIT or Apache-2.0
#
# CI that:
#
# * checks for a Git Tag that looks like a release
# * builds artifacts with dist (archives, installers, hashes)
# * uploads those artifacts to temporary workflow zip
# * on success, uploads the artifacts to a GitHub Release
#
# Note that the GitHub Release will be created with a generated
# title/body based on your changelogs.
name: Release
permissions:
"contents": "write"
# This task will run whenever you push a git tag that looks like a version
# like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc.
# Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where
# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION
# must be a Cargo-style SemVer Version (must have at least major.minor.patch).
#
# If PACKAGE_NAME is specified, then the announcement will be for that
# package (erroring out if it doesn't have the given version or isn't dist-able).
#
# If PACKAGE_NAME isn't specified, then the announcement will be for all
# (dist-able) packages in the workspace with that version (this mode is
# intended for workspaces with only one dist-able package, or with all dist-able
# packages versioned/released in lockstep).
#
# If you push multiple tags at once, separate instances of this workflow will
# spin up, creating an independent announcement for each one. However, GitHub
# will hard limit this to 3 tags per commit, as it will assume more tags is a
# mistake.
#
# If there's a prerelease-style suffix to the version, then the release(s)
# will be marked as a prerelease.
on:
pull_request:
push:
tags:
- '**[0-9]+.[0-9]+.[0-9]+*'
jobs:
# Run 'dist plan' (or host) to determine what tasks we need to do
plan:
runs-on: "ubuntu-22.04"
outputs:
val: ${{ steps.plan.outputs.manifest }}
tag: ${{ !github.event.pull_request && github.ref_name || '' }}
tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }}
publishing: ${{ !github.event.pull_request }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Install dist
# we specify bash to get pipefail; it guards against the `curl` command
# failing. otherwise `sh` won't catch that `curl` returned non-0
shell: bash
run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.30.2/cargo-dist-installer.sh | sh"
- name: Cache dist
uses: actions/upload-artifact@v4
with:
name: cargo-dist-cache
path: ~/.cargo/bin/dist
# sure would be cool if github gave us proper conditionals...
# so here's a doubly-nested ternary-via-truthiness to try to provide the best possible
# functionality based on whether this is a pull_request, and whether it's from a fork.
# (PRs run on the *source* but secrets are usually on the *target* -- that's *good*
# but also really annoying to build CI around when it needs secrets to work right.)
- id: plan
run: |
dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json
echo "dist ran successfully"
cat plan-dist-manifest.json
echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT"
- name: "Upload dist-manifest.json"
uses: actions/upload-artifact@v4
with:
name: artifacts-plan-dist-manifest
path: plan-dist-manifest.json
# Build and packages all the platform-specific things
build-local-artifacts:
name: build-local-artifacts (${{ join(matrix.targets, ', ') }})
# Let the initial task tell us to not run (currently very blunt)
needs:
- plan
if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }}
strategy:
fail-fast: false
# Target platforms/runners are computed by dist in create-release.
# Each member of the matrix has the following arguments:
#
# - runner: the github runner
# - dist-args: cli flags to pass to dist
# - install-dist: expression to run to install dist on the runner
#
# Typically there will be:
# - 1 "global" task that builds universal installers
# - N "local" tasks that build each platform's binaries and platform-specific installers
matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }}
runs-on: ${{ matrix.runner }}
container: ${{ matrix.container && matrix.container.image || null }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json
permissions:
"attestations": "write"
"contents": "read"
"id-token": "write"
steps:
- name: enable windows longpaths
run: |
git config --global core.longpaths true
- uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Install Rust non-interactively if not already installed
if: ${{ matrix.container }}
run: |
if ! command -v cargo > /dev/null 2>&1; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
fi
- name: Install dist
run: ${{ matrix.install_dist.run }}
# Get the dist-manifest
- name: Fetch local artifacts
uses: actions/download-artifact@v4
with:
pattern: artifacts-*
path: target/distrib/
merge-multiple: true
- name: Install dependencies
run: |
${{ matrix.packages_install }}
- name: Build artifacts
run: |
# Actually do builds and make zips and whatnot
dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json
echo "dist ran successfully"
- name: Attest
uses: actions/attest-build-provenance@v2
with:
subject-path: "target/distrib/*${{ join(matrix.targets, ', ') }}*"
- id: cargo-dist
name: Post-build
# We force bash here just because github makes it really hard to get values up
# to "real" actions without writing to env-vars, and writing to env-vars has
# inconsistent syntax between shell and powershell.
shell: bash
run: |
# Parse out what we just built and upload it to scratch storage
echo "paths<<EOF" >> "$GITHUB_OUTPUT"
dist print-upload-files-from-manifest --manifest dist-manifest.json >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
cp dist-manifest.json "$BUILD_MANIFEST_NAME"
- name: "Upload artifacts"
uses: actions/upload-artifact@v4
with:
name: artifacts-build-local-${{ join(matrix.targets, '_') }}
path: |
${{ steps.cargo-dist.outputs.paths }}
${{ env.BUILD_MANIFEST_NAME }}
# Build and package all the platform-agnostic(ish) things
build-global-artifacts:
needs:
- plan
- build-local-artifacts
runs-on: "ubuntu-22.04"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Install cached dist
uses: actions/download-artifact@v4
with:
name: cargo-dist-cache
path: ~/.cargo/bin/
- run: chmod +x ~/.cargo/bin/dist
# Get all the local artifacts for the global tasks to use (for e.g. checksums)
- name: Fetch local artifacts
uses: actions/download-artifact@v4
with:
pattern: artifacts-*
path: target/distrib/
merge-multiple: true
- id: cargo-dist
shell: bash
run: |
dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json
echo "dist ran successfully"
# Parse out what we just built and upload it to scratch storage
echo "paths<<EOF" >> "$GITHUB_OUTPUT"
jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
cp dist-manifest.json "$BUILD_MANIFEST_NAME"
- name: "Upload artifacts"
uses: actions/upload-artifact@v4
with:
name: artifacts-build-global
path: |
${{ steps.cargo-dist.outputs.paths }}
${{ env.BUILD_MANIFEST_NAME }}
# Determines if we should publish/announce
host:
needs:
- plan
- build-local-artifacts
- build-global-artifacts
# Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine)
if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
runs-on: "ubuntu-22.04"
outputs:
val: ${{ steps.host.outputs.manifest }}
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Install cached dist
uses: actions/download-artifact@v4
with:
name: cargo-dist-cache
path: ~/.cargo/bin/
- run: chmod +x ~/.cargo/bin/dist
# Fetch artifacts from scratch-storage
- name: Fetch artifacts
uses: actions/download-artifact@v4
with:
pattern: artifacts-*
path: target/distrib/
merge-multiple: true
- id: host
shell: bash
run: |
dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json
echo "artifacts uploaded and released successfully"
cat dist-manifest.json
echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT"
- name: "Upload dist-manifest.json"
uses: actions/upload-artifact@v4
with:
# Overwrite the previous copy
name: artifacts-dist-manifest
path: dist-manifest.json
# Create a GitHub Release while uploading all files to it
- name: "Download GitHub Artifacts"
uses: actions/download-artifact@v4
with:
pattern: artifacts-*
path: artifacts
merge-multiple: true
- name: Cleanup
run: |
# Remove the granular manifests
rm -f artifacts/*-dist-manifest.json
- name: Create GitHub Release
env:
PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--prerelease' || '' }}"
ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}"
ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}"
RELEASE_COMMIT: "${{ github.sha }}"
run: |
# Write and read notes from a file to avoid quoting breaking things
echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt
gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" $PRERELEASE_FLAG --title "$ANNOUNCEMENT_TITLE" --notes-file "$RUNNER_TEMP/notes.txt" artifacts/*
announce:
needs:
- plan
- host
# use "always() && ..." to allow us to wait for all publish jobs while
# still allowing individual publish jobs to skip themselves (for prereleases).
# "host" however must run to completion, no skipping allowed!
if: ${{ always() && needs.host.result == 'success' }}
runs-on: "ubuntu-22.04"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
================================================
FILE: .github/workflows/rust.yml
================================================
name: Rust
on:
workflow_dispatch:
push:
branches: ["main"]
pull_request:
branches: ["main"]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
license-check:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@cargo-deny
- run: cargo deny check licenses
cargo-fmt-check:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Check formatting
run: cargo fmt --check
- name: Check formatting (fuzz)
run: cd fuzz && cargo fmt --check
check-bindings:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Install bindgen
run: cargo install --version 0.71.1 bindgen-cli
- name: Regenerate sdk-kit bindings
run: cd sdk-kit && ./bindgen.sh
- name: Regenerate sync/sdk-kit bindings
run: cd sync/sdk-kit && ./bindgen.sh
- name: Check bindings are up to date
run: |
if ! git diff --exit-code sdk-kit/src/bindings.rs sync/sdk-kit/src/bindings.rs; then
echo "Bindings are out of date. Run ./bindgen.sh in sdk-kit/ and sync/sdk-kit/ and commit the changes."
exit 1
fi
build-native:
timeout-minutes: ${{ matrix.os == 'windows-latest' && 120 || 30 }}
strategy:
matrix:
os: [blacksmith-4vcpu-ubuntu-2404, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: llvm-tools-preview
- name: Setup mold linker
if: runner.os == 'Linux'
uses: "./.github/shared/setup-mold"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
- name: Install cargo-llvm-cov
if: runner.os == 'Linux'
uses: taiki-e/install-action@cargo-llvm-cov
- name: Set up Python 3.10
uses: useblacksmith/setup-python@v6
with:
python-version: "3.10"
- name: Build
run: cargo build --verbose --locked --all-features
- name: Test (nextest with coverage)
if: runner.os == 'Linux'
env:
RUST_LOG: ${{ runner.debug && 'turso_core::storage=trace' || '' }}
LOCAL_SYNC_SERVER: "../../target/debug/tursodb"
# for some reason, test(test_busy_snapshot_immediate) hung with coverage - so let's exclude it from the run for now
run: |
cargo llvm-cov nextest --workspace --all-features --locked --no-fail-fast -E 'not binary(fuzz_tests) and not test(test_busy_snapshot_immediate)' --failure-output=final --html --output-dir coverage
echo "::group::Coverage Summary"
cargo llvm-cov report | tee coverage/summary.txt
echo "::endgroup::"
timeout-minutes: 20
- name: Test (nextest)
if: runner.os != 'Linux'
env:
RUST_LOG: ${{ runner.debug && 'turso_core::storage=trace' || '' }}
LOCAL_SYNC_SERVER: "../../target/debug/tursodb"
run: cargo nextest run --workspace --all-features --locked --no-fail-fast -E 'not binary(fuzz_tests)' --failure-output=final
timeout-minutes: 20
- name: Test integrity_check corruption and short reads (no checksum feature because it interferes with the test)
run: cargo nextest run -p core_tester --locked --no-fail-fast -E 'test(integrity_check) | test(short_read)' --failure-output=final
timeout-minutes: 5
- name: Test doctests
env:
LOCAL_SYNC_SERVER: "../../target/debug/tursodb"
run: cargo test --workspace --all-features --doc --locked
- name: Upload coverage report
if: runner.os == 'Linux'
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
retention-days: 14
shuttle-tests:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: "./.github/shared/setup-mold"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust-shuttle"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
- name: Run shuttle tests
run: |
make test-shuttle
# stress-nondeterminism-check:
# runs-on: blacksmith-4vcpu-ubuntu-2404
# timeout-minutes: 15
# steps:
# - uses: actions/checkout@v4
# - uses: dtolnay/rust-toolchain@stable
# - name: Setup mold linker
# uses: "./.github/shared/setup-mold"
# - uses: Swatinem/rust-cache@v2
# with:
# prefix-key: "v1-rust-shuttle"
# cache-on-failure: true
# - uses: "./.github/shared/setup-sccache"
# - name: Check for uncontrolled nondeterminism
# env:
# RUSTFLAGS: "--cfg tokio_unstable --cfg shuttle"
# run: |
# cargo run -p turso_stress -- --check-uncontrolled-nondeterminism
clippy:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- name: Clippy
run: |
cargo clippy --workspace --all-features --all-targets --locked -- --deny=warnings
simulator:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 35
strategy:
matrix:
profile:
- name: default
iterations: 10
args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --io-backend=memory"
- name: InsertHeavy
iterations: 5
args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --profile write_heavy --io-backend=memory"
- name: InsertHeavySpill
iterations: 5
args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --profile write_heavy_spill --io-backend=memory"
- name: Faultless
iterations: 10
args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --profile faultless --io-backend=memory"
- name: IOUring InsertHeavySpill
iterations: 5
args: "--io-backend=io-uring --maximum-tests 1000 --profile=write_heavy_spill"
- name: IOUring Differential
iterations: 10
args: "--io-backend=io-uring --maximum-tests 1000 --differential"
- name: Differential
iterations: 10
args: "--maximum-tests 1000 --differential --io-backend=memory"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: "./.github/shared/setup-mold"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
# Run these with for loops (instead of --loop flag in sim) so that each iteration gets a separate seed -- this produces much easier-to-debug traces when there's a failure since we don't have to potentially
# run 10 iterations of the same seed to get to the failure
- name: Simulator ${{ matrix.profile.name }}
run: |
for i in $(seq 1 ${{ matrix.profile.iterations }}); do
./scripts/run-sim ${{ matrix.profile.args }} || exit 1
done
# TODO: find out why this blows the stack so quickly every time..
# e.g. https://github.com/tursodatabase/turso/actions/runs/22370904813/job/64749257476?pr=5588
# simulator-windows:
# runs-on: windows-latest
# timeout-minutes: 120
# strategy:
# matrix:
# profile:
# - name: default
# iterations: 10
# args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --io-backend=memory"
# - name: InsertHeavy
# iterations: 5
# args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --profile write_heavy --io-backend=memory"
# - name: InsertHeavySpill
# iterations: 5
# args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --profile write_heavy_spill --io-backend=memory"
# - name: Faultless
# iterations: 10
# args: "--maximum-tests 1000 --min-tick 10 --max-tick 50 --profile faultless --io-backend=memory"
# - name: WindowsIOCP InsertHeavySpill
# iterations: 5
# args: "--io-backend=experimental_win_iocp --maximum-tests 1000 --profile=write_heavy_spill"
# - name: WindowsIOCP Differential
# iterations: 10
# args: "--io-backend=experimental_win_iocp --maximum-tests 1000 --differential"
# - name: Differential
# iterations: 10
# args: "--maximum-tests 5000 --differential --io-backend=memory"
# steps:
# - uses: actions/checkout@v4
# - uses: dtolnay/rust-toolchain@stable
# - uses: Swatinem/rust-cache@v2
# with:
# prefix-key: "v1-rust"
# cache-on-failure: true
# - uses: "./.github/shared/setup-sccache"
# - name: Windows Simulator ${{ matrix.profile.name }}
# shell: pwsh
# run: |
# for ($i = 1; $i -le ${{ matrix.profile.iterations }}; $i++) {
# & ./scripts/run-sim.ps1 ${{ matrix.profile.args }}
# if ($LASTEXITCODE -ne 0) {
# exit $LASTEXITCODE
# }
# }
# TODO: for now leave this commented out, as it always fails
# differential-fuzzer:
# runs-on: blacksmith-4vcpu-ubuntu-2404
# timeout-minutes: 30
# steps:
# - uses: actions/checkout@v4
# - uses: dtolnay/rust-toolchain@stable
# - name: Setup mold linker
# uses: rui314/setup-mold@v1
# - uses: Swatinem/rust-cache@v2
# with:
# prefix-key: "v1-rust"
# cache-on-failure: true
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@v0.0.9
# - name: Run differential_fuzzer
# env:
# SCCACHE_GHA_ENABLED: "true"
# RUSTC_WRAPPER: "sccache"
# run: |
# cargo run -p differential-fuzzer -- -n 1000 loop 10
test-limbo:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: "./.github/shared/setup-mold"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Install uv
uses: useblacksmith/setup-uv@v4
with:
enable-cache: true
- name: Set up Python
run: uv python install
- uses: "./.github/shared/install_sqlite"
- name: Test
run: make test
timeout-minutes: 20
concurrent-simulator:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup mold linker
uses: "./.github/shared/setup-mold"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: "./.github/shared/setup-sccache"
- name: Run turso_whopper regression tests
run: cargo test -p turso_whopper --test regression_tests
timeout-minutes: 5
- name: Run turso_whopper
run: |
cargo build -p turso_whopper
for i in $(seq 1 100); do
./target/debug/turso_whopper --reopen-probability 0.001 || exit 1
done
test-sqlite:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: "./.github/shared/install_sqlite"
- name: build SQLite test extensions
run: cargo build --package limbo_sqlite_test_ext --locked
- name: Test
run: SQLITE_EXEC="sqlite3" make test-compat
================================================
FILE: .github/workflows/rust_perf.yml
================================================
name: Rust Benchmarks+Nyrkiö
on:
workflow_dispatch:
push:
branches: ["main", "master", "notmain"]
pull_request:
branches: ["main", "notmain", "master"]
env:
CARGO_TERM_COLOR: never
CARGO_INCREMENTAL: "0"
CARGO_NET_RETRY: 10
jobs:
bench:
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
- bench: benchmark
features: "--features bench"
- bench: mvcc_benchmark
features: "--features bench"
- bench: json_benchmark
features: "--features bench"
- bench: sql_functions
features: "--features bench"
- bench: hash_spill_benchmark
features: "--features bench"
- bench: write_perf_benchmark
features: "--features bench"
- bench: fts_benchmark
features: "--features bench"
- bench: parser_benchmark
features: ""
- bench: graph_queries_benchmark
features: "--features bench"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- name: Generate graph-queries DB
if: matrix.bench == 'graph_queries_benchmark'
run: |
python3 perf/graph-queries/generate_seed.py | sqlite3 perf/graph-queries/graph-queries.db
cp perf/graph-queries/graph-queries.db perf/graph-queries/graph-queries-analyzed.db
sqlite3 perf/graph-queries/graph-queries-analyzed.db "ANALYZE;"
- name: Bench ${{ matrix.bench }}
run: cargo bench --bench ${{ matrix.bench }} ${{ matrix.features }} 2>&1 | tee output.txt
- uses: actions/upload-artifact@v4
with:
name: bench-output-${{ matrix.bench }}
path: output.txt
bench-report:
runs-on: ubuntu-latest
needs: bench
if: always() && !cancelled()
steps:
- uses: actions/download-artifact@v4
with:
pattern: bench-output-*
- name: Merge outputs
run: cat bench-output-*/output.txt > output.txt
- name: Analyze benchmark result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: turso
tool: criterion
output-file-path: output.txt
github-token: ${{ secrets.GITHUB_TOKEN }}
# What to do if a change is immediately detected by Nyrkiö.
# Note that smaller changes are only detected with delay, usually after a change
# persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
# Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
# on pull events isn't compatible with this workflow being required to pass branch protection.
fail-on-alert: false
comment-on-alert: false
comment-always: false
# Nyrkiö configuration
# Get yours from https://nyrkio.com/docs/getting-started
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
# HTTP requests will fail for all non-core contributors that don't have their own token.
# Don't want that to spoil the build, so:
never-fail: true
# Make results and change points public, so that any oss contributor can see them
nyrkio-public: true
# parameters of the algorithm. Note: These are global, so we only set them once and for all.
# Smaller p-value = less change points found. Larger p-value = more, but also more false positives.
nyrkio-settings-pvalue: 0.00001
nyrkio-settings-threshold: 0%
clickbench:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- uses: useblacksmith/setup-node@v5
with:
node-version: 20
- name: Clickbench
run: make clickbench
- name: Analyze TURSO result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: clickbench/turso
tool: time
output-file-path: clickbench-tursodb.txt
github-token: ${{ secrets.GITHUB_TOKEN }}
# What to do if a change is immediately detected by Nyrkiö.
# Note that smaller changes are only detected with delay, usually after a change
# persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
# Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
# on pull events isn't compatible with this workflow being required to pass branch protection.
fail-on-alert: false
comment-on-alert: false
comment-always: false
# Nyrkiö configuration
# Get yours from https://nyrkio.com/docs/getting-started
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
# HTTP requests will fail for all non-core contributors that don't have their own token.
# Don't want that to spoil the build, so:
never-fail: true
# Make results and change points public, so that any oss contributor can see them
nyrkio-public: true
nyrkio-settings-pvalue: 0.00001
nyrkio-settings-threshold: 0%
- name: Analyze SQLITE3 result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: clickbench/sqlite3
tool: time
output-file-path: clickbench-sqlite3.txt
github-token: ${{ secrets.GITHUB_TOKEN }}
fail-on-alert: false
comment-on-alert: false
comment-always: false
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
never-fail: true
nyrkio-public: true
nyrkio-settings-pvalue: 0.00001
nyrkio-settings-threshold: 0%
tpc-h-criterion:
runs-on: ubuntu-latest
timeout-minutes: 60
env:
DB_FILE: "perf/tpc-h/TPC-H.db"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- name: Cache TPC-H
id: cache-primes
uses: useblacksmith/cache@v5
with:
path: ${{ env.DB_FILE }}
key: tpc-h
- name: Download TPC-H
if: steps.cache-primes.outputs.cache-hit != 'true'
env:
DB_URL: "https://github.com/lovasoa/TPCH-sqlite/releases/download/v1.0/TPC-H.db"
run: wget -O $DB_FILE --no-verbose $DB_URL
- name: Bench
run: cargo bench --bench tpc_h_benchmark --locked 2>&1 | tee output.txt
- name: Analyze benchmark result with Nyrkiö
uses: nyrkio/change-detection@HEAD
with:
name: tpc-h
tool: criterion
output-file-path: output.txt
github-token: ${{ secrets.GITHUB_TOKEN }}
# What to do if a change is immediately detected by Nyrkiö.
# Note that smaller changes are only detected with delay, usually after a change
# persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
# Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
# on pull events isn't compatible with this workflow being required to pass branch protection.
fail-on-alert: false
comment-on-alert: false
comment-always: false
# Nyrkiö configuration
# Get yours from https://nyrkio.com/docs/getting-started
nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
# HTTP requests will fail for all non-core contributors that don't have their own token.
# Don't want that to spoil the build, so:
never-fail: true
# Make results and change points public, so that any oss contributor can see them
nyrkio-public: true
# parameters of the algorithm. Note: These are global, so we only set them once and for all.
# Smaller p-value = less change points found. Larger p-value = more, but also more false positives.
nyrkio-settings-pvalue: 0.00001
nyrkio-settings-threshold: 0%
tpc-h:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- name: TPC-H
env:
RUST_LOG: "off"
run: ./perf/tpc-h/benchmark.sh
vfs-bench-compile:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
cache-on-failure: true
- name: Build
run: cargo build --release --verbose --locked
- name: Install uv
uses: useblacksmith/setup-uv@v4
with:
enable-cache: true
- name: Set up Python
run: uv python install
- name: Install the project
run: uv sync --package turso_test
- name: Run benchmark
run: uv run bench-vfs "SELECT 1;" 100
================================================
FILE: .github/workflows/sqltest.yml
================================================
name: SQL Tests
on:
workflow_dispatch:
push:
branches: ["main"]
pull_request:
branches: ["main"]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
jobs:
sqltest-check:
name: Check .sqltest syntax
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/rust-cache@v3
with:
prefix-key: "v1-rust"
- name: Build test runner
run: make -C testing/sqltests build-runner
- name: Check test syntax
run: make -C testing/sqltests check
sqltest-run-cli:
name: Run SQL tests (CLI backend)
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/rust-cache@v3
with:
prefix-key: "v1-rust"
- uses: "./.github/shared/setup-sccache"
- uses: "./.github/shared/install_sqlite"
- name: Build tursodb
run: make -C testing/sqltests build-tursodb
- name: Build test runner
run: make -C testing/sqltests build-runner
- name: Run tests
run: make -C testing/sqltests run-cli CROSS_CHECK_BINARY=sqlite3
- name: Run tests (MVCC)
run: make -C testing/sqltests run-cli MVCC=1
sqltest-run-rust:
name: Run SQL tests (Rust backend)
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/rust-cache@v3
with:
prefix-key: "v1-rust"
- name: Build test runner
run: make -C testing/sqltests build-runner
- name: Run tests
run: make -C testing/sqltests run-rust
- name: Run tests (MVCC)
run: make -C testing/sqltests run-rust MVCC=1
sqltest-run-js:
name: Run SQL tests (JS backend)
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
defaults:
run:
working-directory: bindings/javascript
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/rust-cache@v3
with:
prefix-key: "v1-rust"
- name: Setup node
uses: useblacksmith/setup-node@v5
with:
node-version: 20
- uses: "./.github/shared/setup-sccache"
- name: Install JS dependencies
run: yarn install
- name: Build common package
run: yarn workspace @tursodatabase/database-common build
- name: Build native bindings
run: yarn workspace @tursodatabase/database napi-build --target x86_64-unknown-linux-gnu
- name: Build TypeScript
run: yarn workspace @tursodatabase/database tsc-build
- name: Build test runner
working-directory: testing/sqltests
run: cargo build --release
- name: Run tests
working-directory: testing/sqltests
run: make run-js
- name: Run tests (MVCC)
working-directory: testing/sqltests
run: make run-js MVCC=1
sqltest-sqlite:
name: Run SQL tests (SQLite)
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@v3
- uses: useblacksmith/rust-cache@v3
with:
prefix-key: "v1-rust"
- uses: "./.github/shared/install_sqlite"
- name: Build test runner
run: make -C testing/sqltests build-runner
- name: Run tests against SQLite
run: make -C testing/sqltests test-sqlite
================================================
FILE: .github/workflows/stale.yml
================================================
name: Stale
on:
schedule:
- cron: '0 0 * * *' # Runs every day at midnight UTC
permissions:
issues: read
pull-requests: write
jobs:
stale:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- name: Close stale pull requests
uses: actions/stale@v6
with:
repo-token: ${{ secrets.GH_TOKEN }}
operations-per-run: 1000
ascending: true
stale-pr-message: 'This pull request has been marked as stale due to inactivity. It will be closed in 7 days if no further activity occurs.'
close-pr-message: 'This pull request has been closed due to inactivity. Please feel free to reopen it if you have further updates.'
days-before-issue-stale: 365
days-before-stale: 30
days-before-close: 7
================================================
FILE: .github/workflows/turso-serverless.yml
================================================
name: turso-serverless
on:
workflow_dispatch:
push:
branches: [ main ]
paths:
- 'packages/turso-serverless/**'
- '.github/workflows/turso-serverless.yml'
pull_request:
branches: [ main ]
paths:
- 'packages/turso-serverless/**'
- '.github/workflows/turso-serverless.yml'
env:
working-directory: packages/turso-serverless
jobs:
build:
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 20
defaults:
run:
working-directory: ${{ env.working-directory }}
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: useblacksmith/setup-node@v5
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: ${{ env.working-directory }}/package-lock.json
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
================================================
FILE: .github.json
================================================
{
"penberg": {
"name": "Pekka Enberg",
"email": "penberg@iki.fi"
},
"pereman2": {
"name": "Pere Diaz Bou",
"email": "pere-altea@homail.com"
},
"jussisaurio": {
"name": "Jussi Saurio",
"email": "jussi.saurio@gmail.com"
}
}
================================================
FILE: .gitignore
================================================
/target
/target.noindex
/.idea
/.vscode
/.sqlite3
**/target
*.so
*.dylib
*.ipynb
*.o
*.sqlite
# Python
.mypy_cache/
.pytest_cache/
.ruff_cache/
.venv*/
__pycache__/
.coverage
venv
env
.env
.venv
dist/
.tmp/
*.db
**/*.db-wal
**/*.db-shm
**/*-wal
# perf
**/*/Mobibench
perf/mobibench/plot/results.csv
perf/mobibench/plot/mobibench.pdf
perf/mobibench/plot/uv.lock
# OS
.DS_Store
# Javascript
**/node_modules/
# testing
testing/limbo_output.txt
**/limbo_output.txt
testing/*.log
.bugbase
limbostress.log
simulator.log
**/*.txt
profile.json.gz
simulator-output/
tests/*.sql
stress-go/stress-go
&1
bisected.sql
*.log
*.db-log
settings.local.json
.claude/agents/
.build-hash
# Track empty wals for read only databases
!testing/sqltests/database/*
testing/sqltests/database/integrity_*.db
# For simulator redo
test.sql
# for elle edn transaction history
*.edn
elle-history-results/
custom-types-fuzzer-output/
CLAUDE.md
bindings/python/dev.py
bindings/python/implementation-test/
================================================
FILE: .p
gitextract_3njjk3d9/
├── .cargo/
│ └── config.toml
├── .claude/
│ └── skills/
│ ├── async-io-model/
│ │ └── SKILL.md
│ ├── cdc/
│ │ └── SKILL.md
│ ├── code-quality/
│ │ └── SKILL.md
│ ├── debugging/
│ │ └── SKILL.md
│ ├── differential-fuzzer/
│ │ └── SKILL.md
│ ├── index-knowledge/
│ │ └── SKILL.md
│ ├── mvcc/
│ │ └── SKILL.md
│ ├── pr-workflow/
│ │ └── SKILL.md
│ ├── storage-format/
│ │ └── SKILL.md
│ ├── testing/
│ │ └── SKILL.md
│ └── transaction-correctness/
│ └── SKILL.md
├── .config/
│ └── nextest.toml
├── .devcontainer/
│ ├── Dockerfile
│ ├── Dockerfile.squid
│ ├── devcontainer.json
│ ├── docker-compose.yml
│ ├── init-firewall.sh
│ └── squid.conf
├── .dockerignore
├── .github/
│ ├── labeler.yml
│ ├── pull_request_template.md
│ ├── shared/
│ │ ├── install_sqlite/
│ │ │ └── action.yml
│ │ ├── setup-mold/
│ │ │ └── action.yml
│ │ └── setup-sccache/
│ │ └── action.yml
│ ├── turso-bot.yml
│ └── workflows/
│ ├── antithesis-schedule.yml
│ ├── antithesis.yml
│ ├── build-sim.yml
│ ├── build-sqlancer.yml
│ ├── c-compat.yml
│ ├── claude.yml
│ ├── codspeed.yml
│ ├── dotnet-publish.yml
│ ├── dotnet-test.yml
│ ├── elle.yml
│ ├── fuzz.yml
│ ├── go.yml
│ ├── java-publish.yml
│ ├── java.yml
│ ├── labeler.yml
│ ├── napi.yml
│ ├── perf_nightly.yml
│ ├── publish-crates.yml
│ ├── python.yml
│ ├── react-native.yml
│ ├── release.yml
│ ├── rust.yml
│ ├── rust_perf.yml
│ ├── sqltest.yml
│ ├── stale.yml
│ └── turso-serverless.yml
├── .github.json
├── .gitignore
├── .python-version
├── AGENTS.md
├── CHANGELOG.md
├── COMPAT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── Dockerfile.antithesis
├── Dockerfile.cli
├── LICENSE.md
├── Makefile
├── NOTICE.md
├── PERF.md
├── Pipfile
├── README.md
├── bindings/
│ ├── dotnet/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── Readme.md
│ │ ├── Turso.slnx
│ │ ├── rs_src/
│ │ │ └── lib.rs
│ │ └── src/
│ │ ├── Benchmarks/
│ │ │ ├── Benchmarks.cs
│ │ │ ├── Benchmarks.csproj
│ │ │ └── Program.cs
│ │ ├── Turso/
│ │ │ ├── Turso.csproj
│ │ │ ├── TursoCommand.cs
│ │ │ ├── TursoConnection.cs
│ │ │ ├── TursoConnectionOptions.cs
│ │ │ ├── TursoDataReader.cs
│ │ │ ├── TursoParameter.cs
│ │ │ ├── TursoParameterCollection.cs
│ │ │ └── TursoTransaction.cs
│ │ ├── Turso.Raw/
│ │ │ ├── Data/
│ │ │ │ ├── TursoNativeArray.cs
│ │ │ │ ├── TursoNativeRowValueUnion.cs
│ │ │ │ └── TursoNativeValue.cs
│ │ │ ├── Public/
│ │ │ │ ├── Handles/
│ │ │ │ │ ├── TursoDatabaseHandle.cs
│ │ │ │ │ └── TursoStatementHandle.cs
│ │ │ │ ├── TursoBindings.cs
│ │ │ │ ├── TursoException.cs
│ │ │ │ └── Value/
│ │ │ │ ├── TursoEncryptionCipher.cs
│ │ │ │ ├── TursoValue.cs
│ │ │ │ └── TursoValueType.cs
│ │ │ ├── Turso.Raw.csproj
│ │ │ └── TursoInterop.cs
│ │ └── Turso.Tests/
│ │ ├── Turso.Tests.csproj
│ │ └── TursoTests.cs
│ ├── go/
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── VERSION
│ │ ├── bindings.go
│ │ ├── bindings_db.go
│ │ ├── bindings_db_test.go
│ │ ├── bindings_sync.go
│ │ ├── driver_db.go
│ │ ├── driver_db_test.go
│ │ ├── driver_sync.go
│ │ ├── driver_sync_test.go
│ │ ├── go-bindings-db-tests.mdx
│ │ ├── go-bindings-db.mdx
│ │ ├── go-bindings-sync.mdx
│ │ ├── go-driver-db.mdx
│ │ ├── go-driver-sync.mdx
│ │ ├── go.mod
│ │ └── go.sum
│ ├── java/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .sdkmanrc
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── build.gradle.kts
│ │ ├── example/
│ │ │ ├── .gitignore
│ │ │ ├── build.gradle.kts
│ │ │ ├── gradle/
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ ├── settings.gradle.kts
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── tech.turso/
│ │ │ └── Main.java
│ │ ├── gradle/
│ │ │ ├── publish.gradle.kts
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── rs_src/
│ │ │ ├── errors.rs
│ │ │ ├── lib.rs
│ │ │ ├── turso_connection.rs
│ │ │ ├── turso_db.rs
│ │ │ ├── turso_statement.rs
│ │ │ └── utils.rs
│ │ ├── settings.gradle.kts
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ ├── examples/
│ │ │ │ │ └── EncryptionExample.java
│ │ │ │ └── tech/
│ │ │ │ └── turso/
│ │ │ │ ├── JDBC.java
│ │ │ │ ├── TursoConfig.java
│ │ │ │ ├── TursoDataSource.java
│ │ │ │ ├── TursoErrorCode.java
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── NativeInvocation.java
│ │ │ │ │ ├── Nullable.java
│ │ │ │ │ ├── SkipNullableCheck.java
│ │ │ │ │ └── VisibleForTesting.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── SqliteCode.java
│ │ │ │ │ ├── TursoConnection.java
│ │ │ │ │ ├── TursoDB.java
│ │ │ │ │ ├── TursoEncryptionCipher.java
│ │ │ │ │ ├── TursoPropertiesHolder.java
│ │ │ │ │ ├── TursoResultSet.java
│ │ │ │ │ ├── TursoStatement.java
│ │ │ │ │ ├── TursoStepResult.java
│ │ │ │ │ └── TursoTransactionMode.java
│ │ │ │ ├── exceptions/
│ │ │ │ │ └── TursoException.java
│ │ │ │ ├── jdbc4/
│ │ │ │ │ ├── JDBC4Connection.java
│ │ │ │ │ ├── JDBC4DatabaseMetaData.java
│ │ │ │ │ ├── JDBC4PreparedStatement.java
│ │ │ │ │ ├── JDBC4ResultSet.java
│ │ │ │ │ └── JDBC4Statement.java
│ │ │ │ └── utils/
│ │ │ │ ├── ByteArrayUtils.java
│ │ │ │ ├── Logger.java
│ │ │ │ ├── LoggerFactory.java
│ │ │ │ └── TursoExceptionUtils.java
│ │ │ └── resources/
│ │ │ ├── META-INF/
│ │ │ │ └── services/
│ │ │ │ └── java.sql.Driver
│ │ │ └── turso-jdbc.properties
│ │ └── test/
│ │ ├── java/
│ │ │ └── tech/
│ │ │ └── turso/
│ │ │ ├── IntegrationTest.java
│ │ │ ├── JDBCTest.java
│ │ │ ├── TestUtils.java
│ │ │ ├── core/
│ │ │ │ ├── TursoDBTest.java
│ │ │ │ └── TursoStatementTest.java
│ │ │ └── jdbc4/
│ │ │ ├── JDBC4ConnectionTest.java
│ │ │ ├── JDBC4DatabaseMetaDataTest.java
│ │ │ ├── JDBC4PreparedStatementTest.java
│ │ │ ├── JDBC4ResultSetTest.java
│ │ │ ├── JDBC4StatementTest.java
│ │ │ └── TransactionTest.java
│ │ └── resources/
│ │ └── turso/
│ │ └── CACHEDIR.TAG
│ ├── javascript/
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── .yarn/
│ │ │ └── releases/
│ │ │ └── yarn-4.9.2.cjs
│ │ ├── .yarnrc.yml
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── build.rs
│ │ ├── docs/
│ │ │ ├── API.md
│ │ │ └── CONTRIBUTING.md
│ │ ├── package.json
│ │ ├── packages/
│ │ │ ├── common/
│ │ │ │ ├── README.md
│ │ │ │ ├── async-lock.ts
│ │ │ │ ├── bind.ts
│ │ │ │ ├── compat.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── promise.ts
│ │ │ │ ├── sqlite-error.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ └── types.ts
│ │ │ ├── native/
│ │ │ │ ├── README.md
│ │ │ │ ├── compat.test.ts
│ │ │ │ ├── compat.ts
│ │ │ │ ├── index.d.ts
│ │ │ │ ├── index.js
│ │ │ │ ├── package.json
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── promise.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ └── turso-sql-runner-split.test.ts
│ │ │ ├── wasm/
│ │ │ │ ├── README.md
│ │ │ │ ├── index-bundle.ts
│ │ │ │ ├── index-default.ts
│ │ │ │ ├── index-turbopack-hack.ts
│ │ │ │ ├── index-vite-dev-hack.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── promise-bundle.ts
│ │ │ │ ├── promise-default.ts
│ │ │ │ ├── promise-turbopack-hack.ts
│ │ │ │ ├── promise-vite-dev-hack.ts
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ ├── vite
│ │ │ │ ├── vite.config.js
│ │ │ │ ├── vitest.config.ts
│ │ │ │ ├── wasm-inline.ts
│ │ │ │ └── worker.ts
│ │ │ └── wasm-common/
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ ├── package.json
│ │ │ └── tsconfig.json
│ │ ├── perf/
│ │ │ ├── package.json
│ │ │ ├── perf-better-sqlite3.js
│ │ │ └── perf-turso.js
│ │ ├── replace.sh
│ │ ├── scripts/
│ │ │ └── inline-wasm-base64.js
│ │ ├── src/
│ │ │ ├── browser.rs
│ │ │ └── lib.rs
│ │ ├── sync/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── build.rs
│ │ │ ├── packages/
│ │ │ │ ├── common/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── remote-write-statement.ts
│ │ │ │ │ ├── remote-writer.ts
│ │ │ │ │ ├── run.ts
│ │ │ │ │ ├── tsconfig.json
│ │ │ │ │ └── types.ts
│ │ │ │ ├── native/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.d.ts
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── promise.test.ts
│ │ │ │ │ ├── promise.ts
│ │ │ │ │ ├── remote-write.test.ts
│ │ │ │ │ └── tsconfig.json
│ │ │ │ └── wasm/
│ │ │ │ ├── .promise.test.ts.swp
│ │ │ │ ├── README.md
│ │ │ │ ├── cp-entrypoint.sh
│ │ │ │ ├── index-bundle.ts
│ │ │ │ ├── index-default.ts
│ │ │ │ ├── index-turbopack-hack.ts
│ │ │ │ ├── index-vite-dev-hack.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── promise-bundle.ts
│ │ │ │ ├── promise-default.ts
│ │ │ │ ├── promise-turbopack-hack.ts
│ │ │ │ ├── promise-vite-dev-hack.ts
│ │ │ │ ├── promise.test.ts
│ │ │ │ ├── tsconfig.json
│ │ │ │ ├── vite.config.js
│ │ │ │ ├── vitest.config.ts
│ │ │ │ ├── wasm-inline.ts
│ │ │ │ └── worker.ts
│ │ │ └── src/
│ │ │ ├── generator.rs
│ │ │ ├── js_protocol_io.rs
│ │ │ └── lib.rs
│ │ ├── turso-sql-runner.mjs
│ │ └── turso-sql-split.mjs
│ ├── python/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── SQLALCHEMY_DIALECT.md
│ │ ├── build.rs
│ │ ├── py-bindings-db-aio.mdx
│ │ ├── py-bindings-db.mdx
│ │ ├── py-bindings-sync-aio.mdx
│ │ ├── py-bindings-sync.mdx
│ │ ├── py-bindings-tests-aio.mdx
│ │ ├── py-bindings-tests.mdx
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── lib.rs
│ │ │ ├── turso.rs
│ │ │ └── turso_sync.rs
│ │ ├── tests/
│ │ │ ├── __init__.py
│ │ │ ├── test_database.py
│ │ │ ├── test_database_aio.py
│ │ │ ├── test_database_sync.py
│ │ │ ├── test_database_sync_aio.py
│ │ │ ├── test_sqlalchemy.py
│ │ │ └── utils.py
│ │ └── turso/
│ │ ├── __init__.py
│ │ ├── aio/
│ │ │ ├── __init__.py
│ │ │ └── sync/
│ │ │ └── __init__.py
│ │ ├── lib.py
│ │ ├── lib_aio.py
│ │ ├── lib_sync.py
│ │ ├── lib_sync_aio.py
│ │ ├── py.typed
│ │ ├── sqlalchemy/
│ │ │ ├── __init__.py
│ │ │ └── dialect.py
│ │ ├── sync/
│ │ │ └── __init__.py
│ │ └── worker.py
│ ├── react-native/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── build.gradle
│ │ │ ├── cpp-adapter.cpp
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── turso/
│ │ │ └── sync/
│ │ │ └── reactnative/
│ │ │ ├── TursoBridge.java
│ │ │ ├── TursoModule.java
│ │ │ └── TursoPackage.java
│ │ ├── cpp/
│ │ │ ├── TursoConnectionHostObject.cpp
│ │ │ ├── TursoConnectionHostObject.h
│ │ │ ├── TursoDatabaseHostObject.cpp
│ │ │ ├── TursoDatabaseHostObject.h
│ │ │ ├── TursoHostObject.cpp
│ │ │ ├── TursoHostObject.h
│ │ │ ├── TursoStatementHostObject.cpp
│ │ │ ├── TursoStatementHostObject.h
│ │ │ ├── TursoSyncChangesHostObject.cpp
│ │ │ ├── TursoSyncChangesHostObject.h
│ │ │ ├── TursoSyncDatabaseHostObject.cpp
│ │ │ ├── TursoSyncDatabaseHostObject.h
│ │ │ ├── TursoSyncIoItemHostObject.cpp
│ │ │ ├── TursoSyncIoItemHostObject.h
│ │ │ ├── TursoSyncOperationHostObject.cpp
│ │ │ └── TursoSyncOperationHostObject.h
│ │ ├── ios/
│ │ │ ├── TursoModule.h
│ │ │ └── TursoModule.mm
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── AsyncLock.ts
│ │ │ ├── Database.ts
│ │ │ ├── Statement.ts
│ │ │ ├── index.ts
│ │ │ ├── internal/
│ │ │ │ ├── asyncOperation.ts
│ │ │ │ └── ioProcessor.ts
│ │ │ └── types.ts
│ │ ├── templates/
│ │ │ └── turso-sync-sdk-kit.xcframework/
│ │ │ ├── Info.plist
│ │ │ ├── ios-arm64/
│ │ │ │ └── turso-sync-sdk-kit.framework/
│ │ │ │ └── Info.plist
│ │ │ └── ios-arm64-simulator/
│ │ │ └── turso-sync-sdk-kit.framework/
│ │ │ └── Info.plist
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── turso-sync-react-native.podspec
│ ├── rust/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── examples/
│ │ │ ├── README.md
│ │ │ ├── concurrent_writes.rs
│ │ │ ├── example.rs
│ │ │ ├── example_struct.rs
│ │ │ └── sync_example.rs
│ │ ├── rust-driver-sync.mdx
│ │ ├── src/
│ │ │ ├── connection.rs
│ │ │ ├── lib.rs
│ │ │ ├── params.rs
│ │ │ ├── rows.rs
│ │ │ ├── sync.rs
│ │ │ ├── transaction.rs
│ │ │ └── value.rs
│ │ └── tests/
│ │ ├── integration_tests.rs
│ │ └── test_deadlock_join.rs
│ └── tcl/
│ ├── Makefile
│ ├── test_probes.tcl
│ └── turso_tcl.c
├── cli/
│ ├── Cargo.toml
│ ├── SQL.sublime-syntax
│ ├── app.rs
│ ├── build.rs
│ ├── commands/
│ │ ├── args.rs
│ │ ├── import.rs
│ │ └── mod.rs
│ ├── config/
│ │ ├── mod.rs
│ │ ├── palette.rs
│ │ └── terminal.rs
│ ├── docs/
│ │ ├── config.md
│ │ └── internal/
│ │ └── commands.md
│ ├── helper.rs
│ ├── input.rs
│ ├── main.rs
│ ├── manual.rs
│ ├── manuals/
│ │ ├── cdc.md
│ │ ├── custom-types.md
│ │ ├── encryption.md
│ │ ├── index.md
│ │ ├── materialized-views.md
│ │ ├── mcp.md
│ │ └── vector.md
│ ├── mcp_server.rs
│ ├── mvcc_repl.rs
│ ├── opcodes_dictionary.rs
│ ├── read_state_machine.rs
│ ├── sync_server.mdx
│ ├── sync_server.rs
│ └── tests/
│ ├── non_interactive_exit_code.rs
│ └── parameter_bindings.rs
├── core/
│ ├── Cargo.toml
│ ├── assert.rs
│ ├── benches/
│ │ ├── benchmark.rs
│ │ ├── fts_benchmark.rs
│ │ ├── graph_queries_benchmark.rs
│ │ ├── hash_spill_benchmark.rs
│ │ ├── json_benchmark.rs
│ │ ├── mvcc_benchmark.rs
│ │ ├── sql_functions/
│ │ │ ├── datetime.rs
│ │ │ ├── likeop.rs
│ │ │ ├── main.rs
│ │ │ ├── numeric.rs
│ │ │ └── value.rs
│ │ ├── tpc_h_benchmark.rs
│ │ └── write_perf_benchmark.rs
│ ├── btree_dump.rs
│ ├── build.rs
│ ├── busy.rs
│ ├── connection.rs
│ ├── dbpage.rs
│ ├── error.rs
│ ├── ext/
│ │ ├── dynamic.rs
│ │ ├── mod.rs
│ │ └── vtab_xconnect.rs
│ ├── fast_lock.rs
│ ├── function.rs
│ ├── functions/
│ │ ├── datetime.rs
│ │ ├── mod.rs
│ │ └── printf.rs
│ ├── incremental/
│ │ ├── aggregate_operator.rs
│ │ ├── compiler.rs
│ │ ├── cursor.rs
│ │ ├── dbsp.rs
│ │ ├── expr_compiler.rs
│ │ ├── filter_operator.rs
│ │ ├── input_operator.rs
│ │ ├── join_operator.rs
│ │ ├── merge_operator.rs
│ │ ├── mod.rs
│ │ ├── operator.rs
│ │ ├── persistence.rs
│ │ ├── project_operator.rs
│ │ └── view.rs
│ ├── index_method/
│ │ ├── backing_btree.rs
│ │ ├── fts.rs
│ │ ├── mod.rs
│ │ └── toy_vector_sparse_ivf.rs
│ ├── info.rs
│ ├── io/
│ │ ├── clock.rs
│ │ ├── common.rs
│ │ ├── completions.rs
│ │ ├── generic.rs
│ │ ├── io_uring.rs
│ │ ├── memory.rs
│ │ ├── mod.rs
│ │ ├── unix.rs
│ │ ├── vfs.rs
│ │ ├── win_iocp.rs
│ │ └── windows.rs
│ ├── json/
│ │ ├── cache.rs
│ │ ├── error.rs
│ │ ├── jsonb.rs
│ │ ├── mod.rs
│ │ ├── ops.rs
│ │ ├── path.rs
│ │ └── vtab.rs
│ ├── lib.rs
│ ├── mvcc/
│ │ ├── clock.rs
│ │ ├── cursor.rs
│ │ ├── database/
│ │ │ ├── checkpoint_state_machine.rs
│ │ │ ├── hermitage_tests.rs
│ │ │ ├── mod.rs
│ │ │ └── tests.rs
│ │ ├── mod.rs
│ │ └── persistent_storage/
│ │ ├── logical_log.rs
│ │ └── mod.rs
│ ├── numeric/
│ │ ├── decimal.rs
│ │ ├── mod.rs
│ │ └── nonnan.rs
│ ├── parameters.rs
│ ├── pragma.rs
│ ├── pseudo.rs
│ ├── regexp.rs
│ ├── schema.rs
│ ├── series.rs
│ ├── state_machine.rs
│ ├── statement.rs
│ ├── stats.rs
│ ├── storage/
│ │ ├── btree.rs
│ │ ├── buffer_pool.rs
│ │ ├── checksum.rs
│ │ ├── database.rs
│ │ ├── encryption.rs
│ │ ├── journal_mode.rs
│ │ ├── mod.rs
│ │ ├── page_cache.rs
│ │ ├── pager.rs
│ │ ├── slot_bitmap.rs
│ │ ├── sqlite3_ondisk.rs
│ │ ├── state_machines.rs
│ │ ├── subjournal.rs
│ │ └── wal.rs
│ ├── sync.rs
│ ├── thread.rs
│ ├── time/
│ │ ├── internal.rs
│ │ └── mod.rs
│ ├── translate/
│ │ ├── aggregation.rs
│ │ ├── alter.rs
│ │ ├── analyze.rs
│ │ ├── attach.rs
│ │ ├── collate.rs
│ │ ├── compound_select.rs
│ │ ├── delete.rs
│ │ ├── display.rs
│ │ ├── emitter/
│ │ │ ├── delete.rs
│ │ │ ├── mod.rs
│ │ │ ├── select.rs
│ │ │ └── update.rs
│ │ ├── expr.rs
│ │ ├── expression_index.rs
│ │ ├── fkeys.rs
│ │ ├── group_by.rs
│ │ ├── index.rs
│ │ ├── insert.rs
│ │ ├── integrity_check.rs
│ │ ├── logical.rs
│ │ ├── main_loop/
│ │ │ ├── body.rs
│ │ │ ├── close.rs
│ │ │ ├── conditions.rs
│ │ │ ├── hash.rs
│ │ │ ├── in_seek.rs
│ │ │ ├── init.rs
│ │ │ ├── mod.rs
│ │ │ ├── multi_index.rs
│ │ │ ├── open.rs
│ │ │ └── seek.rs
│ │ ├── mod.rs
│ │ ├── optimizer/
│ │ │ ├── OPTIMIZER.md
│ │ │ ├── access_method.rs
│ │ │ ├── constraints.rs
│ │ │ ├── cost.rs
│ │ │ ├── cost_params.rs
│ │ │ ├── join.rs
│ │ │ ├── lift_common_subexpressions.rs
│ │ │ ├── mod.rs
│ │ │ ├── multi_index.rs
│ │ │ ├── order.rs
│ │ │ └── unnest.rs
│ │ ├── order_by.rs
│ │ ├── plan.rs
│ │ ├── planner.rs
│ │ ├── pragma.rs
│ │ ├── result_row.rs
│ │ ├── rollback.rs
│ │ ├── schema.rs
│ │ ├── select.rs
│ │ ├── stmt_journal.rs
│ │ ├── subquery.rs
│ │ ├── transaction.rs
│ │ ├── trigger.rs
│ │ ├── trigger_exec.rs
│ │ ├── update.rs
│ │ ├── upsert.rs
│ │ ├── vacuum.rs
│ │ ├── values.rs
│ │ ├── view.rs
│ │ └── window.rs
│ ├── turso_types_vtab.rs
│ ├── types.rs
│ ├── util.rs
│ ├── uuid.rs
│ ├── vdbe/
│ │ ├── affinity.rs
│ │ ├── array.rs
│ │ ├── bloom_filter.rs
│ │ ├── builder.rs
│ │ ├── execute.rs
│ │ ├── explain.rs
│ │ ├── hash_table.rs
│ │ ├── insn.rs
│ │ ├── metrics.rs
│ │ ├── mod.rs
│ │ ├── rowset.rs
│ │ ├── sorter.rs
│ │ └── value.rs
│ ├── vector/
│ │ ├── mod.rs
│ │ ├── operations/
│ │ │ ├── concat.rs
│ │ │ ├── convert.rs
│ │ │ ├── distance_cos.rs
│ │ │ ├── distance_dot.rs
│ │ │ ├── distance_l2.rs
│ │ │ ├── jaccard.rs
│ │ │ ├── mod.rs
│ │ │ ├── serialize.rs
│ │ │ ├── slice.rs
│ │ │ └── text.rs
│ │ └── vector_types.rs
│ └── vtab.rs
├── deny.toml
├── dist-workspace.toml
├── docs/
│ ├── CODEOWNERS
│ ├── agent-guides/
│ │ ├── async-io-model.md
│ │ ├── code-quality.md
│ │ ├── debugging.md
│ │ ├── mvcc.md
│ │ ├── pr-workflow.md
│ │ ├── storage-format.md
│ │ ├── testing.md
│ │ └── transaction-correctness.md
│ ├── contributing/
│ │ └── contributing_functions.md
│ ├── fts.md
│ ├── internals/
│ │ └── mvcc/
│ │ ├── DESIGN.md
│ │ ├── GC.md
│ │ ├── RECOVERY_SEMANTICS.md
│ │ └── figures/
│ │ └── transactions.excalidraw
│ ├── javascript-api-reference.md
│ ├── language-reference/
│ │ └── book/
│ │ ├── print.html
│ │ └── turso/
│ │ └── custom-types.html
│ ├── manual.md
│ ├── sql-reference/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── book.toml
│ │ ├── cli/
│ │ │ ├── command-line-options.mdx
│ │ │ ├── getting-started.mdx
│ │ │ └── shell-commands.mdx
│ │ ├── compatibility.mdx
│ │ ├── data-types.mdx
│ │ ├── experimental-features.mdx
│ │ ├── expressions.mdx
│ │ ├── extensions.mdx
│ │ ├── functions/
│ │ │ ├── aggregate.mdx
│ │ │ ├── array.mdx
│ │ │ ├── date-time.mdx
│ │ │ ├── fts.mdx
│ │ │ ├── json.mdx
│ │ │ ├── math.mdx
│ │ │ ├── scalar.mdx
│ │ │ ├── vector.mdx
│ │ │ └── window.mdx
│ │ ├── pragmas.mdx
│ │ ├── preview.sh
│ │ └── statements/
│ │ ├── alter-table.mdx
│ │ ├── analyze.mdx
│ │ ├── attach-database.mdx
│ │ ├── create-index.mdx
│ │ ├── create-materialized-view.mdx
│ │ ├── create-table.mdx
│ │ ├── create-trigger.mdx
│ │ ├── create-type.mdx
│ │ ├── create-view.mdx
│ │ ├── create-virtual-table.mdx
│ │ ├── delete.mdx
│ │ ├── detach-database.mdx
│ │ ├── drop-index.mdx
│ │ ├── drop-table.mdx
│ │ ├── drop-trigger.mdx
│ │ ├── drop-type.mdx
│ │ ├── drop-view.mdx
│ │ ├── explain.mdx
│ │ ├── insert.mdx
│ │ ├── replace.mdx
│ │ ├── select.mdx
│ │ ├── transactions.mdx
│ │ ├── update.mdx
│ │ └── upsert.mdx
│ └── testing.md
├── examples/
│ ├── .gitignore
│ ├── README.md
│ ├── dotnet/
│ │ ├── Encryption.cs
│ │ ├── EncryptionExample.csproj
│ │ └── README.md
│ ├── go/
│ │ ├── README.md
│ │ ├── encryption.go
│ │ ├── go.mod
│ │ └── go.sum
│ ├── java/
│ │ └── README.md
│ ├── javascript/
│ │ ├── concurrent-writes/
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ ├── database-node/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ ├── database-wasm-vite/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── server.mjs
│ │ │ ├── vercel.json
│ │ │ └── vite.config.ts
│ │ ├── encryption/
│ │ │ ├── encryption.mjs
│ │ │ └── package.json
│ │ ├── sync-encryption/
│ │ │ ├── README.md
│ │ │ ├── package.json
│ │ │ └── sync_example.mjs
│ │ ├── sync-node/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ └── sync-wasm-vite/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── server.mjs
│ │ ├── vercel.json
│ │ └── vite.config.ts
│ ├── python/
│ │ ├── README.md
│ │ ├── basic.py
│ │ ├── concurrent_writes.py
│ │ ├── encryption.py
│ │ └── sync_example.py
│ └── react-native/
│ ├── .bundle/
│ │ └── config
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .prettierrc.js
│ ├── .watchmanconfig
│ ├── Gemfile
│ ├── README.md
│ ├── android/
│ │ ├── app/
│ │ │ ├── build.gradle
│ │ │ ├── debug.keystore
│ │ │ ├── proguard-rules.pro
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── tursoexample/
│ │ │ │ ├── MainActivity.kt
│ │ │ │ └── MainApplication.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── rn_edit_text_material.xml
│ │ │ └── values/
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ └── settings.gradle
│ ├── app.json
│ ├── babel.config.js
│ ├── index.js
│ ├── ios/
│ │ ├── .xcode.env
│ │ ├── Podfile
│ │ ├── TursoExample/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── PrivacyInfo.xcprivacy
│ │ ├── TursoExample.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── TursoExample.xcscheme
│ │ └── TursoExample.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── jest.config.js
│ ├── metro.config.js
│ ├── package.json
│ ├── react-native.config.js
│ ├── src/
│ │ └── App.tsx
│ └── tsconfig.json
├── extensions/
│ ├── completion/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── keywords.rs
│ │ └── lib.rs
│ ├── core/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── build.rs
│ │ └── src/
│ │ ├── functions.rs
│ │ ├── lib.rs
│ │ ├── types.rs
│ │ ├── vfs_modules.rs
│ │ └── vtabs.rs
│ ├── crypto/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── crypto.rs
│ │ └── lib.rs
│ ├── csv/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── fuzzy/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── caver.rs
│ │ ├── common.rs
│ │ ├── editdist.rs
│ │ ├── lib.rs
│ │ ├── phonetic.rs
│ │ ├── rsoundex.rs
│ │ ├── soundex.rs
│ │ └── translit.rs
│ ├── ipaddr/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── percentile/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── regexp/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ └── tests/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── flake.nix
├── fuzz/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── README.md
│ └── fuzz_targets/
│ ├── cast_real.rs
│ ├── expression.rs
│ ├── scalar_func.rs
│ └── schema.rs
├── licenses/
│ ├── bindings/
│ │ ├── java/
│ │ │ ├── assertj-license.md
│ │ │ ├── errorprone-license.md
│ │ │ ├── logback-license.md
│ │ │ └── spotless-license.md
│ │ └── python/
│ │ └── sqlalchemy-mit-license.md
│ ├── core/
│ │ ├── libm-mit-license.md
│ │ ├── pastey-apache-license.md
│ │ ├── pastey-mit-license.md
│ │ ├── serde-apache-license.md
│ │ ├── serde-mit-license.md
│ │ ├── serde_json5-license.md
│ │ ├── windows-apache.license.md
│ │ └── windows-mit-license.md
│ └── extensions/
│ ├── ipnetwork-apache-license.md
│ └── ipnetwork-mit-license.md
├── macros/
│ ├── Cargo.toml
│ └── src/
│ ├── assert.rs
│ ├── atomic_enum.rs
│ ├── ext/
│ │ ├── agg_derive.rs
│ │ ├── match_ignore_ascii_case.rs
│ │ ├── mod.rs
│ │ ├── scalars.rs
│ │ ├── vfs_derive.rs
│ │ └── vtab_derive.rs
│ ├── lib.rs
│ └── test.rs
├── packages/
│ └── turso-serverless/
│ ├── AGENT.md
│ ├── README.md
│ ├── examples/
│ │ ├── cloud-encryption/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ ├── remote/
│ │ │ ├── README.md
│ │ │ ├── index.mjs
│ │ │ └── package.json
│ │ └── remote-compat/
│ │ ├── README.md
│ │ ├── index.mjs
│ │ └── package.json
│ ├── integration-tests/
│ │ ├── compat.test.mjs
│ │ └── serverless.test.mjs
│ ├── package.json
│ ├── src/
│ │ ├── async-lock.ts
│ │ ├── compat/
│ │ │ └── index.ts
│ │ ├── compat.ts
│ │ ├── connection.ts
│ │ ├── error.ts
│ │ ├── index.ts
│ │ ├── protocol.ts
│ │ ├── session.ts
│ │ └── statement.ts
│ └── tsconfig.json
├── parser/
│ ├── Cargo.toml
│ ├── README.md
│ ├── benches/
│ │ └── parser_benchmark.rs
│ └── src/
│ ├── ast/
│ │ ├── check.rs
│ │ └── fmt.rs
│ ├── ast.rs
│ ├── error.rs
│ ├── lexer.rs
│ ├── lib.rs
│ ├── parser.rs
│ └── token.rs
├── perf/
│ ├── clickbench/
│ │ ├── .gitignore
│ │ ├── benchmark.sh
│ │ ├── create.sql
│ │ ├── queries.sql
│ │ └── run.sh
│ ├── connection/
│ │ ├── README.md
│ │ ├── gen-database.py
│ │ ├── gen-databases
│ │ ├── limbo/
│ │ │ ├── Cargo.toml
│ │ │ ├── run-benchmark.sh
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── plot.py
│ │ └── rusqlite/
│ │ ├── Cargo.toml
│ │ ├── run-benchmark.sh
│ │ └── src/
│ │ └── main.rs
│ ├── encryption/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ └── main.rs
│ ├── graph-queries/
│ │ ├── .gitignore
│ │ ├── generate_seed.py
│ │ └── queries/
│ │ ├── 3_aggregate_or_in.sql
│ │ ├── a_cooccurrence.sql
│ │ ├── b_or_join.sql
│ │ ├── c_edge_counts.sql
│ │ ├── d_inlist_union.sql
│ │ ├── e_activity_agg.sql
│ │ ├── f1_streak_current.sql
│ │ └── f2_streak_longest.sql
│ ├── latency/
│ │ ├── README.md
│ │ ├── limbo/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ ├── gen-database.py
│ │ │ ├── gen-databases
│ │ │ ├── plot.py
│ │ │ ├── run-benchmark.sh
│ │ │ ├── rust-toolchain
│ │ │ └── src/
│ │ │ └── main.rs
│ │ └── rusqlite/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── gen-database.py
│ │ ├── gen-databases
│ │ ├── plot.py
│ │ ├── run-benchmark.sh
│ │ └── src/
│ │ └── main.rs
│ ├── mobibench/
│ │ ├── README.md
│ │ ├── plot/
│ │ │ ├── plot.py
│ │ │ └── pyproject.toml
│ │ └── run-eval.sh
│ ├── throughput/
│ │ ├── README.md
│ │ ├── plot/
│ │ │ ├── plot-compute-impact.py
│ │ │ └── plot-thread-scaling.py
│ │ ├── rusqlite/
│ │ │ ├── Cargo.toml
│ │ │ ├── scripts/
│ │ │ │ └── bench.sh
│ │ │ └── src/
│ │ │ └── main.rs
│ │ └── turso/
│ │ ├── Cargo.toml
│ │ ├── bench.sh
│ │ ├── scripts/
│ │ │ └── bench.sh
│ │ └── src/
│ │ └── main.rs
│ └── tpc-h/
│ ├── README.md
│ ├── benchmark.sh
│ ├── compare.sh
│ ├── plot/
│ │ ├── .python-version
│ │ ├── plot.py
│ │ ├── pyproject.toml
│ │ └── results2csv.sh
│ ├── queries/
│ │ ├── 1.sql
│ │ ├── 10.sql
│ │ ├── 11.sql
│ │ ├── 12.sql
│ │ ├── 13.sql
│ │ ├── 14.sql
│ │ ├── 15.sql
│ │ ├── 16.sql
│ │ ├── 17.sql
│ │ ├── 18.sql
│ │ ├── 19.sql
│ │ ├── 2.sql
│ │ ├── 20.sql
│ │ ├── 21.sql
│ │ ├── 22.sql
│ │ ├── 3.sql
│ │ ├── 4.sql
│ │ ├── 5.sql
│ │ ├── 6.sql
│ │ ├── 7.sql
│ │ ├── 8.sql
│ │ └── 9.sql
│ └── run.sh
├── pyproject.toml
├── rust-toolchain.toml
├── scripts/
│ ├── antithesis/
│ │ ├── launch.sh
│ │ ├── publish-config.sh
│ │ ├── publish-docker.sh
│ │ └── publish-workload.sh
│ ├── clean_interactions.sh
│ ├── clone_test_db.sh
│ ├── corruption-debug-tools/
│ │ ├── README.md
│ │ ├── find_corrupt_frame.py
│ │ ├── lib/
│ │ │ ├── __init__.py
│ │ │ ├── diff.py
│ │ │ ├── page.py
│ │ │ ├── record.py
│ │ │ └── wal.py
│ │ ├── page_diff.py
│ │ ├── page_history.py
│ │ ├── page_info.py
│ │ ├── track_rowid.py
│ │ ├── verify_stale.py
│ │ ├── wal_commits.py
│ │ └── wal_info.py
│ ├── corruption_bisecter.py
│ ├── diff.sh
│ ├── gen-changelog.py
│ ├── install-sqlite3.sh
│ ├── limbo-sqlite3
│ ├── merge-pr.py
│ ├── publish-crates.sh
│ ├── pyproject.toml
│ ├── release-status.py
│ ├── run-sim
│ ├── run-sim.ps1
│ ├── run-sqlancer.sh
│ ├── run-until-fail.sh
│ ├── turso-mvcc-sqlite3
│ └── update-version.py
├── sdk-kit/
│ ├── Cargo.toml
│ ├── README.md
│ ├── bindgen.sh
│ ├── readme-sdk-kit.mdx
│ ├── src/
│ │ ├── bindings.rs
│ │ ├── capi.rs
│ │ ├── lib.rs
│ │ └── rsapi.rs
│ └── turso.h
├── sdk-kit-macros/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── sql_generation/
│ ├── Cargo.toml
│ ├── generation/
│ │ ├── expr.rs
│ │ ├── mod.rs
│ │ ├── opts.rs
│ │ ├── predicate/
│ │ │ ├── binary.rs
│ │ │ ├── mod.rs
│ │ │ └── unary.rs
│ │ ├── query.rs
│ │ ├── table.rs
│ │ └── value/
│ │ ├── cmp.rs
│ │ ├── mod.rs
│ │ └── pattern.rs
│ ├── lib.rs
│ └── model/
│ ├── mod.rs
│ ├── query/
│ │ ├── alter_table.rs
│ │ ├── create.rs
│ │ ├── create_index.rs
│ │ ├── delete.rs
│ │ ├── drop.rs
│ │ ├── drop_index.rs
│ │ ├── insert.rs
│ │ ├── mod.rs
│ │ ├── pragma.rs
│ │ ├── predicate.rs
│ │ ├── select.rs
│ │ ├── transaction.rs
│ │ └── update.rs
│ └── table.rs
├── sqlite3/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ ├── cbindgen.toml
│ ├── examples/
│ │ └── example.c
│ ├── include/
│ │ └── sqlite3.h
│ ├── src/
│ │ └── lib.rs
│ └── tests/
│ ├── .gitignore
│ ├── Makefile
│ ├── compat/
│ │ └── mod.rs
│ └── sqlite3_tests.c
├── sync/
│ ├── engine/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── database_replay_generator.rs
│ │ ├── database_sync_engine.rs
│ │ ├── database_sync_engine_io.rs
│ │ ├── database_sync_lazy_storage.rs
│ │ ├── database_sync_operations.rs
│ │ ├── database_tape.rs
│ │ ├── errors.rs
│ │ ├── io_operations.rs
│ │ ├── lib.rs
│ │ ├── server_proto.rs
│ │ ├── sparse_io.rs
│ │ ├── types.rs
│ │ └── wal_session.rs
│ └── sdk-kit/
│ ├── Cargo.toml
│ ├── bindgen.sh
│ ├── src/
│ │ ├── bindings.rs
│ │ ├── capi.rs
│ │ ├── lib.rs
│ │ ├── rsapi.rs
│ │ ├── sync_engine_io.rs
│ │ └── turso_async_operation.rs
│ └── turso_sync.h
├── testing/
│ ├── README.md
│ ├── antithesis/
│ │ ├── README.md
│ │ ├── bank-test/
│ │ │ ├── anytime_validate.py
│ │ │ ├── eventually_validate.py
│ │ │ ├── finally_validate.py
│ │ │ ├── first_setup.py
│ │ │ └── parallel_driver_generate_transaction.py
│ │ ├── pyproject.toml
│ │ ├── stress/
│ │ │ └── singleton_driver_stress.sh
│ │ ├── stress-composer/
│ │ │ ├── first_setup.py
│ │ │ ├── helper_utils.py
│ │ │ ├── parallel_driver_alter_table.py
│ │ │ ├── parallel_driver_create_index.py
│ │ │ ├── parallel_driver_create_table.py
│ │ │ ├── parallel_driver_delete.py
│ │ │ ├── parallel_driver_drop_index.py
│ │ │ ├── parallel_driver_drop_table.py
│ │ │ ├── parallel_driver_insert.py
│ │ │ ├── parallel_driver_integritycheck.py
│ │ │ ├── parallel_driver_rollback.py
│ │ │ ├── parallel_driver_schema_rollback.py
│ │ │ ├── parallel_driver_update.py
│ │ │ ├── parallel_driver_wal_checkpoint.py
│ │ │ └── shuffle-run.sh
│ │ ├── stress-io_uring/
│ │ │ └── singleton_driver_stress.sh
│ │ ├── stress-io_uring-mvcc/
│ │ │ └── singleton_driver_stress.sh
│ │ ├── stress-mvcc/
│ │ │ └── singleton_driver_stress.sh
│ │ └── stress-unreliable/
│ │ └── singleton_driver_stress.sh
│ ├── cli_tests/
│ │ ├── cli_test_cases.py
│ │ ├── collate.py
│ │ ├── console.py
│ │ ├── constraint.py
│ │ ├── extensions.py
│ │ ├── memory.py
│ │ ├── mvcc.py
│ │ ├── sqlite_bench.py
│ │ ├── test_files/
│ │ │ ├── test.csv
│ │ │ └── test_w_header.csv
│ │ ├── test_turso_cli.py
│ │ ├── update.py
│ │ ├── vfs_bench.py
│ │ └── write.py
│ ├── concurrent-simulator/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── bin/
│ │ │ ├── explore
│ │ │ ├── run
│ │ │ └── run-elle
│ │ ├── chaotic_elle.rs
│ │ ├── elle.rs
│ │ ├── io.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── operations.rs
│ │ ├── properties.rs
│ │ ├── regression_tests.rs
│ │ └── workloads.rs
│ ├── differential-oracle/
│ │ ├── fuzzer/
│ │ │ ├── Cargo.toml
│ │ │ ├── custom_types_fuzzer.rs
│ │ │ ├── docker-runner/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── docker-entrypoint.fuzzer.ts
│ │ │ │ ├── github.ts
│ │ │ │ ├── levenshtein.ts
│ │ │ │ ├── logParse.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── random.ts
│ │ │ │ ├── slack.ts
│ │ │ │ └── tsconfig.json
│ │ │ ├── generate.rs
│ │ │ ├── lib.rs
│ │ │ ├── main.rs
│ │ │ ├── memory/
│ │ │ │ ├── file.rs
│ │ │ │ ├── io.rs
│ │ │ │ └── mod.rs
│ │ │ ├── oracle.rs
│ │ │ ├── printf_fuzzer.rs
│ │ │ ├── printf_gen.rs
│ │ │ ├── runner.rs
│ │ │ └── schema.rs
│ │ ├── sql_gen/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── ast.rs
│ │ │ ├── builder.rs
│ │ │ ├── capabilities.rs
│ │ │ ├── context.rs
│ │ │ ├── error.rs
│ │ │ ├── functions.rs
│ │ │ ├── generate/
│ │ │ │ ├── expr.rs
│ │ │ │ ├── literal.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── select.rs
│ │ │ │ └── stmt.rs
│ │ │ ├── lib.rs
│ │ │ ├── policy.rs
│ │ │ ├── schema.rs
│ │ │ ├── strategy.rs
│ │ │ └── trace.rs
│ │ ├── sql_gen_macros/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── sql_gen_prop/
│ │ ├── Cargo.toml
│ │ ├── alter_table.rs
│ │ ├── create_index.rs
│ │ ├── create_table.rs
│ │ ├── create_trigger.rs
│ │ ├── cte.rs
│ │ ├── delete.rs
│ │ ├── drop_index.rs
│ │ ├── drop_table.rs
│ │ ├── drop_trigger.rs
│ │ ├── expression.rs
│ │ ├── function.rs
│ │ ├── generator.rs
│ │ ├── insert.rs
│ │ ├── lib.rs
│ │ ├── profile.rs
│ │ ├── result.rs
│ │ ├── schema.rs
│ │ ├── select.rs
│ │ ├── statement.rs
│ │ ├── transaction.rs
│ │ ├── update.rs
│ │ ├── utility.rs
│ │ ├── value.rs
│ │ └── view.rs
│ ├── javascript/
│ │ ├── __test__/
│ │ │ ├── async.test.js
│ │ │ └── sync.test.js
│ │ ├── artifacts/
│ │ │ └── basic-test.sql
│ │ └── package.json
│ ├── pyproject.toml
│ ├── simulator/
│ │ ├── .gitignore
│ │ ├── COVERAGE.md
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── ROADMAP.md
│ │ ├── common/
│ │ │ └── mod.rs
│ │ ├── generation/
│ │ │ ├── mod.rs
│ │ │ ├── plan.rs
│ │ │ ├── property.rs
│ │ │ └── query.rs
│ │ ├── main.rs
│ │ ├── model/
│ │ │ ├── interactions.rs
│ │ │ ├── metrics.rs
│ │ │ ├── mod.rs
│ │ │ └── property.rs
│ │ ├── plan_to_test.rs
│ │ ├── profiles/
│ │ │ ├── io.rs
│ │ │ ├── mod.rs
│ │ │ └── query.rs
│ │ ├── run-miri.sh
│ │ ├── runner/
│ │ │ ├── bugbase.rs
│ │ │ ├── cli.rs
│ │ │ ├── clock.rs
│ │ │ ├── differential.rs
│ │ │ ├── doublecheck.rs
│ │ │ ├── env.rs
│ │ │ ├── execution.rs
│ │ │ ├── file.rs
│ │ │ ├── io.rs
│ │ │ ├── memory/
│ │ │ │ ├── file.rs
│ │ │ │ ├── io.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── mvcc_recovery.rs
│ │ │ │ └── statement_abandon.rs
│ │ │ └── mod.rs
│ │ ├── shrink/
│ │ │ ├── mod.rs
│ │ │ └── plan.rs
│ │ └── simulator-docker-runner/
│ │ ├── Dockerfile.simulator
│ │ ├── README.MD
│ │ ├── docker-entrypoint.simulator.ts
│ │ ├── github.ts
│ │ ├── levenshtein.test.ts
│ │ ├── levenshtein.ts
│ │ ├── logParse.ts
│ │ ├── package.json
│ │ ├── random.ts
│ │ ├── slack.ts
│ │ └── tsconfig.json
│ ├── sqlancer/
│ │ ├── README.md
│ │ ├── patches/
│ │ │ ├── LimboProvider.java
│ │ │ ├── LimboSchema.java
│ │ │ └── SQLite3Schema.patch
│ │ └── sqlancer-runner/
│ │ ├── Dockerfile.sqlancer
│ │ ├── README.md
│ │ ├── corruptionAnalysis.ts
│ │ ├── docker-entrypoint.sqlancer.ts
│ │ ├── github.ts
│ │ ├── levenshtein.ts
│ │ ├── logParse.ts
│ │ ├── package.json
│ │ ├── slack.ts
│ │ └── tsconfig.json
│ ├── sqlite3/
│ │ ├── README.md
│ │ ├── all.test
│ │ ├── alter.test
│ │ ├── alter2.test
│ │ ├── alter3.test
│ │ ├── alter4.test
│ │ ├── func.test
│ │ ├── func2.test
│ │ ├── func3.test
│ │ ├── func4.test
│ │ ├── func5.test
│ │ ├── func6.test
│ │ ├── func7.test
│ │ ├── func8.test
│ │ ├── func9.test
│ │ ├── insert.test
│ │ ├── insert2.test
│ │ ├── insert3.test
│ │ ├── insert4.test
│ │ ├── insert5.test
│ │ ├── join.test
│ │ ├── join2.test
│ │ ├── join3.test
│ │ ├── join4.test
│ │ ├── join5.test
│ │ ├── join6.test
│ │ ├── join7.test
│ │ ├── join8.test
│ │ ├── join9.test
│ │ ├── joinA.test
│ │ ├── joinB.test
│ │ ├── joinC.test
│ │ ├── joinD.test
│ │ ├── joinE.test
│ │ ├── joinF.test
│ │ ├── joinH.test
│ │ ├── select1.test
│ │ ├── select2.test
│ │ ├── select3.test
│ │ ├── select4.test
│ │ ├── select5.test
│ │ ├── select6.test
│ │ ├── select7.test
│ │ ├── select8.test
│ │ ├── select9.test
│ │ ├── selectA.test
│ │ ├── selectB.test
│ │ ├── selectC.test
│ │ ├── selectD.test
│ │ ├── selectE.test
│ │ ├── selectF.test
│ │ ├── selectG.test
│ │ ├── selectH.test
│ │ └── tester.tcl
│ ├── sqlite_test_ext/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── include/
│ │ │ ├── sqlite3.h
│ │ │ └── sqlite3ext.h
│ │ └── src/
│ │ ├── kvstore.c
│ │ └── lib.rs
│ ├── sqlright/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── collect_coverage.sh
│ │ ├── crash_reports/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── collect_crashes.py
│ │ │ ├── lib/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── database.py
│ │ │ │ ├── executor.py
│ │ │ │ ├── parser.py
│ │ │ │ └── scanner.py
│ │ │ ├── query_crashes.py
│ │ │ └── schema.sql
│ │ ├── patches/
│ │ │ ├── 0001-turso-increase-map-size-and-fix-gcc13.patch
│ │ │ ├── 0002-turso-fix-macos-bison-compatibility.patch
│ │ │ └── 0003-turso-fix-macos-compilation-errors.patch
│ │ ├── run.sh
│ │ └── setup.sh
│ ├── sqltests/
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ ├── database/
│ │ │ └── .gitignore
│ │ ├── docs/
│ │ │ ├── README.md
│ │ │ ├── adding-backends.md
│ │ │ ├── architecture.md
│ │ │ ├── backends/
│ │ │ │ └── cli.md
│ │ │ ├── cli-usage.md
│ │ │ ├── dsl-spec.md
│ │ │ ├── parallelism.md
│ │ │ └── snapshot-testing.md
│ │ ├── examples/
│ │ │ ├── basic.sqltest
│ │ │ ├── joins.sqltest
│ │ │ ├── snapshot_example.sqltest
│ │ │ └── snapshots/
│ │ │ ├── snapshot_example__query-plan-by-id.snap
│ │ │ └── snapshot_example__query-plan-by-name.snap
│ │ ├── src/
│ │ │ ├── backends/
│ │ │ │ ├── cli.rs
│ │ │ │ ├── js.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── rust.rs
│ │ │ ├── comparison/
│ │ │ │ ├── exact.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pattern.rs
│ │ │ │ └── unordered.rs
│ │ │ ├── generator/
│ │ │ │ └── mod.rs
│ │ │ ├── lib.rs
│ │ │ ├── main.rs
│ │ │ ├── output/
│ │ │ │ ├── json.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── pretty.rs
│ │ │ ├── parser/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── lexer.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── sql_complete.rs
│ │ │ ├── runner/
│ │ │ │ └── mod.rs
│ │ │ ├── snapshot/
│ │ │ │ └── mod.rs
│ │ │ └── tcl_converter/
│ │ │ ├── mod.rs
│ │ │ ├── parser.rs
│ │ │ └── utils.rs
│ │ ├── syntax-highlighter/
│ │ │ └── vscode/
│ │ │ ├── README.md
│ │ │ ├── language-configuration.json
│ │ │ ├── package.json
│ │ │ └── syntaxes/
│ │ │ └── sqltest.tmLanguage.json
│ │ ├── tests/
│ │ │ ├── affinity.sqltest
│ │ │ ├── agg-functions/
│ │ │ │ ├── agg-extreme-exponent.sqltest
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── group-concat-types.sqltest
│ │ │ │ ├── is-true.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── sum-blob-types.sqltest
│ │ │ │ ├── sum-inf-cancel.sqltest
│ │ │ │ ├── sum-large-float.sqltest
│ │ │ │ └── sum-text-types.sqltest
│ │ │ ├── alter_rename_column_partial_idx.sqltest
│ │ │ ├── alter_table.sqltest
│ │ │ ├── autoincr.sqltest
│ │ │ ├── before-update-trigger-correlated-subquery.sqltest
│ │ │ ├── big.ignored_for_now
│ │ │ ├── boolean.sqltest
│ │ │ ├── btree-backward-scan.sqltest
│ │ │ ├── btree-large-page-overflow.sqltest
│ │ │ ├── btree_dump.sqltest
│ │ │ ├── changes.sqltest
│ │ │ ├── char.sqltest
│ │ │ ├── check_constraint.sqltest
│ │ │ ├── cmdlineshell.sqltest
│ │ │ ├── coalesce/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── collate.sqltest
│ │ │ ├── column_name_case.sqltest
│ │ │ ├── compare.sqltest
│ │ │ ├── composite-index-sort-elim.sqltest
│ │ │ ├── concat.sqltest
│ │ │ ├── correlated-subquery-hash-join.sqltest
│ │ │ ├── correlated-subquery-in-clause.sqltest
│ │ │ ├── correlated-subquery-window.sqltest
│ │ │ ├── create_index.sqltest
│ │ │ ├── create_table.sqltest
│ │ │ ├── cross_join.sqltest
│ │ │ ├── cte-real-affinity-join.sqltest
│ │ │ ├── cte-union-all-aggregate-literals.sqltest
│ │ │ ├── cte.sqltest
│ │ │ ├── cte_cardinality.sqltest
│ │ │ ├── cte_expressions.sqltest
│ │ │ ├── default_value.sqltest
│ │ │ ├── delete-correlated-subquery-rowid.sqltest
│ │ │ ├── delete-correlated-subquery.sqltest
│ │ │ ├── delete-limit-offset.sqltest
│ │ │ ├── delete.sqltest
│ │ │ ├── distinct.sqltest
│ │ │ ├── drop_index.sqltest
│ │ │ ├── drop_table.sqltest
│ │ │ ├── duplicate-trigger-names.sqltest
│ │ │ ├── expr-index-correlated-subquery.sqltest
│ │ │ ├── foreign_keys.sqltest
│ │ │ ├── generate_series.sqltest
│ │ │ ├── glob/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── graph_traversal_text_pk.sqltest
│ │ │ ├── group-by-expression-index.sqltest
│ │ │ ├── groupby/
│ │ │ │ ├── constant-expr.sqltest
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── duplicate-order-by.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── hex-real-compare.sqltest
│ │ │ ├── in-index-seek.sqltest
│ │ │ ├── in-null-or.sqltest
│ │ │ ├── in-subquery-ungrouped-aggregate.sqltest
│ │ │ ├── indexed_by.sqltest
│ │ │ ├── insert-cte-compound.sqltest
│ │ │ ├── insert.sqltest
│ │ │ ├── insert_autorowid_index.sqltest
│ │ │ ├── insert_not_null_default_index.sqltest
│ │ │ ├── insert_or_ignore_autoincrement.sqltest
│ │ │ ├── int64-overflow-seek.sqltest
│ │ │ ├── integrity_check/
│ │ │ │ ├── expression_index.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── parity_check_constraint.sqltest
│ │ │ │ ├── parity_corrupt_expression_index.sqltest
│ │ │ │ ├── parity_corrupt_index.sqltest
│ │ │ │ ├── parity_corrupt_partial_index.sqltest
│ │ │ │ ├── parity_freelist_count_mismatch.sqltest
│ │ │ │ ├── parity_freelist_trunk_corrupt.sqltest
│ │ │ │ ├── parity_missing_unique_index.sqltest
│ │ │ │ ├── parity_non_unique_index.sqltest
│ │ │ │ ├── parity_not_null_violation.sqltest
│ │ │ │ ├── parity_overflow_list_length_mismatch.sqltest
│ │ │ │ ├── parity_quick_check_constraint.sqltest
│ │ │ │ ├── snapshot_plans.sqltest
│ │ │ │ └── snapshots/
│ │ │ │ ├── snapshot_plans__integrity-check-multi-table-vdbe.snap
│ │ │ │ ├── snapshot_plans__integrity-check-vdbe.snap
│ │ │ │ ├── snapshot_plans__quick-check-multi-table-vdbe.snap
│ │ │ │ └── snapshot_plans__quick-check-vdbe.snap
│ │ │ ├── issue_5116.sqltest
│ │ │ ├── issue_5212.sqltest
│ │ │ ├── join/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── hash.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── natural_join_no_common.sqltest
│ │ │ │ └── outer_hash_join.sqltest
│ │ │ ├── json/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── json_subtype_strip.sqltest
│ │ │ │ ├── json_tree.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── last_insert_rowid.sqltest
│ │ │ ├── left-join-case-iif-null-masking.sqltest
│ │ │ ├── left-join-ifnull-optimization.sqltest
│ │ │ ├── like.sqltest
│ │ │ ├── limit.sqltest
│ │ │ ├── literal.sqltest
│ │ │ ├── math/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── degrees-radians-precision.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── matview-create-index.sqltest
│ │ │ ├── multi_index_dml.sqltest
│ │ │ ├── multi_index_intersection.sqltest
│ │ │ ├── multi_index_or_adversarial.sqltest
│ │ │ ├── multi_index_or_adversarial_extra.sqltest
│ │ │ ├── multi_index_or_compound.sqltest
│ │ │ ├── multi_index_or_join.sqltest
│ │ │ ├── mvcc-update-noop.sqltest
│ │ │ ├── negative_zero.sqltest
│ │ │ ├── not_between.sqltest
│ │ │ ├── null/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── offset/
│ │ │ │ ├── default.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── on_conflict.sqltest
│ │ │ ├── on_conflict_constraint_def.sqltest
│ │ │ ├── orderby/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── orderby_plan.sqltest
│ │ │ │ └── snapshots/
│ │ │ │ ├── orderby_plan__orderby_a_desc_uses_sorter.snap
│ │ │ │ ├── orderby_plan__orderby_a_uses_sorter.snap
│ │ │ │ ├── orderby_plan__orderby_rowid_desc_no_sorter.snap
│ │ │ │ └── orderby_plan__orderby_rowid_no_sorter.snap
│ │ │ ├── partial_idx.sqltest
│ │ │ ├── placeholder.sqltest
│ │ │ ├── pragma/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── index_info.sqltest
│ │ │ │ ├── index_list.sqltest
│ │ │ │ ├── index_xinfo.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ ├── require_where.sqltest
│ │ │ │ ├── table_list.sqltest
│ │ │ │ └── user_version_10.sqltest
│ │ │ ├── pragma_query_only.sqltest
│ │ │ ├── returning-fk-constraint.sqltest
│ │ │ ├── returning.sqltest
│ │ │ ├── rollback.sqltest
│ │ │ ├── row-value-in.sqltest
│ │ │ ├── savepoint.sqltest
│ │ │ ├── scalar-functions-datetime.sqltest
│ │ │ ├── scalar-functions-format.sqltest
│ │ │ ├── scalar-functions-printf.sqltest
│ │ │ ├── scalar-functions.sqltest
│ │ │ ├── select/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ └── simple_min_max.sqltest
│ │ │ ├── simple-count-optimization.sqltest
│ │ │ ├── snapshot_tests/
│ │ │ │ ├── aggregation/
│ │ │ │ │ ├── aggregation.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── aggregation__aggregation-with-join.snap
│ │ │ │ │ ├── aggregation__count-column.snap
│ │ │ │ │ ├── aggregation__count-distinct.snap
│ │ │ │ │ ├── aggregation__count-star-plus-expr.snap
│ │ │ │ │ ├── aggregation__distinct-count-with-join.snap
│ │ │ │ │ ├── aggregation__group-by-with-having.snap
│ │ │ │ │ ├── aggregation__min-max-per-group.snap
│ │ │ │ │ ├── aggregation__min-max-with-index.snap
│ │ │ │ │ ├── aggregation__multi-column-group-by.snap
│ │ │ │ │ ├── aggregation__multiple-aggregates.snap
│ │ │ │ │ ├── aggregation__nested-aggregation.snap
│ │ │ │ │ ├── aggregation__simple-count-mixed-case.snap
│ │ │ │ │ ├── aggregation__simple-count-no-args.snap
│ │ │ │ │ ├── aggregation__simple-count-star.snap
│ │ │ │ │ ├── aggregation__simple-group-by-single-column.snap
│ │ │ │ │ └── aggregation__whole-table-aggregates.snap
│ │ │ │ ├── analyze/
│ │ │ │ │ ├── analyze.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── analyze__aggregate-after-analyze.snap
│ │ │ │ │ ├── analyze__analyze-all-stat1-exists.snap
│ │ │ │ │ ├── analyze__analyze-all.snap
│ │ │ │ │ ├── analyze__analyze-database.snap
│ │ │ │ │ ├── analyze__analyze-empty-table.snap
│ │ │ │ │ ├── analyze__analyze-index-stat1-exists.snap
│ │ │ │ │ ├── analyze__analyze-specific-index.snap
│ │ │ │ │ ├── analyze__analyze-stat1-exists.snap
│ │ │ │ │ ├── analyze__join-after-analyze.snap
│ │ │ │ │ ├── analyze__join-aggregate-after-analyze.snap
│ │ │ │ │ ├── analyze__max-after-analyze.snap
│ │ │ │ │ ├── analyze__min-after-analyze.snap
│ │ │ │ │ ├── analyze__order-by-index-after-analyze.snap
│ │ │ │ │ ├── analyze__query-after-analyze-category.snap
│ │ │ │ │ ├── analyze__query-after-analyze-equality.snap
│ │ │ │ │ ├── analyze__query-after-analyze-range.snap
│ │ │ │ │ ├── analyze__query-composite-full-after-analyze.snap
│ │ │ │ │ ├── analyze__query-composite-partial-after-analyze.snap
│ │ │ │ │ ├── analyze__query-composite-range-after-analyze.snap
│ │ │ │ │ ├── analyze__query-for-nulls-after-analyze.snap
│ │ │ │ │ ├── analyze__query-identical-composite-after-analyze.snap
│ │ │ │ │ ├── analyze__query-identical-values-after-analyze.snap
│ │ │ │ │ ├── analyze__query-three-column-first-only-after-analyze.snap
│ │ │ │ │ ├── analyze__query-three-column-full-after-analyze.snap
│ │ │ │ │ ├── analyze__query-three-column-partial-after-analyze.snap
│ │ │ │ │ └── analyze__query-with-nulls-after-analyze.snap
│ │ │ │ ├── indexes/
│ │ │ │ │ ├── indexes.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── indexes__aggregate-over-in-subquery-or-in-subquery.snap
│ │ │ │ │ ├── indexes__composite-index-first-column-only.snap
│ │ │ │ │ ├── indexes__composite-index-full-usage.snap
│ │ │ │ │ ├── indexes__composite-index-order-by-match.snap
│ │ │ │ │ ├── indexes__composite-index-range-on-second.snap
│ │ │ │ │ ├── indexes__composite-index-second-column-only.snap
│ │ │ │ │ ├── indexes__covering-index-all-columns.snap
│ │ │ │ │ ├── indexes__covering-index-subset.snap
│ │ │ │ │ ├── indexes__covering-index-with-aggregation.snap
│ │ │ │ │ ├── indexes__full-scan-function-on-indexed.snap
│ │ │ │ │ ├── indexes__full-scan-leading-wildcard.snap
│ │ │ │ │ ├── indexes__full-scan-no-index.snap
│ │ │ │ │ ├── indexes__full-scan-non-indexed-column.snap
│ │ │ │ │ ├── indexes__full-scan-with-aggregation.snap
│ │ │ │ │ ├── indexes__in-clause-multiple-values.snap
│ │ │ │ │ ├── indexes__in-composite-collation-mismatch-larger-table.snap
│ │ │ │ │ ├── indexes__in-composite-collation-mismatch.snap
│ │ │ │ │ ├── indexes__in-list-collation-match-explicit-nocase.snap
│ │ │ │ │ ├── indexes__in-list-collation-mismatch.snap
│ │ │ │ │ ├── indexes__in-list-composite-prefix.snap
│ │ │ │ │ ├── indexes__in-list-index-seek.snap
│ │ │ │ │ ├── indexes__in-list-no-index-scan.snap
│ │ │ │ │ ├── indexes__in-list-rowid-seek.snap
│ │ │ │ │ ├── indexes__in-subquery-collation-mismatch.snap
│ │ │ │ │ ├── indexes__in-subquery-or-in-list-left-join.snap
│ │ │ │ │ ├── indexes__in-subquery-or-in-subquery-indexed.snap
│ │ │ │ │ ├── indexes__index-for-correlated-max-materialized-cte-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-correlated-max-materialized-cte.snap
│ │ │ │ │ ├── indexes__index-for-max-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte-no-where-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte-no-where.snap
│ │ │ │ │ ├── indexes__index-for-max-materialized-cte.snap
│ │ │ │ │ ├── indexes__index-for-max.snap
│ │ │ │ │ ├── indexes__index-for-min-bytecode.snap
│ │ │ │ │ ├── indexes__index-for-min.snap
│ │ │ │ │ ├── indexes__index-for-order-by.snap
│ │ │ │ │ ├── indexes__index-not-equal.snap
│ │ │ │ │ ├── indexes__indexed-by-delete-category.snap
│ │ │ │ │ ├── indexes__indexed-by-delete-sku.snap
│ │ │ │ │ ├── indexes__indexed-by-join-both.snap
│ │ │ │ │ ├── indexes__indexed-by-join-one-side.snap
│ │ │ │ │ ├── indexes__indexed-by-no-where-clause.snap
│ │ │ │ │ ├── indexes__indexed-by-select-category.snap
│ │ │ │ │ ├── indexes__indexed-by-select-price-range.snap
│ │ │ │ │ ├── indexes__indexed-by-select-sku.snap
│ │ │ │ │ ├── indexes__indexed-by-three-way-join.snap
│ │ │ │ │ ├── indexes__indexed-by-update-price.snap
│ │ │ │ │ ├── indexes__indexed-by-update-sku.snap
│ │ │ │ │ ├── indexes__join-with-index.snap
│ │ │ │ │ ├── indexes__max-with-equality-prefix-bytecode.snap
│ │ │ │ │ ├── indexes__multiple-indexes-choice.snap
│ │ │ │ │ ├── indexes__non-covering-needs-table-lookup.snap
│ │ │ │ │ ├── indexes__not-indexed-delete.snap
│ │ │ │ │ ├── indexes__not-indexed-select.snap
│ │ │ │ │ ├── indexes__not-indexed-update.snap
│ │ │ │ │ ├── indexes__or-different-columns.snap
│ │ │ │ │ ├── indexes__or-indexed-and-non-indexed.snap
│ │ │ │ │ ├── indexes__or-same-column.snap
│ │ │ │ │ ├── indexes__or-with-and-combinations.snap
│ │ │ │ │ ├── indexes__primary-key-lookup.snap
│ │ │ │ │ ├── indexes__range-scan-between.snap
│ │ │ │ │ ├── indexes__range-scan-greater-equal.snap
│ │ │ │ │ ├── indexes__range-scan-greater-than.snap
│ │ │ │ │ ├── indexes__range-scan-less-equal.snap
│ │ │ │ │ ├── indexes__range-scan-less-than.snap
│ │ │ │ │ ├── indexes__range-scan-timestamp.snap
│ │ │ │ │ ├── indexes__range-scan-with-equality.snap
│ │ │ │ │ ├── indexes__rowid-range-no-alias.snap
│ │ │ │ │ ├── indexes__rowid-seek-no-alias.snap
│ │ │ │ │ ├── indexes__simple-index-equality-lookup.snap
│ │ │ │ │ ├── indexes__simple-index-with-filter.snap
│ │ │ │ │ ├── indexes__subquery-with-index.snap
│ │ │ │ │ ├── indexes__unordered-correlated-max-materialized-cte-bytecode.snap
│ │ │ │ │ └── indexes__unordered-materialized-cte-max-bytecode.snap
│ │ │ │ ├── joins/
│ │ │ │ │ ├── joins.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── joins__bigass-three-table-join-rowid-seek.snap
│ │ │ │ │ ├── joins__cross-join-explicit.snap
│ │ │ │ │ ├── joins__cross-join-implicit.snap
│ │ │ │ │ ├── joins__cross-join-limited.snap
│ │ │ │ │ ├── joins__cross-join-with-filter.snap
│ │ │ │ │ ├── joins__four-table-join-with-aggregation.snap
│ │ │ │ │ ├── joins__hash-join-full-outer.snap
│ │ │ │ │ ├── joins__hash-join-inner-basic.snap
│ │ │ │ │ ├── joins__hash-join-left-outer-agg.snap
│ │ │ │ │ ├── joins__hash-join-left-outer.snap
│ │ │ │ │ ├── joins__hash-join-three-table.snap
│ │ │ │ │ ├── joins__hash-join-with-aggregation.snap
│ │ │ │ │ ├── joins__hash-join-with-order-by.snap
│ │ │ │ │ ├── joins__index-assisted-join-order-items.snap
│ │ │ │ │ ├── joins__index-assisted-join-product-lookup.snap
│ │ │ │ │ ├── joins__index-assisted-join-range-scan.snap
│ │ │ │ │ ├── joins__index-assisted-join-single-customer.snap
│ │ │ │ │ ├── joins__join-multiple-conditions.snap
│ │ │ │ │ ├── joins__join-with-exists.snap
│ │ │ │ │ ├── joins__join-with-subquery.snap
│ │ │ │ │ ├── joins__left-outer-join-basic.snap
│ │ │ │ │ ├── joins__left-outer-join-chained.snap
│ │ │ │ │ ├── joins__left-outer-join-find-nulls.snap
│ │ │ │ │ ├── joins__left-outer-join-with-aggregation.snap
│ │ │ │ │ ├── joins__mixed-join-types.snap
│ │ │ │ │ ├── joins__multi-table-join-complex-filter.snap
│ │ │ │ │ ├── joins__natural-join.snap
│ │ │ │ │ ├── joins__prefer-constant-bound-index-over-join-dependent.snap
│ │ │ │ │ ├── joins__self-join-category-hierarchy.snap
│ │ │ │ │ ├── joins__self-join-employee-manager.snap
│ │ │ │ │ ├── joins__self-join-find-subordinates.snap
│ │ │ │ │ ├── joins__self-join-prefer-join-dependent-index.snap
│ │ │ │ │ ├── joins__self-join-same-department.snap
│ │ │ │ │ ├── joins__three-table-join-explicit.snap
│ │ │ │ │ ├── joins__three-table-join-rowid-seek.snap
│ │ │ │ │ ├── joins__three-table-join.snap
│ │ │ │ │ ├── joins__two-table-inner-join-basic.snap
│ │ │ │ │ ├── joins__two-table-inner-join-explicit.snap
│ │ │ │ │ ├── joins__two-table-inner-join-with-filter.snap
│ │ │ │ │ └── joins__using-clause-join.snap
│ │ │ │ ├── modifications/
│ │ │ │ │ ├── modifications.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── modifications__delete-with-subquery.snap
│ │ │ │ │ ├── modifications__delete-with-where.snap
│ │ │ │ │ ├── modifications__insert-multiple-rows.snap
│ │ │ │ │ ├── modifications__insert-or-abort-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-fail-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-ignore-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-ignore.snap
│ │ │ │ │ ├── modifications__insert-or-replace-multi-notnull-default-partial.snap
│ │ │ │ │ ├── modifications__insert-or-replace-multi-notnull-default.snap
│ │ │ │ │ ├── modifications__insert-or-replace-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-or-replace.snap
│ │ │ │ │ ├── modifications__insert-or-rollback-multi-unique.snap
│ │ │ │ │ ├── modifications__insert-select.snap
│ │ │ │ │ ├── modifications__insert-single-row.snap
│ │ │ │ │ └── modifications__update-simple.snap
│ │ │ │ ├── returning/
│ │ │ │ │ ├── returning.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── returning__delete-returning-expr.snap
│ │ │ │ │ ├── returning__delete-returning-star.snap
│ │ │ │ │ ├── returning__insert-returning-expr.snap
│ │ │ │ │ ├── returning__insert-returning-star.snap
│ │ │ │ │ ├── returning__update-returning-expr.snap
│ │ │ │ │ ├── returning__update-returning-star.snap
│ │ │ │ │ └── returning__upsert-returning.snap
│ │ │ │ ├── setops/
│ │ │ │ │ ├── setops.sqltest
│ │ │ │ │ └── snapshots/
│ │ │ │ │ ├── setops__compound-mixed-union.snap
│ │ │ │ │ ├── setops__compound-union-all-three-way.snap
│ │ │ │ │ ├── setops__compound-union-except.snap
│ │ │ │ │ ├── setops__compound-union-intersect.snap
│ │ │ │ │ ├── setops__except-basic.snap
│ │ │ │ │ ├── setops__except-multiple-columns.snap
│ │ │ │ │ ├── setops__intersect-basic.snap
│ │ │ │ │ ├── setops__intersect-multiple-columns.snap
│ │ │ │ │ ├── setops__subquery-with-union.snap
│ │ │ │ │ ├── setops__union-all-basic.snap
│ │ │ │ │ ├── setops__union-all-filtered.snap
│ │ │ │ │ ├── setops__union-distinct.snap
│ │ │ │ │ ├── setops__union-explicit-distinct.snap
│ │ │ │ │ ├── setops__union-subquery-aggregation.snap
│ │ │ │ │ └── setops__union-with-limit.snap
│ │ │ │ ├── sorting/
│ │ │ │ │ ├── snapshots/
│ │ │ │ │ │ ├── sorting__large-offset-small-limit.snap
│ │ │ │ │ │ ├── sorting__limit-with-offset.snap
│ │ │ │ │ │ ├── sorting__limit-without-order.snap
│ │ │ │ │ │ ├── sorting__order-by-desc.snap
│ │ │ │ │ │ ├── sorting__order-by-expression.snap
│ │ │ │ │ │ ├── sorting__order-by-index-with-range.snap
│ │ │ │ │ │ ├── sorting__order-by-limit-one.snap
│ │ │ │ │ │ ├── sorting__order-by-mixed-direction.snap
│ │ │ │ │ │ ├── sorting__order-by-multiple-columns.snap
│ │ │ │ │ │ ├── sorting__order-by-nullable-desc.snap
│ │ │ │ │ │ ├── sorting__order-by-single-column.snap
│ │ │ │ │ │ ├── sorting__order-by-with-index.snap
│ │ │ │ │ │ ├── sorting__order-by-with-limit.snap
│ │ │ │ │ │ ├── sorting__order-by-with-nulls.snap
│ │ │ │ │ │ ├── sorting__order-by-with-where.snap
│ │ │ │ │ │ ├── sorting__sort-elim-all-eq-order-non-index.snap
│ │ │ │ │ │ ├── sorting__sort-elim-eq-col-desc-direction.snap
│ │ │ │ │ │ ├── sorting__sort-elim-eq-prefix-order-suffix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-expr-index-eq-prefix-order-suffix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-expr-index-group-by-eq-prefix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-left-join-outer-rowid-suffix.snap
│ │ │ │ │ │ ├── sorting__sort-elim-no-eq-order-non-leading.snap
│ │ │ │ │ │ ├── sorting__sort-elim-range-prefix-order-suffix.snap
│ │ │ │ │ │ └── sorting__sort-elim-two-eq-order-last.snap
│ │ │ │ │ └── sorting.sqltest
│ │ │ │ ├── subqueries/
│ │ │ │ │ ├── snapshots/
│ │ │ │ │ │ ├── subqueries__correlated-subquery-count.snap
│ │ │ │ │ │ ├── subqueries__correlated-subquery-salary.snap
│ │ │ │ │ │ ├── subqueries__correlated-subquery-where.snap
│ │ │ │ │ │ ├── subqueries__cte-aggregation.snap
│ │ │ │ │ │ ├── subqueries__cte-correlated-range-probe.snap
│ │ │ │ │ │ ├── subqueries__cte-in-subquery-and-main.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-aggregate-opposite-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-aggregate-same-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-all-flipped.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-mixed-clean-flip.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-partial-mismatch.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-multi-col-same-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-outer-beyond-cte.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-prefix-match.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-reused-opposite-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-order-reused-same-dir.snap
│ │ │ │ │ │ ├── subqueries__cte-materialized-scalar-probe.snap
│ │ │ │ │ │ ├── subqueries__cte-multiple-chained.snap
│ │ │ │ │ │ ├── subqueries__cte-multiple-independent.snap
│ │ │ │ │ │ ├── subqueries__cte-referenced-multiple-times.snap
│ │ │ │ │ │ ├── subqueries__cte-referencing-previous.snap
│ │ │ │ │ │ ├── subqueries__cte-self-join.snap
│ │ │ │ │ │ ├── subqueries__cte-simple.snap
│ │ │ │ │ │ ├── subqueries__cte-with-correlated-subquery.snap
│ │ │ │ │ │ ├── subqueries__cte-with-exists.snap
│ │ │ │ │ │ ├── subqueries__delete-returning-target-selfread.snap
│ │ │ │ │ │ ├── subqueries__derived-table-join.snap
│ │ │ │ │ │ ├── subqueries__derived-table-nested.snap
│ │ │ │ │ │ ├── subqueries__derived-table-simple.snap
│ │ │ │ │ │ ├── subqueries__exists-correlated.snap
│ │ │ │ │ │ ├── subqueries__exists-multiple-conditions.snap
│ │ │ │ │ │ ├── subqueries__grouped-correlated-subquery-having.snap
│ │ │ │ │ │ ├── subqueries__grouped-correlated-subquery-order-by.snap
│ │ │ │ │ │ ├── subqueries__in-subquery-aggregation.snap
│ │ │ │ │ │ ├── subqueries__in-subquery-simple.snap
│ │ │ │ │ │ ├── subqueries__not-exists-never-ordered.snap
│ │ │ │ │ │ ├── subqueries__not-exists-no-orders.snap
│ │ │ │ │ │ ├── subqueries__not-in-subquery.snap
│ │ │ │ │ │ ├── subqueries__run-length-current-window.snap
│ │ │ │ │ │ ├── subqueries__run-length-longest-window.snap
│ │ │ │ │ │ ├── subqueries__scalar-subquery-cross-table.snap
│ │ │ │ │ │ ├── subqueries__scalar-subquery-max-price.snap
│ │ │ │ │ │ ├── subqueries__scalar-subquery-simple-count.snap
│ │ │ │ │ │ ├── subqueries__subquery-within-cte.snap
│ │ │ │ │ │ ├── subqueries__update-returning-target-selfread.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-multi-hop-outer-orderby-elided.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-elided-by-cte.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-elided-by-group.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-not-elided-no-cte-order.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-outer-orderby-not-elided-partial.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-elided-by-cte-order.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-elided-by-group.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-elided-multi-hop.snap
│ │ │ │ │ │ ├── subquery-sort-elision__eqp-window-sort-not-elided-no-cte-order.snap
│ │ │ │ │ │ └── subquery-sort-elision__eqp-window-sort-not-elided-partial.snap
│ │ │ │ │ ├── subqueries.sqltest
│ │ │ │ │ └── subquery-sort-elision.sqltest
│ │ │ │ ├── tpch/
│ │ │ │ │ ├── snapshots/
│ │ │ │ │ │ ├── tpch__q1-pricing-summary.snap
│ │ │ │ │ │ ├── tpch__q10-returned-item.snap
│ │ │ │ │ │ ├── tpch__q11-important-stock.snap
│ │ │ │ │ │ ├── tpch__q12-shipping-modes.snap
│ │ │ │ │ │ ├── tpch__q13-customer-distribution.snap
│ │ │ │ │ │ ├── tpch__q14-promotion-effect.snap
│ │ │ │ │ │ ├── tpch__q15-top-supplier.snap
│ │ │ │ │ │ ├── tpch__q16-parts-supplier.snap
│ │ │ │ │ │ ├── tpch__q17-small-quantity-order.snap
│ │ │ │ │ │ ├── tpch__q18-large-volume-customer.snap
│ │ │ │ │ │ ├── tpch__q19-discounted-revenue.snap
│ │ │ │ │ │ ├── tpch__q2-minimum-cost-supplier.snap
│ │ │ │ │ │ ├── tpch__q20-potential-part-promotion.snap
│ │ │ │ │ │ ├── tpch__q21-suppliers-kept-waiting.snap
│ │ │ │ │ │ ├── tpch__q22-global-sales-opportunity.snap
│ │ │ │ │ │ ├── tpch__q3-shipping-priority.snap
│ │ │ │ │ │ ├── tpch__q4-order-priority.snap
│ │ │ │ │ │ ├── tpch__q5-local-supplier-volume.snap
│ │ │ │ │ │ ├── tpch__q6-forecasting-revenue.snap
│ │ │ │ │ │ ├── tpch__q7-volume-shipping.snap
│ │ │ │ │ │ ├── tpch__q8-national-market-share.snap
│ │ │ │ │ │ └── tpch__q9-product-type-profit.snap
│ │ │ │ │ └── tpch.sqltest
│ │ │ │ └── windows/
│ │ │ │ ├── snapshots/
│ │ │ │ │ ├── windows__aggregate-windows.snap
│ │ │ │ │ ├── windows__multiple-windows.snap
│ │ │ │ │ ├── windows__percent-of-total.snap
│ │ │ │ │ ├── windows__row-number-basic.snap
│ │ │ │ │ ├── windows__running-total.snap
│ │ │ │ │ ├── windows__window-order-by.snap
│ │ │ │ │ ├── windows__window-over-grouped.snap
│ │ │ │ │ └── windows__window-with-subquery.snap
│ │ │ │ └── windows.sqltest
│ │ │ ├── snapshots/
│ │ │ │ ├── cte_cardinality__cte-graph-traversal-multi-index-or.snap
│ │ │ │ ├── cte_cardinality__small-cte-materialized-big-cte-outer.snap
│ │ │ │ ├── cte_cardinality__small-cte-reordered-to-outer.snap
│ │ │ │ ├── cte_cardinality__small-subquery-reordered-to-outer.snap
│ │ │ │ ├── cte_cardinality__three-ctes-big-outer-others-materialized.snap
│ │ │ │ ├── graph_traversal_text_pk__cte-neighbor-traversal-text-pk.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-and-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-compound-or-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-or-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-or-one-row-subset-access-shape.snap
│ │ │ │ ├── multi_index_dml__delete-multi-index-or-two-row-subset-access-shape.snap
│ │ │ │ ├── multi_index_dml__multi-index-or-access-shape.snap
│ │ │ │ ├── multi_index_dml__update-multi-index-and-access-shape.snap
│ │ │ │ ├── multi_index_dml__update-multi-index-or-access-shape.snap
│ │ │ │ ├── multi_index_intersection__composite-index-preferred-over-intersection-eqp.snap
│ │ │ │ ├── multi_index_intersection__multi-index-and-2-way-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-benchmark-shape-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-compound-branch-seek-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-correlated-subquery-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-cross-table-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-mixed-residual-eqp.snap
│ │ │ │ ├── multi_index_or_compound__compound-or-rowid-branch-eqp.snap
│ │ │ │ ├── multi_index_or_join__cte-join-with-or-plan.snap
│ │ │ │ ├── multi_index_or_join__multi-index-or-in-join-parenthesized-plan.snap
│ │ │ │ └── multi_index_or_join__multi-index-or-in-join-plan.snap
│ │ │ ├── strict.sqltest
│ │ │ ├── subquery/
│ │ │ │ ├── cte_chain_regression.sqltest
│ │ │ │ ├── cte_materialization_adversarial.sqltest
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── expressions.sqltest
│ │ │ │ ├── materialized_cte_seek.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ └── subquery_cte_equivalence_tests.sqltest
│ │ │ ├── total-changes.sqltest
│ │ │ ├── transactions.sqltest
│ │ │ ├── trigger-before-insert-affinity.sqltest
│ │ │ ├── trigger-last-insert-rowid.sqltest
│ │ │ ├── trigger-quoted-identifiers.sqltest
│ │ │ ├── trigger-virtual-table-innocuous.sqltest
│ │ │ ├── trigger.sqltest
│ │ │ ├── trigger_attach_regression.sqltest
│ │ │ ├── trigger_fk_cascade.sqltest
│ │ │ ├── trigger_on_conflict.sqltest
│ │ │ ├── unnest-exists.sqltest
│ │ │ ├── update-returning-correlated-subquery.sqltest
│ │ │ ├── update.sqltest
│ │ │ ├── update_attached_db_index.sqltest
│ │ │ ├── update_expression_index.sqltest
│ │ │ ├── update_expression_index_affinity.sqltest
│ │ │ ├── update_index_affinity.sqltest
│ │ │ ├── update_or_replace_rowid_secondary_index.sqltest
│ │ │ ├── upsert-expr-index.sqltest
│ │ │ ├── upsert.sqltest
│ │ │ ├── vacuum_into.sqltest
│ │ │ ├── values.sqltest
│ │ │ ├── view-rowid.sqltest
│ │ │ ├── views.sqltest
│ │ │ ├── virtual-table-left-join.sqltest
│ │ │ ├── where/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── memory.sqltest
│ │ │ │ └── small.sqltest
│ │ │ ├── window/
│ │ │ │ ├── default.sqltest
│ │ │ │ ├── group-by-order-by-partition.sqltest
│ │ │ │ └── memory.sqltest
│ │ │ ├── window-agg-row-value.sqltest
│ │ │ └── window-selfjoin-reset-sorter.sqltest
│ │ └── turso-tests/
│ │ ├── alter_column.sqltest
│ │ ├── analyze.sqltest
│ │ ├── array-bugs.sqltest
│ │ ├── array-edge-cases.sqltest
│ │ ├── array.sqltest
│ │ ├── attach/
│ │ │ ├── cross_db_views_rejection.sqltest
│ │ │ ├── default.sqltest
│ │ │ ├── memory.sqltest
│ │ │ ├── small.sqltest
│ │ │ └── writes.sqltest
│ │ ├── builtin_pg_types.sqltest
│ │ ├── custom_type_alter_default.sqltest
│ │ ├── custom_type_datetime_validation.sqltest
│ │ ├── custom_type_default_values.sqltest
│ │ ├── custom_type_deterministic.sqltest
│ │ ├── custom_type_expr_index.sqltest
│ │ ├── custom_type_notnull_decode.sqltest
│ │ ├── custom_type_operators.sqltest
│ │ ├── custom_type_ordering.sqltest
│ │ ├── custom_type_upsert_trigger.sqltest
│ │ ├── custom_types.sqltest
│ │ ├── custom_types_fk_cascade.sqltest
│ │ ├── custom_types_non_strict.sqltest
│ │ ├── fts.sqltest
│ │ ├── json_object_star.sqltest
│ │ ├── materialized_view_text_arithmetic.sqltest
│ │ ├── materialized_views.sqltest
│ │ ├── matview_create_same_txn.sqltest
│ │ ├── matview_insert_or_replace.sqltest
│ │ ├── matview_integrity_check.sqltest
│ │ ├── multi-column-subquery-comparison.sqltest
│ │ ├── mvcc_feature_compat.sqltest
│ │ ├── mvcc_left_join_null_row.sqltest
│ │ ├── on_conflict_constraint.sqltest
│ │ ├── placeholder.sqltest
│ │ ├── raise.sqltest
│ │ ├── regexp.sqltest
│ │ ├── row-value-adversarial.sqltest
│ │ ├── strict_check_types.sqltest
│ │ ├── strict_custom_type_input_validation.sqltest
│ │ ├── time.sqltest
│ │ └── vector.sqltest
│ ├── stress/
│ │ ├── Cargo.toml
│ │ ├── Dockerfile.antithesis-config
│ │ ├── docker-compose.yaml
│ │ ├── docker-entrypoint.sh
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── opts.rs
│ │ ├── run-miri.sh
│ │ └── tests/
│ │ └── shuttle_mvcc.rs
│ ├── stress-go/
│ │ ├── README.md
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── main.go
│ ├── system/
│ │ ├── all.test
│ │ ├── gen-bigass-database.py
│ │ ├── gen-database.py
│ │ ├── tester.tcl
│ │ └── vtab.test
│ └── unreliable-libc/
│ ├── Makefile
│ └── file.c
├── tests/
│ ├── Cargo.toml
│ ├── README.md
│ ├── fuzz/
│ │ ├── cte.rs
│ │ ├── custom_types.rs
│ │ ├── expression_index.rs
│ │ ├── grammar_generator.rs
│ │ ├── helpers.rs
│ │ ├── join.rs
│ │ ├── journal_mode.rs
│ │ ├── mod.rs
│ │ ├── orderby_collation.rs
│ │ ├── raise.rs
│ │ ├── rowid_alias.rs
│ │ ├── savepoint.rs
│ │ ├── subjournal.rs
│ │ ├── subquery.rs
│ │ └── test_join_optimizer.rs
│ ├── integration/
│ │ ├── assert_details.rs
│ │ ├── common.rs
│ │ ├── conflict_resolution.rs
│ │ ├── custom_types.rs
│ │ ├── functions/
│ │ │ ├── mod.rs
│ │ │ ├── test_cdc.rs
│ │ │ ├── test_function_rowid.rs
│ │ │ ├── test_sum.rs
│ │ │ ├── test_uuid.rs
│ │ │ └── test_wal_api.rs
│ │ ├── fuzz_transaction/
│ │ │ └── mod.rs
│ │ ├── index_method/
│ │ │ └── mod.rs
│ │ ├── integrity_check.rs
│ │ ├── mod.rs
│ │ ├── mvcc.rs
│ │ ├── pragma.rs
│ │ ├── query_processing/
│ │ │ ├── encryption.rs
│ │ │ ├── mod.rs
│ │ │ ├── test_alter_table_reopen.rs
│ │ │ ├── test_btree.rs
│ │ │ ├── test_ddl.rs
│ │ │ ├── test_expr_index.rs
│ │ │ ├── test_hash_join_materialization.rs
│ │ │ ├── test_materialized_subquery.rs
│ │ │ ├── test_multi_thread.rs
│ │ │ ├── test_page1.rs
│ │ │ ├── test_read_path.rs
│ │ │ ├── test_schema_updated.rs
│ │ │ ├── test_transactions.rs
│ │ │ ├── test_type_affinity.rs
│ │ │ ├── test_vacuum.rs
│ │ │ └── test_write_path.rs
│ │ ├── statement_reset.rs
│ │ ├── stmt_journal.rs
│ │ ├── storage/
│ │ │ ├── autovacuum.rs
│ │ │ ├── checksum.rs
│ │ │ ├── header_version.rs
│ │ │ ├── mod.rs
│ │ │ └── short_read.rs
│ │ ├── trigger.rs
│ │ └── wal/
│ │ ├── mod.rs
│ │ └── test_wal.rs
│ └── lib.rs
├── tlaplus/
│ └── sqlite-tx/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── SqliteTx.cfg
│ └── SqliteTx.tla
└── tools/
└── dbhash/
├── Cargo.toml
├── README.md
├── src/
│ ├── encoder.rs
│ ├── lib.rs
│ └── main.rs
└── tests/
├── README.md
└── sqlite_compat.rs
Showing preview only (1,617K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (18192 symbols across 374 files)
FILE: bindings/dotnet/rs_src/lib.rs
type Error (line 13) | type Error = *const std::ffi::c_char;
type Database (line 16) | pub struct Database {
type ValueType (line 23) | pub enum ValueType {
type Array (line 34) | pub struct Array {
type TursoValue (line 50) | pub struct TursoValue {
function allocate (line 55) | pub fn allocate<T>(value: T) -> *const T {
function allocate_string (line 59) | pub fn allocate_string(str: &str) -> *const c_char {
function to_vec (line 63) | pub fn to_vec(array: Array) -> Vec<u8> {
function to_value (line 70) | pub fn to_value(value: TursoValue) -> Value {
function db_open (line 98) | pub unsafe extern "C" fn db_open(
function db_open_with_encryption (line 133) | pub unsafe extern "C" fn db_open_with_encryption(
function db_close (line 249) | pub unsafe extern "C" fn db_close(db_ptr: *mut Database) {
function free_string (line 260) | pub unsafe extern "C" fn free_string(string_ptr: *mut c_char) {
function db_prepare_statement (line 274) | pub unsafe extern "C" fn db_prepare_statement(
function bind_parameter (line 302) | pub unsafe extern "C" fn bind_parameter(
function bind_named_parameter (line 322) | pub unsafe extern "C" fn bind_named_parameter(
function db_statement_nchange (line 349) | pub unsafe extern "C" fn db_statement_nchange(statement_ptr: *mut Statem...
function db_statement_execute_step (line 363) | pub unsafe extern "C" fn db_statement_execute_step(
function free_statement (line 398) | pub unsafe extern "C" fn free_statement(statement_ptr: *mut Statement) {
function db_statement_get_value (line 410) | pub unsafe extern "C" fn db_statement_get_value(
function db_statement_num_columns (line 469) | pub unsafe extern "C" fn db_statement_num_columns(statement_ptr: *mut St...
function db_statement_column_name (line 482) | pub unsafe extern "C" fn db_statement_column_name(
function db_statement_has_rows (line 500) | pub unsafe extern "C" fn db_statement_has_rows(statement_ptr: *mut State...
FILE: bindings/dotnet/src/Benchmarks/Benchmarks.cs
class Benchmarks (line 11) | [MemoryDiagnoser]
method Setup (line 18) | [GlobalSetup]
method TursoSelect (line 34) | [Benchmark]
method SystemSqliteSelect (line 37) | [Benchmark]
method MicrososftSqliteSelect (line 40) | [Benchmark]
method CreateTable (line 43) | private void CreateTable(IDbConnection connection)
method Select (line 54) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
FILE: bindings/dotnet/src/Turso.Raw/Data/TursoNativeArray.cs
type TursoNativeArray (line 5) | [StructLayout(LayoutKind.Sequential)]
FILE: bindings/dotnet/src/Turso.Raw/Data/TursoNativeRowValueUnion.cs
type TursoNativeRowValueUnion (line 5) | [StructLayout(LayoutKind.Explicit)]
FILE: bindings/dotnet/src/Turso.Raw/Data/TursoNativeValue.cs
type TursoNativeValue (line 6) | [StructLayout(LayoutKind.Explicit)]
FILE: bindings/dotnet/src/Turso.Raw/Public/Handles/TursoDatabaseHandle.cs
class TursoDatabaseHandle (line 5) | public class TursoDatabaseHandle() : SafeHandle(IntPtr.Zero, true)
method ReleaseHandle (line 7) | protected override bool ReleaseHandle()
method ThrowIfInvalid (line 13) | public void ThrowIfInvalid()
method FromPtr (line 19) | public static TursoDatabaseHandle FromPtr(IntPtr ptr)
FILE: bindings/dotnet/src/Turso.Raw/Public/Handles/TursoStatementHandle.cs
class TursoStatementHandle (line 5) | public class TursoStatementHandle() : SafeHandle(IntPtr.Zero, true)
method ReleaseHandle (line 7) | protected override bool ReleaseHandle()
method ThrowIfInvalid (line 13) | public void ThrowIfInvalid()
method FromPtr (line 19) | public static TursoStatementHandle FromPtr(IntPtr ptr)
FILE: bindings/dotnet/src/Turso.Raw/Public/TursoBindings.cs
class TursoBindings (line 9) | public static class TursoBindings
method OpenDatabase (line 11) | public static TursoDatabaseHandle OpenDatabase(string path)
method OpenDatabaseWithEncryption (line 29) | public static TursoDatabaseHandle OpenDatabaseWithEncryption(string pa...
method PrepareStatement (line 42) | public static TursoStatementHandle PrepareStatement(TursoDatabaseHandl...
method BindParameter (line 54) | public static void BindParameter(TursoStatementHandle statement, int i...
method BindNamedParameter (line 75) | public static void BindNamedParameter(TursoStatementHandle statement, ...
method Read (line 96) | public static bool Read(TursoStatementHandle statement)
method GetValue (line 106) | public static TursoValue GetValue(TursoStatementHandle statement, int ...
method GetName (line 125) | public static string GetName(TursoStatementHandle statement, int ordinal)
method GetFieldCount (line 141) | public static int GetFieldCount(TursoStatementHandle statement)
method RowsAffected (line 148) | public static int RowsAffected(TursoStatementHandle statement)
method HasRows (line 156) | public static bool HasRows(TursoStatementHandle statement)
method FromValue (line 164) | private static TursoNativeValue FromValue(TursoValue value, out GCHand...
method ToArray (line 194) | private static byte[] ToArray(TursoNativeArray array)
method ThrowException (line 203) | private static void ThrowException(IntPtr errorPtr)
FILE: bindings/dotnet/src/Turso.Raw/Public/Value/TursoEncryptionCipher.cs
type TursoEncryptionCipher (line 6) | public enum TursoEncryptionCipher
class TursoEncryptionCipherExtensions (line 24) | internal static class TursoEncryptionCipherExtensions
method ToRustString (line 26) | public static string ToRustString(this TursoEncryptionCipher cipher)
FILE: bindings/dotnet/src/Turso.Raw/Public/Value/TursoValue.cs
type TursoValue (line 3) | public struct TursoValue
method Empty (line 11) | public static TursoValue Empty() => new() { ValueType = TursoValueType...
method Null (line 12) | public static TursoValue Null() => new() { ValueType = TursoValueType....
method Int (line 13) | public static TursoValue Int(Int64 value) => new() { ValueType = Turso...
method Real (line 14) | public static TursoValue Real(Double value) => new() { ValueType = Tur...
method String (line 15) | public static TursoValue String(string value) => new() { ValueType = T...
method Blob (line 16) | public static TursoValue Blob(byte[] value) => new() { ValueType = Tur...
FILE: bindings/dotnet/src/Turso.Raw/Public/Value/TursoValueType.cs
type TursoValueType (line 3) | public enum TursoValueType
FILE: bindings/dotnet/src/Turso.Raw/TursoInterop.cs
class TursoInterop (line 7) | internal static class TursoInterop
method OpenDatabase (line 11) | [DllImport(DllName, EntryPoint = "db_open", CallingConvention = Callin...
method OpenDatabaseWithEncryption (line 14) | [DllImport(DllName, EntryPoint = "db_open_with_encryption", CallingCon...
method CloseDatabase (line 17) | [DllImport(DllName, EntryPoint = "db_close", CallingConvention = Calli...
method FreeString (line 20) | [DllImport(DllName, EntryPoint = "free_string", CallingConvention = Ca...
method PrepareStatement (line 23) | [DllImport(DllName, EntryPoint = "db_prepare_statement", CallingConven...
method FreeStatement (line 26) | [DllImport(DllName, EntryPoint = "free_statement", CallingConvention =...
method BindParameter (line 29) | [DllImport(DllName, EntryPoint = "bind_parameter", CallingConvention =...
method BindNamedParameter (line 32) | [DllImport(DllName, EntryPoint = "bind_named_parameter", CallingConven...
method StatementExecuteStep (line 35) | [DllImport(DllName, EntryPoint = "db_statement_execute_step", CallingC...
method StatementRowsAffected (line 39) | [DllImport(DllName, EntryPoint = "db_statement_nchange", CallingConven...
method GetValueFromStatement (line 42) | [DllImport(DllName, EntryPoint = "db_statement_get_value", CallingConv...
method StatementNumColumns (line 45) | [DllImport(DllName, EntryPoint = "db_statement_num_columns", CallingCo...
method StatementColumnName (line 48) | [DllImport(DllName, EntryPoint = "db_statement_column_name", CallingCo...
method StatementHasRows (line 51) | [DllImport(DllName, EntryPoint = "db_statement_has_rows", CallingConve...
FILE: bindings/dotnet/src/Turso.Tests/TursoTests.cs
class TursoTests (line 8) | public class TursoTests
method TestSimpleQuery (line 10) | [Test]
method TestPrepareStatement (line 29) | [Test]
method TestDifferentTypes (line 52) | [TestCase("stringValue", TestName = "TestStringValue")]
method TestBindNamedParameter (line 99) | [Test]
method TestInsertData (line 121) | [Test]
method TestFetchSpecificColumns (line 140) | [Test]
method TestQueryError (line 160) | [Test]
method TestCommitTransaction (line 171) | [Test]
method TestRollbackTransaction (line 204) | [Test]
method TestDataReaderEnumerable (line 231) | [Test]
method TestEncryption (line 262) | [Test]
FILE: bindings/dotnet/src/Turso/TursoCommand.cs
class TursoCommand (line 8) | public class TursoCommand : DbCommand
method TursoCommand (line 16) | public TursoCommand(TursoConnection connection, TursoTransaction? tran...
method TursoCommand (line 22) | public TursoCommand(TursoConnection connection, string command)
method Dispose (line 59) | protected override void Dispose(bool disposing)
method Cancel (line 65) | public override void Cancel()
method ExecuteNonQuery (line 69) | public override int ExecuteNonQuery()
method ExecuteScalar (line 76) | public override object? ExecuteScalar()
method Prepare (line 84) | public override void Prepare()
method CreateDbParameter (line 104) | protected override DbParameter CreateDbParameter()
method ExecuteDbDataReader (line 110) | protected override DbDataReader ExecuteDbDataReader(CommandBehavior be...
method Execute (line 115) | private DbDataReader Execute(CommandBehavior behavior = CommandBehavio...
FILE: bindings/dotnet/src/Turso/TursoConnection.cs
class TursoConnection (line 8) | public class TursoConnection : DbConnection
method TursoConnection (line 28) | public TursoConnection() : this("")
method TursoConnection (line 32) | public TursoConnection(string connectionString)
method Open (line 37) | public override void Open()
method Close (line 53) | public override void Close()
method Dispose (line 59) | protected override void Dispose(bool disposing)
method BeginDbTransaction (line 65) | protected override DbTransaction BeginDbTransaction(IsolationLevel iso...
method CreateDbCommand (line 75) | protected override DbCommand CreateDbCommand()
method ExecuteNonQuery (line 85) | public int ExecuteNonQuery(string sql)
method ChangeDatabase (line 93) | public override void ChangeDatabase(string databaseName)
FILE: bindings/dotnet/src/Turso/TursoConnectionOptions.cs
class TursoConnectionOptions (line 5) | public class TursoConnectionOptions
method AddOption (line 10) | private void AddOption(string keyword, string value)
method GetConnectionString (line 20) | public string GetConnectionString()
method GetOption (line 35) | private string? GetOption(string keyword)
method GetEncryptionCipher (line 50) | public TursoEncryptionCipher? GetEncryptionCipher()
method Parse (line 82) | public static TursoConnectionOptions Parse(string connectionString)
FILE: bindings/dotnet/src/Turso/TursoDataReader.cs
class TursoDataReader (line 12) | public class TursoDataReader : DbDataReader
method TursoDataReader (line 17) | public TursoDataReader(TursoCommand command, TursoStatementHandle stat...
method GetBoolean (line 23) | public override bool GetBoolean(int ordinal)
method GetByte (line 28) | public override byte GetByte(int ordinal)
method GetBytes (line 33) | public override long GetBytes(int ordinal, long dataOffset, byte[]? bu...
method GetChar (line 38) | public override char GetChar(int ordinal)
method GetChars (line 49) | public override long GetChars(int ordinal, long dataOffset, char[]? bu...
method GetDataTypeName (line 54) | public override string GetDataTypeName(int ordinal)
method GetDateTime (line 60) | public override DateTime GetDateTime(int ordinal)
method GetDecimal (line 72) | public override decimal GetDecimal(int ordinal)
method GetDouble (line 77) | public override double GetDouble(int ordinal)
method GetFieldType (line 82) | public override Type GetFieldType(int ordinal)
method GetFloat (line 95) | public override float GetFloat(int ordinal)
method GetGuid (line 100) | public override Guid GetGuid(int ordinal)
method GetInt16 (line 105) | public override short GetInt16(int ordinal)
method GetInt32 (line 110) | public override int GetInt32(int ordinal)
method GetInt64 (line 115) | public override long GetInt64(int ordinal)
method GetName (line 120) | public override string GetName(int ordinal)
method GetOrdinal (line 125) | public override int GetOrdinal(string name)
method GetString (line 138) | public override string GetString(int ordinal)
method GetValue (line 143) | public override object? GetValue(int ordinal)
method GetValues (line 157) | public override int GetValues(object[] values)
method IsDBNull (line 168) | public override bool IsDBNull(int ordinal)
method NextResult (line 191) | public override bool NextResult()
method Dispose (line 197) | protected override void Dispose(bool disposing)
method Read (line 203) | public override bool Read()
method GetEnumerator (line 210) | public override IEnumerator GetEnumerator()
method GetArray (line 215) | private long GetArray<T>(int ordinal, long dataOffset, T[]? buffer, in...
method GetTypeName (line 236) | private static string GetTypeName(TursoValueType valueType)
FILE: bindings/dotnet/src/Turso/TursoParameter.cs
class TursoParameter (line 7) | public class TursoParameter : DbParameter
method TursoParameter (line 36) | public TursoParameter()
method TursoParameter (line 40) | public TursoParameter(object value)
method TursoParameter (line 45) | public TursoParameter(string parameterName, object value)
method TursoParameter (line 51) | public TursoParameter(string parameterName, DbType dbType, object value)
method ResetDbType (line 58) | public override void ResetDbType()
method ToValue (line 82) | public TursoValue ToValue()
method GetTursoValue (line 106) | private TursoValue GetTursoValue(object value, TursoValueType tursoVal...
FILE: bindings/dotnet/src/Turso/TursoParameterCollection.cs
class TursoParameterCollection (line 6) | public class TursoParameterCollection : DbParameterCollection
method Add (line 13) | public override int Add(object value)
method AddWithValue (line 19) | public int AddWithValue(string parameterName, object value)
method AddRange (line 25) | public override void AddRange(Array values)
method Clear (line 35) | public override void Clear()
method Contains (line 40) | public override bool Contains(object value)
method Contains (line 45) | public override bool Contains(string value)
method CopyTo (line 50) | public override void CopyTo(Array array, int index)
method GetEnumerator (line 55) | public override IEnumerator GetEnumerator()
method IndexOf (line 60) | public override int IndexOf(object value)
method IndexOf (line 65) | public override int IndexOf(string parameterName)
method Insert (line 70) | public override void Insert(int index, object value)
method Remove (line 75) | public override void Remove(object value)
method RemoveAt (line 83) | public override void RemoveAt(int index)
method RemoveAt (line 88) | public override void RemoveAt(string parameterName)
method GetParameter (line 97) | protected override DbParameter GetParameter(int index)
method GetParameter (line 102) | protected override DbParameter GetParameter(string parameterName)
method SetParameter (line 108) | protected override void SetParameter(int index, DbParameter value)
method SetParameter (line 114) | protected override void SetParameter(string parameterName, DbParameter...
FILE: bindings/dotnet/src/Turso/TursoTransaction.cs
class TursoTransaction (line 6) | public class TursoTransaction : DbTransaction
method TursoTransaction (line 12) | public TursoTransaction(TursoConnection connection, IsolationLevel iso...
method Dispose (line 23) | protected override void Dispose(bool disposing)
method Commit (line 35) | public override void Commit()
method Rollback (line 41) | public override void Rollback()
method CompleteTransaction (line 53) | private void CompleteTransaction()
FILE: bindings/go/bindings.go
function InitLibrary (line 12) | func InitLibrary(strategy turso_libs.LoadTursoLibraryConfig) {
FILE: bindings/go/bindings_db.go
constant DefaultBusyTimeout (line 28) | DefaultBusyTimeout = 5000
type TursoStatusCode (line 31) | type TursoStatusCode
constant TURSO_OK (line 34) | TURSO_OK TursoStatusCode = 0
constant TURSO_DONE (line 35) | TURSO_DONE TursoStatusCode = 1
constant TURSO_ROW (line 36) | TURSO_ROW TursoStatusCode = 2
constant TURSO_IO (line 37) | TURSO_IO TursoStatusCode = 3
constant TURSO_BUSY (line 38) | TURSO_BUSY TursoStatusCode = 4
constant TURSO_INTERRUPT (line 39) | TURSO_INTERRUPT TursoStatusCode = 5
constant TURSO_ERROR (line 40) | TURSO_ERROR TursoStatusCode = 127
constant TURSO_MISUSE (line 41) | TURSO_MISUSE TursoStatusCode = 128
constant TURSO_CONSTRAINT (line 42) | TURSO_CONSTRAINT TursoStatusCode = 129
constant TURSO_READONLY (line 43) | TURSO_READONLY TursoStatusCode = 130
constant TURSO_DATABASE_FULL (line 44) | TURSO_DATABASE_FULL TursoStatusCode = 131
constant TURSO_NOTADB (line 45) | TURSO_NOTADB TursoStatusCode = 132
constant TURSO_CORRUPT (line 46) | TURSO_CORRUPT TursoStatusCode = 133
type TursoType (line 49) | type TursoType
constant TURSO_TYPE_UNKNOWN (line 52) | TURSO_TYPE_UNKNOWN TursoType = 0
constant TURSO_TYPE_INTEGER (line 53) | TURSO_TYPE_INTEGER TursoType = 1
constant TURSO_TYPE_REAL (line 54) | TURSO_TYPE_REAL TursoType = 2
constant TURSO_TYPE_TEXT (line 55) | TURSO_TYPE_TEXT TursoType = 3
constant TURSO_TYPE_BLOB (line 56) | TURSO_TYPE_BLOB TursoType = 4
constant TURSO_TYPE_NULL (line 57) | TURSO_TYPE_NULL TursoType = 5
type TursoTracingLevel (line 60) | type TursoTracingLevel
constant TURSO_TRACING_LEVEL_ERROR (line 63) | TURSO_TRACING_LEVEL_ERROR TursoTracingLevel = 1
constant TURSO_TRACING_LEVEL_WARN (line 64) | TURSO_TRACING_LEVEL_WARN TursoTracingLevel = 2
constant TURSO_TRACING_LEVEL_INFO (line 65) | TURSO_TRACING_LEVEL_INFO TursoTracingLevel = 3
constant TURSO_TRACING_LEVEL_DEBUG (line 66) | TURSO_TRACING_LEVEL_DEBUG TursoTracingLevel = 4
constant TURSO_TRACING_LEVEL_TRACE (line 67) | TURSO_TRACING_LEVEL_TRACE TursoTracingLevel = 5
type turso_database_t (line 71) | type turso_database_t struct
type turso_connection_t (line 72) | type turso_connection_t struct
type turso_statement_t (line 73) | type turso_statement_t struct
type TursoDatabase (line 75) | type TursoDatabase
type TursoConnection (line 76) | type TursoConnection
type TursoStatement (line 77) | type TursoStatement
type TursoLog (line 80) | type TursoLog struct
type TursoConfig (line 89) | type TursoConfig struct
type TursoDatabaseEncryptionOpts (line 95) | type TursoDatabaseEncryptionOpts struct
type TursoDatabaseConfig (line 100) | type TursoDatabaseConfig struct
type turso_slice_ref_t (line 122) | type turso_slice_ref_t struct
type turso_log_t (line 127) | type turso_log_t struct
type turso_config_t (line 136) | type turso_config_t struct
type turso_database_config_t (line 141) | type turso_database_config_t struct
function registerTursoDb (line 194) | func registerTursoDb(handle uintptr) error {
function statusToError (line 234) | func statusToError(status TursoStatusCode, msg string) error {
function decodeAndFreeCString (line 265) | func decodeAndFreeCString(p *byte) string {
function decodeAndFreeCStringRaw (line 269) | func decodeAndFreeCStringRaw(p uintptr) string {
function decodeCStringNoFree (line 288) | func decodeCStringNoFree(p uintptr) string {
function makeCStringBytes (line 305) | func makeCStringBytes(s string) ([]byte, uintptr) {
function init (line 321) | func init() {
function turso_setup (line 344) | func turso_setup(config TursoConfig) error {
function turso_database_new (line 366) | func turso_database_new(config TursoDatabaseConfig) (TursoDatabase, erro...
function turso_database_open (line 407) | func turso_database_open(database TursoDatabase) error {
function turso_database_connect (line 418) | func turso_database_connect(self TursoDatabase) (TursoConnection, error) {
function turso_connection_get_autocommit (line 430) | func turso_connection_get_autocommit(self TursoConnection) bool {
function turso_connection_set_busy_timeout_ms (line 435) | func turso_connection_set_busy_timeout_ms(self TursoConnection, timeoutM...
function turso_connection_last_insert_rowid (line 440) | func turso_connection_last_insert_rowid(self TursoConnection) int64 {
function turso_connection_prepare_single (line 445) | func turso_connection_prepare_single(self TursoConnection, sql string) (...
function turso_connection_prepare_first (line 457) | func turso_connection_prepare_first(self TursoConnection, sql string) (T...
function turso_connection_close (line 470) | func turso_connection_close(self TursoConnection) error {
function turso_statement_execute (line 483) | func turso_statement_execute(self TursoStatement) (TursoStatusCode, uint...
function turso_statement_step (line 497) | func turso_statement_step(self TursoStatement) (TursoStatusCode, error) {
function turso_statement_run_io (line 510) | func turso_statement_run_io(self TursoStatement) error {
function turso_statement_reset (line 523) | func turso_statement_reset(self TursoStatement) error {
function turso_statement_finalize (line 534) | func turso_statement_finalize(self TursoStatement) error {
function turso_statement_n_change (line 545) | func turso_statement_n_change(self TursoStatement) int64 {
function turso_statement_column_count (line 550) | func turso_statement_column_count(self TursoStatement) int64 {
function turso_statement_column_name (line 556) | func turso_statement_column_name(self TursoStatement, index int) string {
function turso_statement_column_decltype (line 564) | func turso_statement_column_decltype(self TursoStatement, index int) str...
function turso_statement_row_value_kind (line 573) | func turso_statement_row_value_kind(self TursoStatement, index int) Turs...
function turso_statement_row_value_bytes_count (line 578) | func turso_statement_row_value_bytes_count(self TursoStatement, index in...
function turso_statement_row_value_bytes_ptr (line 583) | func turso_statement_row_value_bytes_ptr(self TursoStatement, index int)...
function turso_statement_row_value_int (line 588) | func turso_statement_row_value_int(self TursoStatement, index int) int64 {
function turso_statement_row_value_double (line 593) | func turso_statement_row_value_double(self TursoStatement, index int) fl...
function turso_statement_named_position (line 598) | func turso_statement_named_position(self TursoStatement, name string) in...
function turso_statement_parameters_count (line 603) | func turso_statement_parameters_count(self TursoStatement) int64 {
function turso_statement_bind_positional_null (line 608) | func turso_statement_bind_positional_null(self TursoStatement, position ...
function turso_statement_bind_positional_int (line 617) | func turso_statement_bind_positional_int(self TursoStatement, position i...
function turso_statement_bind_positional_double (line 626) | func turso_statement_bind_positional_double(self TursoStatement, positio...
function turso_statement_bind_positional_blob (line 635) | func turso_statement_bind_positional_blob(self TursoStatement, position ...
function turso_statement_bind_positional_text (line 651) | func turso_statement_bind_positional_text(self TursoStatement, position ...
function turso_database_deinit (line 668) | func turso_database_deinit(self TursoDatabase) {
function turso_connection_deinit (line 674) | func turso_connection_deinit(self TursoConnection) {
function turso_statement_deinit (line 680) | func turso_statement_deinit(self TursoStatement) {
function turso_statement_row_value_bytes (line 686) | func turso_statement_row_value_bytes(self TursoStatement, index int) []b...
function turso_statement_row_value_text (line 702) | func turso_statement_row_value_text(self TursoStatement, index int) stri...
FILE: bindings/go/bindings_db_test.go
type dbConn (line 10) | type dbConn struct
function openInMemory (line 15) | func openInMemory(t *testing.T) (*dbConn, func()) {
function prepExec (line 40) | func prepExec(t *testing.T, conn TursoConnection, sql string) uint64 {
function prepStmt (line 53) | func prepStmt(t *testing.T, conn TursoConnection, sql string) TursoState...
function stepRow (line 60) | func stepRow(t *testing.T, stmt TursoStatement) bool {
function TestSetupAndOpenMemory (line 71) | func TestSetupAndOpenMemory(t *testing.T) {
function TestPrepareFirstMultipleStatements (line 83) | func TestPrepareFirstMultipleStatements(t *testing.T) {
function TestInsertReturningMultiplePartialFetchCommits (line 126) | func TestInsertReturningMultiplePartialFetchCommits(t *testing.T) {
function TestInsertReturningWithExplicitTransactionAndPartialFetch (line 153) | func TestInsertReturningWithExplicitTransactionAndPartialFetch(t *testin...
function TestOnConflictDoNothingReturning (line 179) | func TestOnConflictDoNothingReturning(t *testing.T) {
function TestSubqueries (line 206) | func TestSubqueries(t *testing.T) {
function TestJoin (line 229) | func TestJoin(t *testing.T) {
function TestAlterTable (line 261) | func TestAlterTable(t *testing.T) {
function TestGenerateSeries (line 280) | func TestGenerateSeries(t *testing.T) {
function TestJSONFunctionsBindings (line 300) | func TestJSONFunctionsBindings(t *testing.T) {
function TestBindingsPositionalAndNamed (line 320) | func TestBindingsPositionalAndNamed(t *testing.T) {
function TestColumnMetadata (line 392) | func TestColumnMetadata(t *testing.T) {
FILE: bindings/go/bindings_sync.go
type turso_sync_database_t (line 12) | type turso_sync_database_t struct
type turso_sync_operation_t (line 13) | type turso_sync_operation_t struct
type turso_sync_io_item_t (line 14) | type turso_sync_io_item_t struct
type turso_sync_changes_t (line 15) | type turso_sync_changes_t struct
type TursoSyncDatabase (line 17) | type TursoSyncDatabase
type TursoSyncOperation (line 18) | type TursoSyncOperation
type TursoSyncIoItem (line 19) | type TursoSyncIoItem
type TursoSyncChanges (line 20) | type TursoSyncChanges
type TursoSyncIoRequestType (line 24) | type TursoSyncIoRequestType
constant TURSO_SYNC_IO_NONE (line 27) | TURSO_SYNC_IO_NONE TursoSyncIoRequestType = 0
constant TURSO_SYNC_IO_HTTP (line 28) | TURSO_SYNC_IO_HTTP TursoSyncIoRequestType = 1
constant TURSO_SYNC_IO_FULL_READ (line 29) | TURSO_SYNC_IO_FULL_READ TursoSyncIoRequestType = 2
constant TURSO_SYNC_IO_FULL_WRITE (line 30) | TURSO_SYNC_IO_FULL_WRITE TursoSyncIoRequestType = 3
type TursoSyncOperationResultType (line 33) | type TursoSyncOperationResultType
constant TURSO_ASYNC_RESULT_NONE (line 36) | TURSO_ASYNC_RESULT_NONE TursoSyncOperationResultType = 0
constant TURSO_ASYNC_RESULT_CONNECTION (line 37) | TURSO_ASYNC_RESULT_CONNECTION TursoSyncOperationResultType = 1
constant TURSO_ASYNC_RESULT_CHANGES (line 38) | TURSO_ASYNC_RESULT_CHANGES TursoSyncOperationResultType = 2
constant TURSO_ASYNC_RESULT_STATS (line 39) | TURSO_ASYNC_RESULT_STATS TursoSyncOperationResultType = 3
type TursoSyncDatabaseConfig (line 45) | type TursoSyncDatabaseConfig struct
type TursoSyncStats (line 78) | type TursoSyncStats struct
type TursoSyncIoHttpRequest (line 90) | type TursoSyncIoHttpRequest struct
type TursoSyncIoHttpHeader (line 99) | type TursoSyncIoHttpHeader struct
type TursoSyncIoFullReadRequest (line 105) | type TursoSyncIoFullReadRequest struct
type TursoSyncIoFullWriteRequest (line 110) | type TursoSyncIoFullWriteRequest struct
type turso_sync_database_config_t (line 117) | type turso_sync_database_config_t struct
type turso_sync_io_http_request_t (line 132) | type turso_sync_io_http_request_t struct
type turso_sync_io_http_header_t (line 140) | type turso_sync_io_http_header_t struct
type turso_sync_io_full_read_request_t (line 145) | type turso_sync_io_full_read_request_t struct
type turso_sync_io_full_write_request_t (line 149) | type turso_sync_io_full_write_request_t struct
type turso_sync_stats_t (line 154) | type turso_sync_stats_t struct
function registerTursoSync (line 324) | func registerTursoSync(handle uintptr) error {
function sliceRefToBytesCopy (line 359) | func sliceRefToBytesCopy(s turso_slice_ref_t) []byte {
function sliceRefToStringCopy (line 371) | func sliceRefToStringCopy(s turso_slice_ref_t) string {
function turso_sync_database_new (line 382) | func turso_sync_database_new(dbConfig TursoDatabaseConfig, syncConfig Tu...
function turso_sync_database_open (line 441) | func turso_sync_database_open(self TursoSyncDatabase) (TursoSyncOperatio...
function turso_sync_database_create (line 454) | func turso_sync_database_create(self TursoSyncDatabase) (TursoSyncOperat...
function turso_sync_database_connect (line 468) | func turso_sync_database_connect(self TursoSyncDatabase) (TursoSyncOpera...
function turso_sync_database_stats (line 481) | func turso_sync_database_stats(self TursoSyncDatabase) (TursoSyncOperati...
function turso_sync_database_checkpoint (line 494) | func turso_sync_database_checkpoint(self TursoSyncDatabase) (TursoSyncOp...
function turso_sync_database_push_changes (line 507) | func turso_sync_database_push_changes(self TursoSyncDatabase) (TursoSync...
function turso_sync_database_wait_changes (line 520) | func turso_sync_database_wait_changes(self TursoSyncDatabase) (TursoSync...
function turso_sync_database_apply_changes (line 538) | func turso_sync_database_apply_changes(self TursoSyncDatabase, changes T...
function turso_sync_operation_resume (line 551) | func turso_sync_operation_resume(self TursoSyncOperation) (TursoStatusCo...
function turso_sync_operation_result_kind (line 564) | func turso_sync_operation_result_kind(self TursoSyncOperation) TursoSync...
function turso_sync_operation_result_extract_connection (line 569) | func turso_sync_operation_result_extract_connection(self TursoSyncOperat...
function turso_sync_operation_result_extract_changes (line 580) | func turso_sync_operation_result_extract_changes(self TursoSyncOperation...
function turso_sync_operation_result_extract_stats (line 590) | func turso_sync_operation_result_extract_stats(self TursoSyncOperation) ...
function turso_sync_database_io_take_item (line 610) | func turso_sync_database_io_take_item(self TursoSyncDatabase) (TursoSync...
function turso_sync_database_io_step_callbacks (line 622) | func turso_sync_database_io_step_callbacks(self TursoSyncDatabase) error {
function turso_sync_database_io_request_kind (line 633) | func turso_sync_database_io_request_kind(self TursoSyncIoItem) TursoSync...
function turso_sync_database_io_request_http (line 638) | func turso_sync_database_io_request_http(self TursoSyncIoItem) (TursoSyn...
function turso_sync_database_io_request_http_header (line 654) | func turso_sync_database_io_request_http_header(self TursoSyncIoItem, in...
function turso_sync_database_io_request_full_read (line 667) | func turso_sync_database_io_request_full_read(self TursoSyncIoItem) (Tur...
function turso_sync_database_io_request_full_write (line 677) | func turso_sync_database_io_request_full_write(self TursoSyncIoItem) (Tu...
function turso_sync_database_io_poison (line 690) | func turso_sync_database_io_poison(self TursoSyncIoItem, errMsg string) ...
function turso_sync_database_io_status (line 708) | func turso_sync_database_io_status(self TursoSyncIoItem, statusCode int)...
function turso_sync_database_io_push_buffer (line 717) | func turso_sync_database_io_push_buffer(self TursoSyncIoItem, buffer []b...
function turso_sync_database_io_done (line 733) | func turso_sync_database_io_done(self TursoSyncIoItem) error {
function turso_sync_database_deinit (line 742) | func turso_sync_database_deinit(self TursoSyncDatabase) {
function turso_sync_operation_deinit (line 747) | func turso_sync_operation_deinit(self TursoSyncOperation) {
function turso_sync_database_io_item_deinit (line 752) | func turso_sync_database_io_item_deinit(self TursoSyncIoItem) {
function turso_sync_changes_deinit (line 757) | func turso_sync_changes_deinit(self TursoSyncChanges) {
FILE: bindings/go/driver_db.go
type tursoDbDriver (line 29) | type tursoDbDriver struct
method Open (line 91) | func (d *tursoDbDriver) Open(dsn string) (driver.Conn, error) {
type tursoDbConnection (line 31) | type tursoDbConnection struct
method Prepare (line 143) | func (c *tursoDbConnection) Prepare(query string) (driver.Stmt, error) {
method PrepareContext (line 147) | func (c *tursoDbConnection) PrepareContext(ctx context.Context, query ...
method Close (line 173) | func (c *tursoDbConnection) Close() error {
method Begin (line 193) | func (c *tursoDbConnection) Begin() (driver.Tx, error) {
method BeginTx (line 197) | func (c *tursoDbConnection) BeginTx(ctx context.Context, _ driver.TxOp...
method Ping (line 209) | func (c *tursoDbConnection) Ping(ctx context.Context) error {
method ExecContext (line 221) | func (c *tursoDbConnection) ExecContext(ctx context.Context, query str...
method QueryContext (line 280) | func (c *tursoDbConnection) QueryContext(ctx context.Context, query st...
method checkOpen (line 308) | func (c *tursoDbConnection) checkOpen() error {
method SetBusyTimeout (line 320) | func (c *tursoDbConnection) SetBusyTimeout(timeoutMs int) error {
method GetBusyTimeout (line 336) | func (c *tursoDbConnection) GetBusyTimeout() int {
method executeFully (line 657) | func (c *tursoDbConnection) executeFully(ctx context.Context, stmt Tur...
type tursoDbStatement (line 43) | type tursoDbStatement struct
method Close (line 444) | func (s *tursoDbStatement) Close() error {
method NumInput (line 449) | func (s *tursoDbStatement) NumInput() int {
method Exec (line 453) | func (s *tursoDbStatement) Exec(args []driver.Value) (driver.Result, e...
method ExecContext (line 461) | func (s *tursoDbStatement) ExecContext(ctx context.Context, args []dri...
method Query (line 468) | func (s *tursoDbStatement) Query(args []driver.Value) (driver.Rows, er...
method QueryContext (line 476) | func (s *tursoDbStatement) QueryContext(ctx context.Context, args []dr...
type tursoDbRows (line 50) | type tursoDbRows struct
method Columns (line 488) | func (r *tursoDbRows) Columns() []string {
method Close (line 504) | func (r *tursoDbRows) Close() error {
method Next (line 514) | func (r *tursoDbRows) Next(dest []driver.Value) error {
type tursoDbResult (line 60) | type tursoDbResult struct
method LastInsertId (line 589) | func (r *tursoDbResult) LastInsertId() (int64, error) {
method RowsAffected (line 593) | func (r *tursoDbResult) RowsAffected() (int64, error) {
type tursoDbTx (line 65) | type tursoDbTx struct
method Commit (line 601) | func (tx *tursoDbTx) Commit() error {
method Rollback (line 610) | func (tx *tursoDbTx) Rollback() error {
function init (line 71) | func init() {
function NewConnection (line 77) | func NewConnection(conn TursoConnection, extraIo func() error) *tursoDbC...
function Setup (line 85) | func Setup(config TursoConfig) error {
type ConnectorOption (line 345) | type ConnectorOption
function WithBusyTimeout (line 349) | func WithBusyTimeout(ms int) ConnectorOption {
type TursoConnector (line 356) | type TursoConnector struct
method Connect (line 375) | func (c *TursoConnector) Connect(ctx context.Context) (driver.Conn, er...
method Driver (line 428) | func (c *TursoConnector) Driver() driver.Driver {
function NewConnector (line 363) | func NewConnector(dsn string, opts ...ConnectorOption) (*TursoConnector,...
function parseDSN (line 622) | func parseDSN(dsn string) (TursoDatabaseConfig, error) {
function bindArgs (line 739) | func bindArgs(stmt TursoStatement, args []driver.NamedValue) error {
function bindOne (line 774) | func bindOne(stmt TursoStatement, position int, v any) error {
function isTimeColumn (line 830) | func isTimeColumn(decltype string) bool {
function parseTimeString (line 856) | func parseTimeString(s string) (time.Time, error) {
FILE: bindings/go/driver_db_test.go
function openMem (line 25) | func openMem(t *testing.T) *sql.DB {
function TestMain (line 35) | func TestMain(m *testing.M) {
function TestEncryption (line 54) | func TestEncryption(t *testing.T) {
function TestInsertData (line 141) | func TestInsertData(t *testing.T) {
function TestQuery (line 148) | func TestQuery(t *testing.T) {
function TestFunctions (line 196) | func TestFunctions(t *testing.T) {
function TestDuplicateConnection (line 257) | func TestDuplicateConnection(t *testing.T) {
function TestDuplicateConnection2 (line 285) | func TestDuplicateConnection2(t *testing.T) {
function TestConnectionError (line 315) | func TestConnectionError(t *testing.T) {
function TestStatementError (line 331) | func TestStatementError(t *testing.T) {
function TestDriverRowsErrorMessages (line 350) | func TestDriverRowsErrorMessages(t *testing.T) {
function TestTransaction (line 379) | func TestTransaction(t *testing.T) {
function TestVectorOperations (line 449) | func TestVectorOperations(t *testing.T) {
function TestSQLFeatures (line 482) | func TestSQLFeatures(t *testing.T) {
function TestDateTimeFunctions (line 582) | func TestDateTimeFunctions(t *testing.T) {
function TestMathFunctions (line 612) | func TestMathFunctions(t *testing.T) {
function TestJSONFunctions (line 643) | func TestJSONFunctions(t *testing.T) {
function TestParameterOrdering (line 676) | func TestParameterOrdering(t *testing.T) {
function TestLimitOffsetParameters (line 749) | func TestLimitOffsetParameters(t *testing.T) {
function TestIndex (line 783) | func TestIndex(t *testing.T) {
function slicesAreEq (line 827) | func slicesAreEq(a, b []byte) bool {
function createTable (line 843) | func createTable(conn *sql.DB) error {
function insertData (line 854) | func insertData(conn *sql.DB) error {
function TestNullHandling (line 869) | func TestNullHandling(t *testing.T) {
function mustExec (line 933) | func mustExec(t *testing.T, db *sql.DB, q string, args ...any) sql.Result {
function TestLastInsertIDAndRowsAffected (line 942) | func TestLastInsertIDAndRowsAffected(t *testing.T) {
function TestDataTypes (line 963) | func TestDataTypes(t *testing.T) {
function createDatabasesTable (line 1040) | func createDatabasesTable(t *testing.T, db *sql.DB) {
function TestUpsertReturning_databaseSQL_Prepared (line 1062) | func TestUpsertReturning_databaseSQL_Prepared(t *testing.T) {
function TestInsertReturning (line 1121) | func TestInsertReturning(t *testing.T) {
function TestUpsertReturning_databaseSQL_Prepared_ArgCountMismatch (line 1145) | func TestUpsertReturning_databaseSQL_Prepared_ArgCountMismatch(t *testin...
function TestMultiStatementExecution (line 1185) | func TestMultiStatementExecution(t *testing.T) {
function TestTimeValueRoundtrip (line 1337) | func TestTimeValueRoundtrip(t *testing.T) {
function TestBusyTimeoutDefault (line 1439) | func TestBusyTimeoutDefault(t *testing.T) {
function TestBusyTimeoutDSN (line 1461) | func TestBusyTimeoutDSN(t *testing.T) {
function TestBusyTimeoutDisabled (line 1482) | func TestBusyTimeoutDisabled(t *testing.T) {
function TestBusyTimeoutRuntimeChange (line 1503) | func TestBusyTimeoutRuntimeChange(t *testing.T) {
function TestBusyTimeoutConnector (line 1535) | func TestBusyTimeoutConnector(t *testing.T) {
function TestBusyTimeoutConcurrentWrites (line 1598) | func TestBusyTimeoutConcurrentWrites(t *testing.T) {
function TestParallelSelectColumnsConcurrency (line 1648) | func TestParallelSelectColumnsConcurrency(t *testing.T) {
FILE: bindings/go/driver_sync.go
type TursoPartialSyncConfig (line 23) | type TursoPartialSyncConfig struct
type TursoSyncDbConfig (line 37) | type TursoSyncDbConfig struct
type TursoSyncDbStats (line 80) | type TursoSyncDbStats struct
type TursoSyncDb (line 103) | type TursoSyncDb struct
method Connect (line 244) | func (d *TursoSyncDb) Connect(ctx context.Context) (*sql.DB, error) {
method Pull (line 253) | func (d *TursoSyncDb) Pull(ctx context.Context) (bool, error) {
method Push (line 295) | func (d *TursoSyncDb) Push(ctx context.Context) error {
method Stats (line 312) | func (d *TursoSyncDb) Stats(ctx context.Context) (TursoSyncDbStats, er...
method Checkpoint (line 345) | func (d *TursoSyncDb) Checkpoint(ctx context.Context) error {
method driveOpUntilDone (line 363) | func (d *TursoSyncDb) driveOpUntilDone(ctx context.Context, op TursoSy...
method processOneIo (line 390) | func (d *TursoSyncDb) processOneIo() error {
method processIoQueue (line 405) | func (d *TursoSyncDb) processIoQueue(ctx context.Context) error {
method handleIoItem (line 436) | func (d *TursoSyncDb) handleIoItem(ctx context.Context, item TursoSync...
function NewTursoSyncDb (line 115) | func NewTursoSyncDb(ctx context.Context, config TursoSyncDbConfig) (*Tur...
type tursoSyncConnector (line 200) | type tursoSyncConnector struct
method Connect (line 202) | func (c *tursoSyncConnector) Connect(ctx context.Context) (driver.Conn...
method Driver (line 241) | func (c *tursoSyncConnector) Driver() driver.Driver { return &tursoDbD...
function buildHostname (line 423) | func buildHostname(baseURL, namespace string) (string, error) {
function joinUrl (line 592) | func joinUrl(base, p string) string {
function normalizeUrl (line 599) | func normalizeUrl(base string) string {
type syncDSNOptions (line 607) | type syncDSNOptions struct
function parseSyncDSN (line 613) | func parseSyncDSN(dsn string) (string, syncDSNOptions) {
FILE: bindings/go/driver_sync_test.go
function TestSyncDSNParsing (line 24) | func TestSyncDSNParsing(t *testing.T) {
function TestSyncBusyTimeoutConfigPrecedence (line 78) | func TestSyncBusyTimeoutConfigPrecedence(t *testing.T) {
function randomString (line 137) | func randomString() string {
type TursoServer (line 146) | type TursoServer struct
method Close (line 252) | func (s *TursoServer) Close() {
method DbSql (line 275) | func (s *TursoServer) DbSql(sql string) ([][]any, error) {
function getFreePort (line 154) | func getFreePort() (int, error) {
function NewTursoServer (line 164) | func NewTursoServer() (*TursoServer, error) {
function startLocalServer (line 206) | func startLocalServer(localSyncServer string, port int) (*TursoServer, e...
function handleResponse (line 259) | func handleResponse(response *http.Response, err error) error {
function TestSyncBootstrap (line 329) | func TestSyncBootstrap(t *testing.T) {
function TestSyncConfigPersistence (line 358) | func TestSyncConfigPersistence(t *testing.T) {
function TestSyncBootstrapPersistent (line 416) | func TestSyncBootstrapPersistent(t *testing.T) {
function TestSyncPull (line 448) | func TestSyncPull(t *testing.T) {
function TestSyncPullDoNotPush (line 501) | func TestSyncPullDoNotPush(t *testing.T) {
function TestSyncPush (line 561) | func TestSyncPush(t *testing.T) {
function TestSyncCheckpoint (line 594) | func TestSyncCheckpoint(t *testing.T) {
function TestSyncPartial (line 635) | func TestSyncPartial(t *testing.T) {
function TestSyncLargeSchema (line 692) | func TestSyncLargeSchema(t *testing.T) {
FILE: bindings/java/example/src/main/java/tech.turso/Main.java
class Main (line 9) | public class Main {
method main (line 11) | public static void main(String[] args) throws SQLException {
FILE: bindings/java/rs_src/errors.rs
type TursoError (line 5) | pub enum TursoError {
method from (line 20) | fn from(_value: turso_core::LimboError) -> Self {
method from (line 40) | fn from(value: jni::errors::Error) -> Self {
method from (line 26) | fn from(value: TursoError) -> Self {
type Result (line 45) | pub type Result<T> = std::result::Result<T, TursoError>;
constant SQLITE_OK (line 47) | pub const SQLITE_OK: i32 = 0;
constant SQLITE_ERROR (line 48) | pub const SQLITE_ERROR: i32 = 1;
constant SQLITE_INTERNAL (line 50) | pub const SQLITE_INTERNAL: i32 = 2;
constant SQLITE_PERM (line 52) | pub const SQLITE_PERM: i32 = 3;
constant SQLITE_ABORT (line 54) | pub const SQLITE_ABORT: i32 = 4;
constant SQLITE_BUSY (line 56) | pub const SQLITE_BUSY: i32 = 5;
constant SQLITE_LOCKED (line 58) | pub const SQLITE_LOCKED: i32 = 6;
constant SQLITE_NOMEM (line 60) | pub const SQLITE_NOMEM: i32 = 7;
constant SQLITE_READONLY (line 62) | pub const SQLITE_READONLY: i32 = 8;
constant SQLITE_INTERRUPT (line 64) | pub const SQLITE_INTERRUPT: i32 = 9;
constant SQLITE_IOERR (line 66) | pub const SQLITE_IOERR: i32 = 10;
constant SQLITE_CORRUPT (line 68) | pub const SQLITE_CORRUPT: i32 = 11;
constant SQLITE_NOTFOUND (line 70) | pub const SQLITE_NOTFOUND: i32 = 12;
constant SQLITE_FULL (line 72) | pub const SQLITE_FULL: i32 = 13;
constant SQLITE_CANTOPEN (line 74) | pub const SQLITE_CANTOPEN: i32 = 14;
constant SQLITE_PROTOCOL (line 76) | pub const SQLITE_PROTOCOL: i32 = 15;
constant SQLITE_EMPTY (line 78) | pub const SQLITE_EMPTY: i32 = 16;
constant SQLITE_SCHEMA (line 80) | pub const SQLITE_SCHEMA: i32 = 17;
constant SQLITE_TOOBIG (line 82) | pub const SQLITE_TOOBIG: i32 = 18;
constant SQLITE_CONSTRAINT (line 84) | pub const SQLITE_CONSTRAINT: i32 = 19;
constant SQLITE_MISMATCH (line 86) | pub const SQLITE_MISMATCH: i32 = 20;
constant SQLITE_MISUSE (line 88) | pub const SQLITE_MISUSE: i32 = 21;
constant SQLITE_NOLFS (line 90) | pub const SQLITE_NOLFS: i32 = 22;
constant SQLITE_AUTH (line 92) | pub const SQLITE_AUTH: i32 = 23;
constant SQLITE_ROW (line 94) | pub const SQLITE_ROW: i32 = 100;
constant SQLITE_DONE (line 96) | pub const SQLITE_DONE: i32 = 101;
constant SQLITE_INTEGER (line 99) | pub const SQLITE_INTEGER: i32 = 1;
constant SQLITE_FLOAT (line 101) | pub const SQLITE_FLOAT: i32 = 2;
constant SQLITE_TEXT (line 103) | pub const SQLITE_TEXT: i32 = 3;
constant SQLITE_BLOB (line 105) | pub const SQLITE_BLOB: i32 = 4;
constant SQLITE_NULL (line 107) | pub const SQLITE_NULL: i32 = 5;
constant TURSO_FAILED_TO_PARSE_BYTE_ARRAY (line 109) | pub const TURSO_FAILED_TO_PARSE_BYTE_ARRAY: i32 = 1100;
constant TURSO_FAILED_TO_PREPARE_STATEMENT (line 110) | pub const TURSO_FAILED_TO_PREPARE_STATEMENT: i32 = 1200;
constant TURSO_ETC (line 111) | pub const TURSO_ETC: i32 = 9999;
FILE: bindings/java/rs_src/turso_connection.rs
type TursoConnection (line 14) | pub struct TursoConnection {
method new (line 20) | pub fn new(conn: Arc<Connection>, io: Arc<dyn turso_core::IO>) -> Self {
method to_ptr (line 25) | pub fn to_ptr(self) -> jlong {
method drop (line 29) | pub fn drop(ptr: jlong) {
function to_turso_connection (line 34) | pub fn to_turso_connection(ptr: jlong) -> Result<&'static mut TursoConne...
function Java_tech_turso_core_TursoConnection__1close (line 43) | pub extern "system" fn Java_tech_turso_core_TursoConnection__1close<'loc...
function Java_tech_turso_core_TursoConnection_prepareUtf8 (line 52) | pub extern "system" fn Java_tech_turso_core_TursoConnection_prepareUtf8<...
function Java_tech_turso_core_TursoConnection__1getAutoCommit (line 94) | pub extern "system" fn Java_tech_turso_core_TursoConnection__1getAutoCom...
FILE: bindings/java/rs_src/turso_db.rs
type TursoDB (line 10) | struct TursoDB {
method new (line 18) | pub fn new(
method to_ptr (line 31) | pub fn to_ptr(self) -> jlong {
method drop (line 35) | pub fn drop(ptr: jlong) {
function to_turso_db (line 40) | fn to_turso_db(ptr: jlong) -> Result<&'static mut TursoDB> {
function Java_tech_turso_core_TursoDB_openUtf8 (line 50) | pub extern "system" fn Java_tech_turso_core_TursoDB_openUtf8<'local>(
function Java_tech_turso_core_TursoDB_openWithEncryptionUtf8 (line 96) | pub extern "system" fn Java_tech_turso_core_TursoDB_openWithEncryptionUt...
function Java_tech_turso_core_TursoDB_connect0 (line 182) | pub extern "system" fn Java_tech_turso_core_TursoDB_connect0<'local>(
function Java_tech_turso_core_TursoDB_close0 (line 222) | pub extern "system" fn Java_tech_turso_core_TursoDB_close0<'local>(
function Java_tech_turso_core_TursoDB_throwJavaException (line 231) | pub extern "system" fn Java_tech_turso_core_TursoDB_throwJavaException<'...
FILE: bindings/java/rs_src/turso_statement.rs
constant STEP_RESULT_ID_ROW (line 11) | pub const STEP_RESULT_ID_ROW: i32 = 10;
constant STEP_RESULT_ID_IO (line 13) | pub const STEP_RESULT_ID_IO: i32 = 20;
constant STEP_RESULT_ID_DONE (line 14) | pub const STEP_RESULT_ID_DONE: i32 = 30;
constant STEP_RESULT_ID_INTERRUPT (line 15) | pub const STEP_RESULT_ID_INTERRUPT: i32 = 40;
constant STEP_RESULT_ID_BUSY (line 16) | pub const STEP_RESULT_ID_BUSY: i32 = 50;
constant STEP_RESULT_ID_ERROR (line 17) | pub const STEP_RESULT_ID_ERROR: i32 = 60;
type TursoStatement (line 19) | pub struct TursoStatement {
method new (line 25) | pub fn new(stmt: Statement, connection: TursoConnection) -> Self {
method to_ptr (line 30) | pub fn to_ptr(self) -> jlong {
method drop (line 34) | pub fn drop(ptr: jlong) {
function to_turso_statement (line 39) | pub fn to_turso_statement(ptr: jlong) -> Result<&'static mut TursoStatem...
function Java_tech_turso_core_TursoStatement_step (line 48) | pub extern "system" fn Java_tech_turso_core_TursoStatement_step<'local>(
function Java_tech_turso_core_TursoStatement__1close (line 90) | pub extern "system" fn Java_tech_turso_core_TursoStatement__1close<'local>(
function row_to_obj_array (line 98) | fn row_to_obj_array<'local>(
function Java_tech_turso_core_TursoStatement_columns (line 125) | pub extern "system" fn Java_tech_turso_core_TursoStatement_columns<'local>(
function Java_tech_turso_core_TursoStatement_bindNull (line 147) | pub extern "system" fn Java_tech_turso_core_TursoStatement_bindNull<'loc...
function Java_tech_turso_core_TursoStatement_bindLong (line 167) | pub extern "system" fn Java_tech_turso_core_TursoStatement_bindLong<'loc...
function Java_tech_turso_core_TursoStatement_bindDouble (line 190) | pub extern "system" fn Java_tech_turso_core_TursoStatement_bindDouble<'l...
function Java_tech_turso_core_TursoStatement_bindText (line 213) | pub extern "system" fn Java_tech_turso_core_TursoStatement_bindText<'loc...
function Java_tech_turso_core_TursoStatement_bindBlob (line 241) | pub extern "system" fn Java_tech_turso_core_TursoStatement_bindBlob<'loc...
function Java_tech_turso_core_TursoStatement_totalChanges (line 267) | pub extern "system" fn Java_tech_turso_core_TursoStatement_totalChanges<...
function Java_tech_turso_core_TursoStatement_changes (line 284) | pub extern "system" fn Java_tech_turso_core_TursoStatement_changes<'local>(
function Java_tech_turso_core_TursoStatement_parameterCount (line 301) | pub extern "system" fn Java_tech_turso_core_TursoStatement_parameterCoun...
function Java_tech_turso_core_TursoStatement_reset (line 318) | pub extern "system" fn Java_tech_turso_core_TursoStatement_reset<'local>(
function to_turso_step_result (line 356) | fn to_turso_step_result<'local>(
function to_turso_step_result_error (line 376) | fn to_turso_step_result_error<'local>(
FILE: bindings/java/rs_src/utils.rs
function utf8_byte_arr_to_str (line 5) | pub(crate) fn utf8_byte_arr_to_str(
function set_err_msg_and_throw_exception (line 33) | pub fn set_err_msg_and_throw_exception<'local>(
FILE: bindings/java/src/main/java/examples/EncryptionExample.java
class EncryptionExample (line 27) | public class EncryptionExample {
method main (line 33) | public static void main(String[] args) throws Exception {
FILE: bindings/java/src/main/java/tech/turso/JDBC.java
class JDBC (line 14) | public final class JDBC implements Driver {
method createConnection (line 36) | @Nullable
method isValidURL (line 45) | private static boolean isValidURL(String url) {
method extractAddress (line 49) | private static String extractAddress(String url) {
method connect (line 53) | @Nullable
method acceptsURL (line 59) | @Override
method getPropertyInfo (line 64) | @Override
method getMajorVersion (line 69) | @Override
method getMinorVersion (line 74) | @Override
method jdbcCompliant (line 79) | @Override
method getParentLogger (line 84) | @Override
FILE: bindings/java/src/main/java/tech/turso/TursoConfig.java
class TursoConfig (line 8) | public final class TursoConfig {
method TursoConfig (line 14) | public TursoConfig(Properties properties) {
method getDriverPropertyInfo (line 18) | public static DriverPropertyInfo[] getDriverPropertyInfo() {
method toProperties (line 22) | public Properties toProperties() {
type Pragma (line 28) | public enum Pragma {
method Pragma (line 35) | Pragma(String pragmaName, String description, String[] choices) {
method getPragmaName (line 41) | public String getPragmaName() {
method driverPropertyInfo (line 46) | private static DriverPropertyInfo[] driverPropertyInfo() {
FILE: bindings/java/src/main/java/tech/turso/TursoDataSource.java
class TursoDataSource (line 14) | public final class TursoDataSource implements DataSource {
method TursoDataSource (line 24) | public TursoDataSource(TursoConfig tursoConfig, String url) {
method getConnection (line 29) | @Override
method getConnection (line 35) | @Override
method getLogWriter (line 45) | @Override
method setLogWriter (line 52) | @Override
method setLoginTimeout (line 57) | @Override
method getLoginTimeout (line 62) | @Override
method getParentLogger (line 68) | @Override
method unwrap (line 75) | @Override
method isWrapperFor (line 82) | @Override
FILE: bindings/java/src/main/java/tech/turso/TursoErrorCode.java
type TursoErrorCode (line 6) | public enum TursoErrorCode {
method TursoErrorCode (line 51) | TursoErrorCode(int code, String message) {
method getErrorCode (line 56) | public static TursoErrorCode getErrorCode(int errorCode) {
method toString (line 64) | @Override
FILE: bindings/java/src/main/java/tech/turso/core/SqliteCode.java
class SqliteCode (line 19) | public final class SqliteCode {
FILE: bindings/java/src/main/java/tech/turso/core/TursoConnection.java
class TursoConnection (line 14) | public final class TursoConnection {
method TursoConnection (line 29) | public TursoConnection(String url, String filePath) throws SQLException {
method TursoConnection (line 39) | public TursoConnection(String url, String filePath, Properties propert...
method TursoConnection (line 52) | public TursoConnection(String url, TursoDB database) throws SQLExcepti...
method open (line 58) | private static TursoDB open(String url, String filePath, Properties pr...
method checkOpen (line 63) | public void checkOpen() throws SQLException {
method getUrl (line 67) | public String getUrl() {
method close (line 71) | public void close() throws SQLException {
method _close (line 94) | private native void _close(long connectionPtr);
method _getAutoCommit (line 96) | private native boolean _getAutoCommit(long connectionPtr);
method isClosed (line 98) | public boolean isClosed() throws SQLException {
method getDatabase (line 102) | public TursoDB getDatabase() {
method prepare (line 113) | public TursoStatement prepare(String sql) throws SQLException {
method prepare (line 125) | private TursoStatement prepare(String sql, boolean checkTransaction) t...
method prepareUtf8 (line 140) | private native long prepareUtf8(long connectionPtr, byte[] sqlUtf8) th...
method checkCursor (line 157) | public void checkCursor(int resultSetType, int resultSetConcurrency, i...
method setAutoCommit (line 183) | public void setAutoCommit(boolean autoCommit) throws SQLException {
method getAutoCommit (line 206) | public boolean getAutoCommit() throws SQLException {
method commit (line 216) | public void commit() throws SQLException {
method rollback (line 235) | public void rollback() throws SQLException {
method ensureTransactionStarted (line 253) | private void ensureTransactionStarted(String sql) throws SQLException {
method executeInternal (line 273) | private void executeInternal(String sql) throws SQLException {
method setTransactionIsolation (line 289) | public void setTransactionIsolation(int level) throws SQLException {
method getTransactionIsolation (line 314) | public int getTransactionIsolation() throws SQLException {
method throwTursoException (line 325) | @NativeInvocation(invokedFrom = "turso_connection.rs")
FILE: bindings/java/src/main/java/tech/turso/core/TursoDB.java
class TursoDB (line 19) | public final class TursoDB implements AutoCloseable {
type Architecture (line 41) | private enum Architecture {
method Architecture (line 51) | Architecture(String libPath, String fileExtension) {
method getLibPath (line 56) | public String getLibPath() {
method getFileExtension (line 60) | public String getFileExtension() {
method detect (line 64) | public static Architecture detect() {
method load (line 102) | private static void load() {
class SingletonHolder (line 107) | private static class SingletonHolder {
method loadFromSystemPath (line 123) | private static boolean loadFromSystemPath() {
method loadFromJar (line 143) | private static boolean loadFromJar() {
method convertInputStreamToFile (line 163) | private static File convertInputStreamToFile(InputStream is, Architect...
method create (line 184) | public static TursoDB create(String url, String filePath) throws SQLEx...
method createWithEncryption (line 196) | public static TursoDB createWithEncryption(
method TursoDB (line 203) | private TursoDB(
method interrupt (line 213) | public native void interrupt();
method isClosed (line 215) | public boolean isClosed() {
method isOpen (line 219) | public boolean isOpen() {
method open (line 223) | private void open(int openFlags, @Nullable String cipher, @Nullable St...
method open0 (line 228) | private void open0(
method openUtf8 (line 246) | private native long openUtf8(byte[] file, int openFlags) throws SQLExc...
method openWithEncryptionUtf8 (line 248) | private native long openWithEncryptionUtf8(
method connect (line 251) | public long connect() throws SQLException {
method connect0 (line 255) | private native long connect0(long databasePtr) throws SQLException;
method close (line 257) | @Override
method close0 (line 265) | private native void close0(long databasePtr) throws SQLException;
method throwJavaException (line 267) | @VisibleForTesting
method throwTursoException (line 276) | @NativeInvocation(invokedFrom = "turso_db.rs")
FILE: bindings/java/src/main/java/tech/turso/core/TursoEncryptionCipher.java
type TursoEncryptionCipher (line 4) | public enum TursoEncryptionCipher {
method TursoEncryptionCipher (line 22) | TursoEncryptionCipher(String value) {
method getValue (line 27) | public String getValue() {
FILE: bindings/java/src/main/java/tech/turso/core/TursoPropertiesHolder.java
class TursoPropertiesHolder (line 10) | public class TursoPropertiesHolder {
method getDriverName (line 35) | public static String getDriverName() {
method getDriverVersion (line 39) | public static String getDriverVersion() {
FILE: bindings/java/src/main/java/tech/turso/core/TursoResultSet.java
class TursoResultSet (line 16) | public final class TursoResultSet {
method of (line 36) | public static TursoResultSet of(TursoStatement statement) {
method TursoResultSet (line 40) | private TursoResultSet(TursoStatement statement) {
method consumeAll (line 51) | public void consumeAll() throws SQLException {
method next (line 72) | public boolean next() throws SQLException {
method hasLastStepReturnedRow (line 109) | public boolean hasLastStepReturnedRow() {
method isPastLastRow (line 114) | public boolean isPastLastRow() {
method isEmpty (line 119) | public boolean isEmpty() {
method getRow (line 124) | public int getRow() {
method isOpen (line 133) | public boolean isOpen() {
method checkOpen (line 138) | public void checkOpen() throws SQLException {
method close (line 144) | public void close() throws SQLException {
method get (line 148) | public Object get(String columnName) throws SQLException {
method get (line 159) | public Object get(int columnIndex) throws SQLException {
method getColumnNames (line 176) | public String[] getColumnNames() {
method setColumnNames (line 180) | public void setColumnNames(String[] columnNames) {
method toString (line 184) | @Override
FILE: bindings/java/src/main/java/tech/turso/core/TursoStatement.java
class TursoStatement (line 17) | public final class TursoStatement implements AutoCloseable {
method TursoStatement (line 29) | public TursoStatement(String sql, long statementPointer) {
method getResultSet (line 36) | public TursoResultSet getResultSet() {
method execute (line 45) | public boolean execute() throws SQLException {
method step (line 50) | TursoStepResult step() throws SQLException {
method step (line 64) | @Nullable
method throwTursoException (line 73) | @NativeInvocation(invokedFrom = "turso_statement.rs")
method close (line 82) | public void close() throws SQLException {
method _close (line 91) | private native void _close(long statementPointer);
method initializeColumnMetadata (line 100) | public void initializeColumnMetadata() throws SQLException {
method columns (line 107) | @Nullable
method bindNull (line 117) | public int bindNull(int position) throws SQLException {
method bindNull (line 125) | private native int bindNull(long statementPointer, int position) throw...
method bindInt (line 139) | public int bindInt(int position, int value) throws SQLException {
method bindLong (line 151) | public int bindLong(int position, long value) throws SQLException {
method bindLong (line 159) | private native int bindLong(long statementPointer, int position, long ...
method bindDouble (line 169) | public int bindDouble(int position, double value) throws SQLException {
method bindDouble (line 177) | private native int bindDouble(long statementPointer, int position, dou...
method bindText (line 188) | public int bindText(int position, String value) throws SQLException {
method bindText (line 196) | private native int bindText(long statementPointer, int position, Strin...
method bindBlob (line 207) | public int bindBlob(int position, byte[] value) throws SQLException {
method bindBlob (line 215) | private native int bindBlob(long statementPointer, int position, byte[...
method bindObject (line 218) | public void bindObject(int parameterIndex, Object x) throws SQLExcepti...
method totalChanges (line 249) | public long totalChanges() throws SQLException {
method totalChanges (line 258) | private native long totalChanges(long statementPointer) throws SQLExce...
method changes (line 265) | public long changes() throws SQLException {
method changes (line 274) | private native long changes(long statementPointer) throws SQLException;
method parameterCount (line 282) | public int parameterCount() throws SQLException {
method parameterCount (line 291) | private native int parameterCount(long statementPointer) throws SQLExc...
method reset (line 294) | public void reset() throws SQLException {
method reset (line 302) | private native int reset(long statementPointer) throws SQLException;
method isClosed (line 309) | public boolean isClosed() {
method toString (line 313) | @Override
FILE: bindings/java/src/main/java/tech/turso/core/TursoStepResult.java
class TursoStepResult (line 8) | public final class TursoStepResult {
method TursoStepResult (line 26) | @NativeInvocation(invokedFrom = "turso_statement.rs")
method TursoStepResult (line 33) | @NativeInvocation(invokedFrom = "turso_statement.rs")
method TursoStepResult (line 40) | @NativeInvocation(invokedFrom = "turso_statement.rs")
method isRow (line 47) | public boolean isRow() {
method isDone (line 51) | public boolean isDone() {
method isInInvalidState (line 55) | public boolean isInInvalidState() {
method getResult (line 63) | @Nullable
method getErrorMessage (line 68) | @Nullable
method toString (line 73) | @Override
method getStepResultName (line 83) | private String getStepResultName() {
FILE: bindings/java/src/main/java/tech/turso/core/TursoTransactionMode.java
type TursoTransactionMode (line 10) | public enum TursoTransactionMode {
method TursoTransactionMode (line 46) | TursoTransactionMode(String sql) {
method getSql (line 50) | public String getSql() {
method fromIsolationLevel (line 69) | public static TursoTransactionMode fromIsolationLevel(int level) {
FILE: bindings/java/src/main/java/tech/turso/exceptions/TursoException.java
class TursoException (line 6) | public final class TursoException extends SQLException {
method TursoException (line 10) | public TursoException(String message, TursoErrorCode resultCode) {
method getResultCode (line 15) | public TursoErrorCode getResultCode() {
FILE: bindings/java/src/main/java/tech/turso/jdbc4/JDBC4Connection.java
class JDBC4Connection (line 13) | public final class JDBC4Connection implements Connection {
method JDBC4Connection (line 26) | public JDBC4Connection(String url, String filePath) throws SQLException {
method JDBC4Connection (line 38) | public JDBC4Connection(String url, String filePath, Properties propert...
method prepare (line 49) | public TursoStatement prepare(String sql) throws SQLException {
method createStatement (line 55) | @Override
method createStatement (line 61) | @Override
method createStatement (line 67) | @Override
method nativeSQL (line 76) | @Override
method setAutoCommit (line 81) | @Override
method getAutoCommit (line 86) | @Override
method commit (line 91) | @Override
method rollback (line 96) | @Override
method close (line 101) | @Override
method isClosed (line 106) | @Override
method getMetaData (line 111) | @Override
method setReadOnly (line 117) | @Override
method isReadOnly (line 122) | @Override
method setCatalog (line 128) | @Override
method getCatalog (line 131) | @Override
method setTransactionIsolation (line 136) | @Override
method getTransactionIsolation (line 141) | @Override
method getWarnings (line 146) | @Override
method clearWarnings (line 153) | @Override
method getTypeMap (line 158) | @Override
method setTypeMap (line 163) | @Override
method getHoldability (line 170) | @Override
method setHoldability (line 176) | @Override
method setSavepoint (line 184) | @Override
method setSavepoint (line 190) | @Override
method rollback (line 196) | @Override
method releaseSavepoint (line 201) | @Override
method prepareCall (line 206) | @Override
method prepareCall (line 215) | @Override
method prepareCall (line 221) | @Override
method prepareStatement (line 228) | @Override
method prepareStatement (line 233) | @Override
method prepareStatement (line 240) | @Override
method prepareStatement (line 249) | @Override
method prepareStatement (line 254) | @Override
method prepareStatement (line 260) | @Override
method createClob (line 266) | @Override
method createBlob (line 271) | @Override
method createNClob (line 276) | @Override
method createSQLXML (line 281) | @Override
method isValid (line 287) | @Override
method setClientInfo (line 298) | @Override
method setClientInfo (line 303) | @Override
method getClientInfo (line 308) | @Override
method getClientInfo (line 314) | @Override
method createArrayOf (line 321) | @Override
method createStruct (line 328) | @Override
method setSchema (line 335) | @Override
method getSchema (line 340) | @Override
method abort (line 347) | @Override
method setNetworkTimeout (line 356) | @Override
method getNetworkTimeout (line 361) | @Override
method unwrap (line 367) | @Override
method isWrapperFor (line 373) | @Override
method setBusyTimeout (line 384) | public void setBusyTimeout(int busyTimeout) {
method getBusyTimeout (line 389) | public int getBusyTimeout() {
method getUrl (line 399) | public String getUrl() {
method checkOpen (line 408) | public void checkOpen() throws SQLException {
FILE: bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java
class JDBC4DatabaseMetaData (line 17) | public final class JDBC4DatabaseMetaData implements DatabaseMetaData {
method JDBC4DatabaseMetaData (line 60) | public JDBC4DatabaseMetaData(JDBC4Connection connection) {
method allProceduresAreCallable (line 64) | @Override
method allTablesAreSelectable (line 69) | @Override
method getURL (line 74) | @Override
method getUserName (line 79) | @Override
method isReadOnly (line 85) | @Override
method nullsAreSortedHigh (line 90) | @Override
method nullsAreSortedLow (line 95) | @Override
method nullsAreSortedAtStart (line 100) | @Override
method nullsAreSortedAtEnd (line 105) | @Override
method getDatabaseProductName (line 110) | @Override
method getDatabaseProductVersion (line 115) | @Override
method getDriverName (line 121) | @Override
method getDriverVersion (line 126) | @Override
method getDriverMajorVersion (line 131) | @Override
method getDriverMinorVersion (line 136) | @Override
method usesLocalFiles (line 141) | @Override
method usesLocalFilePerTable (line 146) | @Override
method supportsMixedCaseIdentifiers (line 151) | @Override
method storesUpperCaseIdentifiers (line 156) | @Override
method storesLowerCaseIdentifiers (line 161) | @Override
method storesMixedCaseIdentifiers (line 166) | @Override
method supportsMixedCaseQuotedIdentifiers (line 171) | @Override
method storesUpperCaseQuotedIdentifiers (line 176) | @Override
method storesLowerCaseQuotedIdentifiers (line 181) | @Override
method storesMixedCaseQuotedIdentifiers (line 186) | @Override
method getIdentifierQuoteString (line 191) | @Override
method getSQLKeywords (line 196) | @Override
method getNumericFunctions (line 207) | @Override
method getStringFunctions (line 213) | @Override
method getSystemFunctions (line 219) | @Override
method getTimeDateFunctions (line 225) | @Override
method getSearchStringEscape (line 231) | @Override
method getExtraNameCharacters (line 236) | @Override
method supportsAlterTableWithAddColumn (line 241) | @Override
method supportsAlterTableWithDropColumn (line 246) | @Override
method supportsColumnAliasing (line 251) | @Override
method nullPlusNonNullIsNull (line 256) | @Override
method supportsConvert (line 261) | @Override
method supportsConvert (line 266) | @Override
method supportsTableCorrelationNames (line 271) | @Override
method supportsDifferentTableCorrelationNames (line 276) | @Override
method supportsExpressionsInOrderBy (line 281) | @Override
method supportsOrderByUnrelated (line 286) | @Override
method supportsGroupBy (line 291) | @Override
method supportsGroupByUnrelated (line 296) | @Override
method supportsGroupByBeyondSelect (line 301) | @Override
method supportsLikeEscapeClause (line 306) | @Override
method supportsMultipleResultSets (line 311) | @Override
method supportsMultipleTransactions (line 316) | @Override
method supportsNonNullableColumns (line 321) | @Override
method supportsMinimumSQLGrammar (line 326) | @Override
method supportsCoreSQLGrammar (line 346) | @Override
method supportsExtendedSQLGrammar (line 359) | @Override
method supportsANSI92EntryLevelSQL (line 364) | @Override
method supportsANSI92IntermediateSQL (line 369) | @Override
method supportsANSI92FullSQL (line 374) | @Override
method supportsIntegrityEnhancementFacility (line 379) | @Override
method supportsOuterJoins (line 384) | @Override
method supportsFullOuterJoins (line 389) | @Override
method supportsLimitedOuterJoins (line 394) | @Override
method getSchemaTerm (line 399) | @Override
method getProcedureTerm (line 404) | @Override
method getCatalogTerm (line 409) | @Override
method isCatalogAtStart (line 414) | @Override
method getCatalogSeparator (line 420) | @Override
method supportsSchemasInDataManipulation (line 425) | @Override
method supportsSchemasInProcedureCalls (line 430) | @Override
method supportsSchemasInTableDefinitions (line 435) | @Override
method supportsSchemasInIndexDefinitions (line 440) | @Override
method supportsSchemasInPrivilegeDefinitions (line 445) | @Override
method supportsCatalogsInDataManipulation (line 450) | @Override
method supportsCatalogsInProcedureCalls (line 455) | @Override
method supportsCatalogsInTableDefinitions (line 460) | @Override
method supportsCatalogsInIndexDefinitions (line 465) | @Override
method supportsCatalogsInPrivilegeDefinitions (line 470) | @Override
method supportsPositionedDelete (line 475) | @Override
method supportsPositionedUpdate (line 480) | @Override
method supportsSelectForUpdate (line 485) | @Override
method supportsStoredProcedures (line 490) | @Override
method supportsSubqueriesInComparisons (line 495) | @Override
method supportsSubqueriesInExists (line 500) | @Override
method supportsSubqueriesInIns (line 505) | @Override
method supportsSubqueriesInQuantifieds (line 510) | @Override
method supportsCorrelatedSubqueries (line 515) | @Override
method supportsUnion (line 520) | @Override
method supportsUnionAll (line 526) | @Override
method supportsOpenCursorsAcrossCommit (line 532) | @Override
method supportsOpenCursorsAcrossRollback (line 537) | @Override
method supportsOpenStatementsAcrossCommit (line 542) | @Override
method supportsOpenStatementsAcrossRollback (line 547) | @Override
method getMaxBinaryLiteralLength (line 552) | @Override
method getMaxCharLiteralLength (line 557) | @Override
method getMaxColumnNameLength (line 562) | @Override
method getMaxColumnsInGroupBy (line 567) | @Override
method getMaxColumnsInIndex (line 572) | @Override
method getMaxColumnsInOrderBy (line 577) | @Override
method getMaxColumnsInSelect (line 582) | @Override
method getMaxColumnsInTable (line 587) | @Override
method getMaxConnections (line 592) | @Override
method getMaxCursorNameLength (line 597) | @Override
method getMaxIndexLength (line 602) | @Override
method getMaxSchemaNameLength (line 607) | @Override
method getMaxProcedureNameLength (line 612) | @Override
method getMaxCatalogNameLength (line 617) | @Override
method getMaxRowSize (line 622) | @Override
method doesMaxRowSizeIncludeBlobs (line 627) | @Override
method getMaxStatementLength (line 632) | @Override
method getMaxStatements (line 637) | @Override
method getMaxTableNameLength (line 642) | @Override
method getMaxTablesInSelect (line 647) | @Override
method getMaxUserNameLength (line 652) | @Override
method getDefaultTransactionIsolation (line 657) | @Override
method supportsTransactions (line 663) | @Override
method supportsTransactionIsolationLevel (line 669) | @Override
method supportsDataDefinitionAndDataManipulationTransactions (line 674) | @Override
method supportsDataManipulationTransactionsOnly (line 680) | @Override
method dataDefinitionCausesTransactionCommit (line 685) | @Override
method dataDefinitionIgnoredInTransactions (line 690) | @Override
method getProcedures (line 695) | @Override
method getProcedureColumns (line 703) | @Override
method getTables (line 712) | @Override
method getSchemas (line 792) | @Override
method getCatalogs (line 803) | @Override
method getTableTypes (line 813) | @Override
method getColumns (line 820) | @Override
method getColumnPrivileges (line 828) | @Override
method getTablePrivileges (line 844) | @Override
method getBestRowIdentifier (line 859) | @Override
method getVersionColumns (line 876) | @Override
method getPrimaryKeys (line 891) | @Override
method getImportedKeys (line 898) | @Override
method getExportedKeys (line 905) | @Override
method getCrossReference (line 911) | @Override
method getTypeInfo (line 924) | @Override
method getIndexInfo (line 931) | @Override
method supportsResultSetType (line 939) | @Override
method supportsResultSetConcurrency (line 944) | @Override
method ownUpdatesAreVisible (line 949) | @Override
method ownDeletesAreVisible (line 954) | @Override
method ownInsertsAreVisible (line 959) | @Override
method othersUpdatesAreVisible (line 964) | @Override
method othersDeletesAreVisible (line 969) | @Override
method othersInsertsAreVisible (line 974) | @Override
method updatesAreDetected (line 979) | @Override
method deletesAreDetected (line 984) | @Override
method insertsAreDetected (line 989) | @Override
method supportsBatchUpdates (line 994) | @Override
method getUDTs (line 1000) | @Override
method getConnection (line 1018) | @Override
method supportsSavepoints (line 1023) | @Override
method supportsNamedParameters (line 1029) | @Override
method supportsMultipleOpenResults (line 1035) | @Override
method supportsGetGeneratedKeys (line 1040) | @Override
method getSuperTypes (line 1046) | @Override
method getSuperTables (line 1061) | @Override
method getAttributes (line 1075) | @Override
method supportsResultSetHoldability (line 1096) | @Override
method getResultSetHoldability (line 1101) | @Override
method getDatabaseMajorVersion (line 1106) | @Override
method getDatabaseMinorVersion (line 1112) | @Override
method getJDBCMajorVersion (line 1118) | @Override
method getJDBCMinorVersion (line 1123) | @Override
method getSQLStateType (line 1128) | @Override
method locatorsUpdateCopy (line 1133) | @Override
method supportsStatementPooling (line 1138) | @Override
method getRowIdLifetime (line 1143) | @Override
method getSchemas (line 1148) | @Override
method supportsStoredFunctionsUsingCallSyntax (line 1159) | @Override
method autoCommitFailureClosesAllResultSets (line 1164) | @Override
method getClientInfoProperties (line 1169) | @Override
method getFunctions (line 1174) | @Override
method getFunctionColumns (line 1181) | @Override
method getPseudoColumns (line 1189) | @Override
method generatedKeyAlwaysReturned (line 1197) | @Override
method unwrap (line 1202) | @Override
method isWrapperFor (line 1208) | @Override
FILE: bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java
class JDBC4PreparedStatement (line 22) | public final class JDBC4PreparedStatement extends JDBC4Statement impleme...
method JDBC4PreparedStatement (line 38) | public JDBC4PreparedStatement(JDBC4Connection connection, String sql) ...
method executeQuery (line 47) | @Override
method executeUpdate (line 54) | @Override
method setParam (line 68) | private void setParam(int parameterIndex, @Nullable Object object) {
method setNull (line 73) | @Override
method setBoolean (line 79) | @Override
method setByte (line 85) | @Override
method setShort (line 91) | @Override
method setInt (line 97) | @Override
method setLong (line 103) | @Override
method setFloat (line 109) | @Override
method setDouble (line 115) | @Override
method setBigDecimal (line 121) | @Override
method setString (line 127) | @Override
method setBytes (line 133) | @Override
method setDate (line 139) | @Override
method setTime (line 150) | @Override
method setTimestamp (line 161) | @Override
method setAsciiStream (line 172) | @Override
method setUnicodeStream (line 200) | @Override
method setBinaryStream (line 228) | @Override
method clearParameters (line 258) | @Override
method clearBatch (line 263) | @Override
method setObject (line 269) | @Override
method setObject (line 274) | @Override
method execute (line 319) | @Override
method execute (line 325) | private boolean execute(Object[] params) throws SQLException {
method executeBatch (line 334) | @Override
method executeLargeBatch (line 339) | @Override
method bindParams (line 381) | private void bindParams(Object[] params) throws SQLException {
method addBatch (line 388) | @Override
method addBatch (line 394) | @Override
method setCharacterStream (line 399) | @Override
method setRef (line 428) | @Override
method setBlob (line 433) | @Override
method setClob (line 438) | @Override
method setArray (line 443) | @Override
method getMetaData (line 448) | @Override
method setDate (line 453) | @Override
method setTime (line 458) | @Override
method setTimestamp (line 463) | @Override
method setNull (line 469) | @Override
method setURL (line 474) | @Override
method getParameterMetaData (line 479) | @Override
method setRowId (line 486) | @Override
method setNString (line 491) | @Override
method setNCharacterStream (line 496) | @Override
method setNClob (line 502) | @Override
method setClob (line 507) | @Override
method setBlob (line 512) | @Override
method setNClob (line 518) | @Override
method setSQLXML (line 523) | @Override
method setObject (line 528) | @Override
method setAsciiStream (line 534) | @Override
method setBinaryStream (line 540) | @Override
method setCharacterStream (line 546) | @Override
method requireLengthIsPositiveInt (line 553) | private void requireLengthIsPositiveInt(long length) throws SQLFeature...
method setAsciiStream (line 560) | @Override
method setBinaryStream (line 572) | @Override
method readBytes (line 590) | private byte[] readBytes(InputStream x) throws SQLException {
method setCharacterStream (line 609) | @Override
method setNCharacterStream (line 629) | @Override
method setClob (line 634) | @Override
method setBlob (line 639) | @Override
method setNClob (line 644) | @Override
FILE: bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java
class JDBC4ResultSet (line 33) | public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData {
method JDBC4ResultSet (line 45) | public JDBC4ResultSet(TursoResultSet resultSet, @Nullable Statement st...
method next (line 50) | @Override
method close (line 55) | @Override
method wasNull (line 60) | @Override
method getString (line 65) | @Override
method getBoolean (line 76) | @Override
method getByte (line 86) | @Override
method getShort (line 96) | @Override
method getInt (line 106) | @Override
method getLong (line 116) | @Override
method getFloat (line 126) | @Override
method getDouble (line 136) | @Override
method getBigDecimal (line 147) | @Override
method getBytes (line 160) | @Override
method getDate (line 171) | @Override
method getTime (line 192) | @Override
method getTimestamp (line 213) | @Override
method getAsciiStream (line 234) | @Override
method getUnicodeStream (line 253) | @Override
method getBinaryStream (line 272) | @Override
method getString (line 289) | @Override
method getBoolean (line 295) | @Override
method getByte (line 300) | @Override
method getShort (line 305) | @Override
method getInt (line 310) | @Override
method getLong (line 315) | @Override
method getFloat (line 320) | @Override
method getDouble (line 325) | @Override
method getBigDecimal (line 330) | @Override
method getBytes (line 336) | @Override
method getDate (line 342) | @Override
method getTime (line 367) | @Override
method getTimestamp (line 373) | @Override
method getAsciiStream (line 379) | @Override
method getUnicodeStream (line 385) | @Override
method getBinaryStream (line 391) | @Override
method getWarnings (line 397) | @Override
method clearWarnings (line 403) | @Override
method getCursorName (line 408) | @Override
method getMetaData (line 413) | @Override
method getObject (line 418) | @Override
method getObject (line 425) | @Override
method findColumn (line 431) | @Override
method getCharacterStream (line 446) | @Override
method getCharacterStream (line 457) | @Override
method getBigDecimal (line 463) | @Override
method getBigDecimal (line 475) | @Override
method isBeforeFirst (line 481) | @Override
method isAfterLast (line 490) | @Override
method isFirst (line 495) | @Override
method isLast (line 500) | @Override
method beforeFirst (line 505) | @Override
method afterLast (line 510) | @Override
method first (line 515) | @Override
method last (line 520) | @Override
method getRow (line 525) | @Override
method absolute (line 530) | @Override
method relative (line 535) | @Override
method previous (line 540) | @Override
method setFetchDirection (line 545) | @Override
method getFetchDirection (line 550) | @Override
method setFetchSize (line 555) | @Override
method getFetchSize (line 560) | @Override
method getType (line 565) | @Override
method getConcurrency (line 570) | @Override
method rowUpdated (line 575) | @Override
method rowInserted (line 580) | @Override
method rowDeleted (line 585) | @Override
method updateNull (line 590) | @Override
method updateBoolean (line 595) | @Override
method updateByte (line 600) | @Override
method updateShort (line 605) | @Override
method updateInt (line 610) | @Override
method updateLong (line 615) | @Override
method updateFloat (line 620) | @Override
method updateDouble (line 625) | @Override
method updateBigDecimal (line 630) | @Override
method updateString (line 635) | @Override
method updateBytes (line 640) | @Override
method updateDate (line 645) | @Override
method updateTime (line 650) | @Override
method updateTimestamp (line 655) | @Override
method updateAsciiStream (line 660) | @Override
method updateBinaryStream (line 665) | @Override
method updateCharacterStream (line 670) | @Override
method updateObject (line 675) | @Override
method updateObject (line 680) | @Override
method updateNull (line 685) | @Override
method updateBoolean (line 690) | @Override
method updateByte (line 695) | @Override
method updateShort (line 700) | @Override
method updateInt (line 705) | @Override
method updateLong (line 710) | @Override
method updateFloat (line 715) | @Override
method updateDouble (line 720) | @Override
method updateBigDecimal (line 725) | @Override
method updateString (line 730) | @Override
method updateBytes (line 735) | @Override
method updateDate (line 740) | @Override
method updateTime (line 745) | @Override
method updateTimestamp (line 750) | @Override
method updateAsciiStream (line 755) | @Override
method updateBinaryStream (line 760) | @Override
method updateCharacterStream (line 766) | @Override
method updateObject (line 772) | @Override
method updateObject (line 777) | @Override
method insertRow (line 782) | @Override
method updateRow (line 787) | @Override
method deleteRow (line 792) | @Override
method refreshRow (line 797) | @Override
method cancelRowUpdates (line 802) | @Override
method moveToInsertRow (line 807) | @Override
method moveToCurrentRow (line 812) | @Override
method getStatement (line 817) | @Override
method getObject (line 823) | @Override
method getRef (line 829) | @Override
method getBlob (line 835) | @Override
method getClob (line 841) | @Override
method getArray (line 847) | @Override
method getObject (line 853) | @Override
method getRef (line 859) | @Override
method getBlob (line 865) | @Override
method getClob (line 871) | @Override
method getArray (line 877) | @Override
method getDate (line 883) | @Override
method getDate (line 893) | @Override
method getTime (line 899) | @Override
method getTime (line 909) | @Override
method getTimestamp (line 915) | @Override
method getTimestamp (line 925) | @Override
method getURL (line 931) | @Override
method getURL (line 937) | @Override
method updateRef (line 943) | @Override
method updateRef (line 948) | @Override
method updateBlob (line 953) | @Override
method updateBlob (line 958) | @Override
method updateClob (line 963) | @Override
method updateClob (line 968) | @Override
method updateArray (line 973) | @Override
method updateArray (line 978) | @Override
method getRowId (line 983) | @Override
method getRowId (line 989) | @Override
method updateRowId (line 995) | @Override
method updateRowId (line 1000) | @Override
method getHoldability (line 1005) | @Override
method isClosed (line 1010) | @Override
method updateNString (line 1015) | @Override
method updateNString (line 1020) | @Override
method updateNClob (line 1025) | @Override
method updateNClob (line 1030) | @Override
method getNClob (line 1035) | @Override
method getNClob (line 1041) | @Override
method getSQLXML (line 1047) | @Override
method getSQLXML (line 1053) | @Override
method updateSQLXML (line 1059) | @Override
method updateSQLXML (line 1064) | @Override
method getNString (line 1069) | @Override
method getNString (line 1074) | @Override
method getNCharacterStream (line 1079) | @Override
method getNCharacterStream (line 1085) | @Override
method updateNCharacterStream (line 1091) | @Override
method updateNCharacterStream (line 1096) | @Override
method updateAsciiStream (line 1102) | @Override
method updateBinaryStream (line 1107) | @Override
method updateCharacterStream (line 1112) | @Override
method updateAsciiStream (line 1117) | @Override
method updateBinaryStream (line 1123) | @Override
method updateCharacterStream (line 1129) | @Override
method updateBlob (line 1135) | @Override
method updateBlob (line 1141) | @Override
method updateClob (line 1147) | @Override
method updateClob (line 1152) | @Override
method updateNClob (line 1157) | @Override
method updateNClob (line 1162) | @Override
method updateNCharacterStream (line 1167) | @Override
method updateNCharacterStream (line 1172) | @Override
method updateAsciiStream (line 1177) | @Override
method updateBinaryStream (line 1182) | @Override
method updateCharacterStream (line 1187) | @Override
method updateAsciiStream (line 1192) | @Override
method updateBinaryStream (line 1197) | @Override
method updateCharacterStream (line 1202) | @Override
method updateBlob (line 1207) | @Override
method updateBlob (line 1212) | @Override
method updateClob (line 1217) | @Override
method updateClob (line 1222) | @Override
method updateNClob (line 1227) | @Override
method updateNClob (line 1232) | @Override
method getObject (line 1237) | @Override
method getObject (line 1243) | @Override
method unwrap (line 1249) | @Override
method isWrapperFor (line 1255) | @Override
method getColumnCount (line 1260) | @Override
method isAutoIncrement (line 1265) | @Override
method isCaseSensitive (line 1270) | @Override
method isSearchable (line 1275) | @Override
method isCurrency (line 1280) | @Override
method isNullable (line 1285) | @Override
method isSigned (line 1290) | @Override
method getColumnDisplaySize (line 1295) | @Override
method getColumnLabel (line 1300) | @Override
method getColumnName (line 1306) | @Override
method getSchemaName (line 1315) | @Override
method getPrecision (line 1320) | @Override
method getScale (line 1325) | @Override
method getTableName (line 1330) | @Override
method getCatalogName (line 1335) | @Override
method getColumnType (line 1340) | @Override
method getColumnTypeName (line 1345) | @Override
method isReadOnly (line 1350) | @Override
method isWritable (line 1355) | @Override
method isDefinitelyWritable (line 1360) | @Override
method getColumnClassName (line 1365) | @Override
method calculateTimezoneOffset (line 1370) | private long calculateTimezoneOffset(long timeMillis, Calendar targetC...
type ResultSetSupplier (line 1381) | @FunctionalInterface
method get (line 1389) | T get() throws Exception;
method wrapTypeConversion (line 1392) | private <T> T wrapTypeConversion(ResultSetSupplier<T> supplier) throws...
FILE: bindings/java/src/main/java/tech/turso/jdbc4/JDBC4Statement.java
class JDBC4Statement (line 21) | public class JDBC4Statement implements Statement {
method JDBC4Statement (line 64) | public JDBC4Statement(JDBC4Connection connection) {
method JDBC4Statement (line 72) | public JDBC4Statement(
method executeQuery (line 84) | @Override
method executeUpdate (line 103) | @Override
method close (line 115) | @Override
method getMaxFieldSize (line 128) | @Override
method setMaxFieldSize (line 134) | @Override
method getMaxRows (line 139) | @Override
method setMaxRows (line 145) | @Override
method setEscapeProcessing (line 150) | @Override
method getQueryTimeout (line 155) | @Override
method setQueryTimeout (line 161) | @Override
method cancel (line 169) | @Override
method getWarnings (line 174) | @Override
method clearWarnings (line 181) | @Override
method setCursorName (line 186) | @Override
method execute (line 196) | @Override
method getResultSet (line 217) | @Override
method getUpdateCount (line 224) | @Override
method setFetchDirection (line 229) | @Override
method getFetchDirection (line 234) | @Override
method setFetchSize (line 240) | @Override
method getFetchSize (line 245) | @Override
method getResultSetConcurrency (line 251) | @Override
method getResultSetType (line 256) | @Override
method addBatch (line 261) | @Override
method clearBatch (line 270) | @Override
method executeBatch (line 277) | @Override
method isBatchCompatibleStatement (line 333) | protected boolean isBatchCompatibleStatement(String sql) {
method getConnection (line 341) | @Override
method getMoreResults (line 346) | @Override
method getMoreResults (line 351) | @Override
method getGeneratedKeys (line 365) | @Override
method executeUpdate (line 372) | @Override
method executeUpdate (line 378) | @Override
method executeUpdate (line 384) | @Override
method execute (line 390) | @Override
method execute (line 396) | @Override
method execute (line 402) | @Override
method getResultSetHoldability (line 408) | @Override
method isClosed (line 413) | @Override
method setPoolable (line 418) | @Override
method isPoolable (line 423) | @Override
method closeOnCompletion (line 429) | @Override
method isCloseOnCompletion (line 441) | @Override
method unwrap (line 449) | @Override
method isWrapperFor (line 456) | @Override
method updateGeneratedKeys (line 462) | protected void updateGeneratedKeys() throws SQLException {
method withConnectionTimeout (line 466) | private <T> T withConnectionTimeout(SQLCallable<T> callable) throws SQ...
type SQLCallable (line 487) | @FunctionalInterface
method call (line 495) | T call() throws SQLException;
method ensureOpen (line 498) | private void ensureOpen() throws SQLException {
FILE: bindings/java/src/main/java/tech/turso/utils/ByteArrayUtils.java
class ByteArrayUtils (line 7) | public final class ByteArrayUtils {
method utf8ByteBufferToString (line 14) | @Nullable
method stringToUtf8ByteArray (line 29) | @Nullable
FILE: bindings/java/src/main/java/tech/turso/utils/Logger.java
type Logger (line 4) | public interface Logger {
method trace (line 5) | void trace(String message, Object... params);
method debug (line 7) | void debug(String message, Object... params);
method info (line 9) | void info(String message, Object... params);
method warn (line 11) | void warn(String message, Object... params);
method error (line 13) | void error(String message, Object... params);
FILE: bindings/java/src/main/java/tech/turso/utils/LoggerFactory.java
class LoggerFactory (line 9) | public final class LoggerFactory {
method getLogger (line 29) | public static Logger getLogger(Class<?> hostClass) {
class JDKLogger (line 37) | private static class JDKLogger implements Logger {
method JDKLogger (line 40) | public JDKLogger(Class<?> hostClass) {
method trace (line 44) | @Override
method debug (line 51) | @Override
method info (line 58) | @Override
method warn (line 65) | @Override
method error (line 72) | @Override
class SLF4JLogger (line 80) | private static class SLF4JLogger implements Logger {
method SLF4JLogger (line 83) | SLF4JLogger(Class<?> hostClass) {
method trace (line 87) | @Override
method debug (line 94) | @Override
method info (line 101) | @Override
method warn (line 108) | @Override
method error (line 115) | @Override
FILE: bindings/java/src/main/java/tech/turso/utils/TursoExceptionUtils.java
class TursoExceptionUtils (line 10) | public final class TursoExceptionUtils {
method throwTursoException (line 18) | public static void throwTursoException(int errorCode, byte[] errorMess...
method buildTursoException (line 30) | public static TursoException buildTursoException(int errorCode, @Nulla...
FILE: bindings/java/src/test/java/tech/turso/IntegrationTest.java
class IntegrationTest (line 11) | class IntegrationTest {
method setUp (line 15) | @BeforeEach
method create_table_multi_inserts_select (line 22) | @Test
method createDefaultStatement (line 33) | private Statement createDefaultStatement() throws SQLException {
FILE: bindings/java/src/test/java/tech/turso/JDBCTest.java
class JDBCTest (line 14) | class JDBCTest {
method null_is_returned_when_invalid_url_is_passed (line 16) | @Test
method non_null_connection_is_returned_when_valid_url_is_passed (line 22) | @Test
method connection_can_be_retrieved_from_DriverManager (line 29) | @Test
method retrieve_version (line 36) | @Test
method all_driver_property_info_should_have_a_description (line 42) | @Test
method return_null_when_protocol_can_not_be_handled (line 49) | @Test
FILE: bindings/java/src/test/java/tech/turso/TestUtils.java
class TestUtils (line 6) | public class TestUtils {
method createTempFile (line 8) | public static String createTempFile() throws IOException {
FILE: bindings/java/src/test/java/tech/turso/core/TursoDBTest.java
class TursoDBTest (line 14) | public class TursoDBTest {
method db_should_open_and_close_normally (line 16) | @Test
method throwJavaException_should_throw_appropriate_java_exception (line 26) | @Test
method db_should_open_with_encryption (line 41) | @Test
FILE: bindings/java/src/test/java/tech/turso/core/TursoStatementTest.java
class TursoStatementTest (line 11) | class TursoStatementTest {
method setUp (line 15) | @BeforeEach
method closing_statement_closes_related_resources (line 22) | @Test
method test_initializeColumnMetadata (line 32) | @Test
method test_bindNull (line 47) | @Test
method test_bindLong (line 61) | @Test
method test_bindDouble (line 75) | @Test
method test_bindText (line 89) | @Test
method test_bindBlob (line 103) | @Test
method test_parameterCount (line 118) | @Test
method runSql (line 126) | private void runSql(String sql) throws Exception {
FILE: bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ConnectionTest.java
class JDBC4ConnectionTest (line 13) | class JDBC4ConnectionTest {
method setUp (line 17) | @BeforeEach
method test_create_statement_valid (line 24) | @Test
method test_create_statement_with_type_and_concurrency_valid (line 33) | @Test
method test_create_statement_with_all_params_valid (line 42) | @Test
method test_create_statement_invalid (line 55) | @Test
method prepare_simple_create_table (line 64) | @Test
method calling_close_multiple_times_throws_no_exception (line 69) | @Test
method calling_methods_on_closed_connection_should_throw_exception (line 77) | @Test
method isValid_should_return_true_on_open_connection (line 88) | @Test
method isValid_should_return_false_on_closed_connection (line 93) | @Test
FILE: bindings/java/src/test/java/tech/turso/jdbc4/JDBC4DatabaseMetaDataTest.java
class JDBC4DatabaseMetaDataTest (line 17) | class JDBC4DatabaseMetaDataTest {
method set_up (line 22) | @BeforeEach
method getURL_should_return_non_empty_string (line 30) | @Test
method getDriverName_should_not_return_empty_string (line 35) | @Test
method test_getDriverMajorVersion (line 40) | @Test
method test_getDriverMinorVersion (line 45) | @Test
method getDriverVersion_should_not_return_empty_string (line 50) | @Test
method getTables_with_non_empty_catalog_should_return_empty (line 55) | @Test
method getTables_with_non_empty_schema_should_return_empty (line 63) | @Test
method getTables_should_return_correct_table_info (line 71) | @Test
method getTables_with_pattern_should_filter_results (line 91) | @Test
method getTables_with_type_filter_should_return_only_views (line 116) | @Test
method getTables_with_pattern_and_type_filter_should_work_together (line 137) | @Test
FILE: bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java
class JDBC4PreparedStatementTest (line 17) | class JDBC4PreparedStatementTest {
method setUp (line 21) | @BeforeEach
method testSetBoolean (line 28) | @Test
method testSetByte (line 48) | @Test
method testSetShort (line 68) | @Test
method testSetInt (line 88) | @Test
method testSetLong (line 108) | @Test
method testSetFloat (line 128) | @Test
method testSetDouble (line 148) | @Test
method testSetBigDecimal (line 168) | @Test
method testSetString (line 188) | @Test
method testSetBytes (line 208) | @Test
method testSetDate (line 228) | @Test
method testSetTime (line 254) | @Test
method testSetTimestamp (line 280) | @Test
method testInsertMultipleTypes (line 306) | @Test
method testSetObjectCoversAllSupportedTypes (line 343) | @Test
method testSetAsciiStream_intLength_insert_and_select (line 393) | @Test
method testSetAsciiStream_intLength_nullStream (line 413) | @Test
method testSetAsciiStream_intLength_emptyStream (line 429) | @Test
method testSetAsciiStream_intLength_negativeLength (line 446) | @Test
method testSetBinaryStream_intLength_insert_and_select (line 459) | @Test
method testSetBinaryStream_intLength_nullStream (line 478) | @Test
method testSetBinaryStream_intLength_emptyStream (line 494) | @Test
method testSetBinaryStream_intLength_negativeLength (line 515) | @Test
method testSetUnicodeStream_intLength_insert_and_select (line 527) | @Test
method testSetUnicodeStream_intLength_nullStream (line 547) | @Test
method testSetUnicodeStream_intLength_emptyStream (line 563) | @Test
method testSetUnicodeStream_intLength_negativeLength (line 580) | @Test
method testSetAsciiStream_longLength_insert_and_select (line 593) | @Test
method testSetAsciiStream_longLength_nullStream (line 613) | @Test
method testSetAsciiStream_longLength_emptyStream (line 629) | @Test
method testSetAsciiStream_longLength_negative (line 646) | @Test
method testSetAsciiStream_longLength_overflow (line 656) | @Test
method testSetBinaryStream_longLength_insert_and_select (line 668) | @Test
method testSetBinaryStream_longLength_nullStream (line 687) | @Test
method testSetBinaryStream_longLength_emptyStream (line 703) | @Test
method testSetBinaryStream_longLength_negative (line 724) | @Test
method testSetBinaryStream_longLength_overflow (line 734) | @Test
method testSetAsciiStream_noLength_insert_and_select (line 746) | @Test
method testSetAsciiStream_noLength_nullStream (line 765) | @Test
method testSetAsciiStream_noLength_emptyStream (line 778) | @Test
method testSetBinaryStream_noLength_insert_and_select (line 792) | @Test
method testSetBinaryStream_noLength_nullStream (line 810) | @Test
method testSetBinaryStream_noLength_emptyStream (line 823) | @Test
method testSetCharacterStream_intLength_insert_and_select (line 840) | @Test
method testSetCharacterStream_intLength_shorterThanLength (line 857) | @Test
method testSetCharacterStream_intLength_zero (line 872) | @Test
method testSetCharacterStream_intLength_nullReader (line 887) | @Test
method testSetCharacterStream_intLength_negativeLength (line 901) | @Test
method testSetCharacterStream_noLength_insert_and_select (line 911) | @Test
method testSetCharacterStream_noLength_nullReader (line 929) | @Test
method testSetCharacterStream_noLength_emptyReader (line 943) | @Test
method testSetCharacterStream_longLength_insert_and_select (line 958) | @Test
method testSetCharacterStream_longLength_nullReader (line 976) | @Test
method testSetCharacterStream_longLength_emptyReader (line 991) | @Test
method testSetCharacterStream_longLength_shorterThanLength (line 1008) | @Test
method testSetCharacterStream_longLength_zero (line 1025) | @Test
method testSetCharacterStream_longLength_negative (line 1042) | @Test
method testSetCharacterStream_longLength_overflow (line 1053) | @Test
method execute_insert_should_return_number_of_inserted_elements (line 1065) | @Test
method execute_update_should_return_number_of_updated_elements (line 1076) | @Test
method execute_delete_should_return_number_of_deleted_elements (line 1086) | @Test
method testBatchInsert (line 1096) | @Test
method testBatchUpdate (line 1121) | @Test
method testBatchDelete (line 1151) | @Test
method testBatch_implicitAddBatch_shouldIgnore (line 1173) | @Test
method testBatch_select_shouldFail (line 1196) | @Test
FILE: bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ResultSetTest.java
class JDBC4ResultSetTest (line 21) | class JDBC4ResultSetTest {
method setUp (line 25) | @BeforeEach
method invoking_next_before_the_last_row_should_return_true (line 37) | @Test
method invoking_next_after_the_last_row_should_return_false (line 50) | @Test
method close_resultSet_test (line 69) | @Test
method calling_methods_on_closed_resultSet_should_throw_exception (line 79) | @Test
method test_getString (line 89) | @Test
method test_getString_returns_null_on_null (line 99) | @Test
method test_getBoolean_true (line 109) | @Test
method test_getBoolean_false (line 124) | @Test
method test_getBoolean_returns_false_on_null (line 134) | @Test
method test_getByte (line 144) | @Test
method test_getByte_returns_zero_on_null (line 166) | @Test
method test_getShort (line 176) | @Test
method test_getShort_returns_zero_on_null (line 198) | @Test
method test_getInt (line 208) | @Test
method test_getInt_returns_zero_on_null (line 230) | @Test
method test_getLong (line 240) | @Test
method test_getLong_returns_zero_no_null (line 264) | @Test
method test_getFloat (line 274) | @Test
method test_getFloat_returns_zero_on_null (line 304) | @Test
method test_getDouble (line 314) | @Test
method test_getDouble_returns_zero_on_null (line 346) | @Test
method test_getBigDecimal (line 356) | @Test
method test_getBigDecimal_returns_null_on_null (line 397) | @Test
method test_getBytes (line 407) | @ParameterizedTest
method byteArrayProvider (line 414) | private static Stream<byte[]> byteArrayProvider() {
method executeDMLAndAssert (line 419) | private void executeDMLAndAssert(byte[] data) throws SQLException {
method test_getBytes_returns_null_on_null (line 434) | @Test
method test_getXXX_methods_on_multiple_columns (line 444) | @Test
method test_invalidColumnIndex_outOfBounds (line 490) | @Test
method test_invalidColumnIndex_negative (line 502) | @Test
method test_findColumn_with_exact_name (line 514) | @Test
method test_findColumn_with_duplicate_names (line 527) | @Test
method test_findColumn_with_nonexistent_column (line 540) | @Test
method test_findColumn_with_alias (line 553) | @Test
method test_findColumn_with_empty_string (line 567) | @Test
method test_findColumn_with_special_characters (line 579) | @Test
method test_getCharacterStream (line 592) | @Test
method test_getCharacterStream_with_columnLabel (line 608) | @Test
method test_getCharacterStream_returns_null_on_null (line 623) | @Test
method test_getBigDecimal_with_columnLabel (line 633) | @Test
method test_isBeforeFirst_and_isAfterLast (line 644) | @Test
method test_isBeforeFirst_with_empty_resultSet (line 672) | @Test
method test_getRow (line 684) | @Test
method test_getDate_with_calendar (line 713) | @Test
method test_getDate_with_calendar_columnLabel (line 743) | @Test
method test_getTime_with_calendar (line 766) | @Test
method test_getTime_with_calendar_columnLabel (line 796) | @Test
method test_getTimestamp_with_calendar (line 819) | @Test
method test_getTimestamp_with_calendar_columnLabel (line 850) | @Test
method test_wasNull (line 874) | @Test
method test_columnLabel_getters (line 899) | @Test
method test_getObject_with_columnLabel (line 930) | @Test
method test_getBigDecimal_with_scale_columnLabel (line 947) | @Test
method test_getTime_with_columnLabel (line 959) | @Test
method test_getAsciiStream (line 979) | @Test
method test_getAsciiStream_with_columnLabel (line 996) | @Test
method test_getBinaryStream (line 1011) | @Test
method test_getBinaryStream_with_columnLabel (line 1034) | @Test
method test_getUnicodeStream (line 1055) | @Test
method test_getUnicodeStream_with_columnLabel (line 1072) | @Test
method test_stream_methods_return_null_on_null (line 1088) | @Test
method test_getMetaData_column_count (line 1106) | @Test
method test_wasNull_consistency_across_types (line 1122) | @Test
FILE: bindings/java/src/test/java/tech/turso/jdbc4/JDBC4StatementTest.java
class JDBC4StatementTest (line 19) | class JDBC4StatementTest {
method setUp (line 23) | @BeforeEach
method execute_ddl_should_return_false (line 35) | @Test
method execute_insert_should_return_false (line 40) | @Test
method execute_update_should_return_false (line 46) | @Test
method execute_select_should_return_true (line 53) | @Test
method execute_select (line 60) | @Test
method close_statement_test (line 84) | @Test
method double_close_is_no_op (line 90) | @Test
method operations_on_closed_statement_should_throw_exception (line 96) | @Test
method execute_update_should_return_number_of_inserted_elements (line 102) | @Test
method execute_update_should_return_number_of_updated_elements (line 110) | @Test
method execute_update_should_return_number_of_deleted_elements (line 117) | @Test
method testAddBatch_single_statement (line 126) | @Test
method testAddBatch_multiple_statements (line 142) | @Test
method testAddBatch_with_updates_and_deletes (line 162) | @Test
method testClearBatch (line 186) | @Test
method testBatch_with_SELECT_should_throw_exception (line 203) | @Test
method testBatch_with_null_command_should_throw_exception (line 223) | @Test
method testBatch_operations_on_closed_statement_should_throw_exception (line 228) | @Test
method testBatch_with_syntax_error_should_throw_exception (line 237) | @Test
method testBatch_empty_batch_returns_empty_array (line 254) | @Test
method testBatch_clears_after_successful_execution (line 260) | @Test
method testBatch_clears_after_failed_execution (line 271) | @Test
method testIsBatchCompatibleStatement_compatible_statements (line 284) | @Test
method testIsBatchCompatibleStatement_non_compatible_statements (line 336) | @Test
method testIsBatchCompatibleStatement_edge_cases (line 364) | @Test
method testIsBatchCompatibleStatement_case_insensitive (line 386) | @Test
FILE: bindings/java/src/test/java/tech/turso/jdbc4/TransactionTest.java
class TransactionTest (line 12) | public class TransactionTest {
method setUp (line 17) | @BeforeEach
method tearDown (line 24) | @AfterEach
method test_default_auto_commit (line 31) | @Test
method test_commit_rollback_in_auto_commit_mode (line 36) | @Test
method test_basic_commit (line 45) | @Test
method test_basic_rollback (line 64) | @Test
method test_auto_commit_toggle_commits (line 85) | @Test
method test_isolation_level (line 107) | @Test
method test_no_op_commit_rollback (line 140) | @Test
method test_savepoints_not_supported (line 161) | @Test
method test_close_without_commit_rolls_back (line 169) | @Test
method test_mixed_commit_rollback_scenario (line 195) | @Test
method test_double_close_is_safe (line 233) | @Test
method test_idempotent_set_auto_commit (line 241) | @Test
method test_manual_transaction_control_passthrough (line 256) | @Test
FILE: bindings/javascript/.yarn/releases/yarn-4.9.2.cjs
function wc (line 4) | function wc(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}
function YVe (line 4) | function YVe(t){return wc("EBUSY",t)}
function VVe (line 4) | function VVe(t,e){return wc("ENOSYS",`${t}, ${e}`)}
function KVe (line 4) | function KVe(t){return wc("EINVAL",`invalid argument, ${t}`)}
function Uo (line 4) | function Uo(t){return wc("EBADF",`bad file descriptor, ${t}`)}
function JVe (line 4) | function JVe(t){return wc("ENOENT",`no such file or directory, ${t}`)}
function zVe (line 4) | function zVe(t){return wc("ENOTDIR",`not a directory, ${t}`)}
function ZVe (line 4) | function ZVe(t){return wc("EISDIR",`illegal operation on a directory, ${...
function XVe (line 4) | function XVe(t){return wc("EEXIST",`file already exists, ${t}`)}
function $Ve (line 4) | function $Ve(t){return wc("EROFS",`read-only filesystem, ${t}`)}
function e7e (line 4) | function e7e(t){return wc("ENOTEMPTY",`directory not empty, ${t}`)}
function t7e (line 4) | function t7e(t){return wc("EOPNOTSUPP",`operation not supported, ${t}`)}
function I_ (line 4) | function I_(){return wc("ERR_DIR_CLOSED","Directory handle was closed")}
function y$ (line 4) | function y$(){return new tE}
function r7e (line 4) | function r7e(){return sx(y$())}
function sx (line 4) | function sx(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r...
function n7e (line 4) | function n7e(t){let e=new rE;for(let r in t)if(Object.hasOwn(t,r)){let s...
function v_ (line 4) | function v_(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs...
method constructor (line 4) | constructor(){this.name="";this.path="";this.mode=0}
method isBlockDevice (line 4) | isBlockDevice(){return!1}
method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
method isFIFO (line 4) | isFIFO(){return!1}
method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
method isSocket (line 4) | isSocket(){return!1}
method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
method constructor (line 4) | constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atim...
method isBlockDevice (line 4) | isBlockDevice(){return!1}
method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
method isFIFO (line 4) | isFIFO(){return!1}
method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
method isSocket (line 4) | isSocket(){return!1}
method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
method constructor (line 4) | constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);...
method isBlockDevice (line 4) | isBlockDevice(){return!1}
method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
method isDirectory (line 4) | isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}
method isFIFO (line 4) | isFIFO(){return!1}
method isFile (line 4) | isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}
method isSocket (line 4) | isSocket(){return!1}
method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}
function l7e (line 4) | function l7e(t){let e,r;if(e=t.match(o7e))t=e[1];else if(r=t.match(a7e))...
function c7e (line 4) | function c7e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(i7e))?t=...
function ox (line 4) | function ox(t,e){return t===ue?I$(e):D_(e)}
function ax (line 4) | async function ax(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.i...
function C$ (line 4) | async function C$(t,e,r,s,a){let n=t.pathUtils.normalize(e),c=r.pathUtil...
function b_ (line 4) | async function b_(t,e,r,s,a,n,c){let f=c.didParentExist?await w$(r,s):nu...
function w$ (line 4) | async function w$(t,e){try{return await t.lstatPromise(e)}catch{return n...
function f7e (line 4) | async function f7e(t,e,r,s,a,n,c,f,p){if(a!==null&&!a.isDirectory())if(p...
function A7e (line 4) | async function A7e(t,e,r,s,a,n,c,f,p,h){let E=await n.checksumFilePromis...
function p7e (line 4) | async function p7e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(...
function h7e (line 4) | async function h7e(t,e,r,s,a,n,c,f,p){return p.linkStrategy?.type==="Har...
function g7e (line 4) | async function g7e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(...
function lx (line 4) | function lx(t,e,r,s){let a=()=>{let n=r.shift();if(typeof n>"u")return n...
method constructor (line 4) | constructor(e,r,s={}){this.path=e;this.nextDirent=r;this.opts=s;this.clo...
method throwIfClosed (line 4) | throwIfClosed(){if(this.closed)throw I_()}
method [Symbol.asyncIterator] (line 4) | async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==nu...
method read (line 4) | read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.reso...
method readSync (line 4) | readSync(){return this.throwIfClosed(),this.nextDirent()}
method close (line 4) | close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}
method closeSync (line 4) | closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}
function v$ (line 4) | function v$(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: e...
method constructor (line 4) | constructor(r,s,{bigint:a=!1}={}){super();this.status="ready";this.chang...
method create (line 4) | static create(r,s,a){let n=new t(r,s,a);return n.start(),n}
method start (line 4) | start(){v$(this.status,"ready"),this.status="running",this.startTimeout=...
method stop (line 4) | stop(){v$(this.status,"running"),this.status="stopped",this.startTimeout...
method stat (line 4) | stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}c...
method makeInterval (line 4) | makeInterval(r){let s=setInterval(()=>{let a=this.stat(),n=this.lastStat...
method registerChangeListener (line 4) | registerChangeListener(r,s){this.addListener("change",r),this.changeList...
method unregisterChangeListener (line 4) | unregisterChangeListener(r){this.removeListener("change",r);let s=this.c...
method unregisterAllChangeListeners (line 4) | unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())...
method hasChangeListeners (line 4) | hasChangeListeners(){return this.changeListeners.size>0}
method ref (line 4) | ref(){for(let r of this.changeListeners.values())r.ref();return this}
method unref (line 4) | unref(){for(let r of this.changeListeners.values())r.unref();return this}
function nE (line 4) | function nE(t,e,r,s){let a,n,c,f;switch(typeof r){case"function":a=!1,n=...
function dd (line 4) | function dd(t,e,r){let s=ux.get(t);if(typeof s>"u")return;let a=s.get(e)...
function md (line 4) | function md(t){let e=ux.get(t);if(!(typeof e>"u"))for(let r of e.keys())...
function d7e (line 4) | function d7e(t){let e=t.match(/\r?\n/g);if(e===null)return P$.EOL;let r=...
function yd (line 7) | function yd(t,e){return e.replace(/\r?\n/g,d7e(t))}
method constructor (line 7) | constructor(e){this.pathUtils=e}
method genTraversePromise (line 7) | async*genTraversePromise(e,{stableSort:r=!1}={}){let s=[e];for(;s.length...
method checksumFilePromise (line 7) | async checksumFilePromise(e,{algorithm:r="sha512"}={}){let s=await this....
method removePromise (line 7) | async removePromise(e,{recursive:r=!0,maxRetries:s=5}={}){let a;try{a=aw...
method removeSync (line 7) | removeSync(e,{recursive:r=!0}={}){let s;try{s=this.lstatSync(e)}catch(a)...
method mkdirpPromise (line 7) | async mkdirpPromise(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===th...
method mkdirpSync (line 7) | mkdirpSync(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUt...
method copyPromise (line 7) | async copyPromise(e,r,{baseFs:s=this,overwrite:a=!0,stableSort:n=!1,stab...
method copySync (line 7) | copySync(e,r,{baseFs:s=this,overwrite:a=!0}={}){let n=s.lstatSync(r),c=t...
method changeFilePromise (line 7) | async changeFilePromise(e,r,s={}){return Buffer.isBuffer(r)?this.changeF...
method changeFileBufferPromise (line 7) | async changeFileBufferPromise(e,r,{mode:s}={}){let a=Buffer.alloc(0);try...
method changeFileTextPromise (line 7) | async changeFileTextPromise(e,r,{automaticNewlines:s,mode:a}={}){let n="...
method changeFileSync (line 7) | changeFileSync(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBuffer...
method changeFileBufferSync (line 7) | changeFileBufferSync(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=this.r...
method changeFileTextSync (line 7) | changeFileTextSync(e,r,{automaticNewlines:s=!1,mode:a}={}){let n="";try{...
method movePromise (line 7) | async movePromise(e,r){try{await this.renamePromise(e,r)}catch(s){if(s.c...
method moveSync (line 7) | moveSync(e,r){try{this.renameSync(e,r)}catch(s){if(s.code==="EXDEV")this...
method lockPromise (line 7) | async lockPromise(e,r){let s=`${e}.flock`,a=1e3/60,n=Date.now(),c=null,f...
method readJsonPromise (line 7) | async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{...
method readJsonSync (line 7) | readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(...
method writeJsonPromise (line 7) | async writeJsonPromise(e,r,{compact:s=!1}={}){let a=s?0:2;return await t...
method writeJsonSync (line 8) | writeJsonSync(e,r,{compact:s=!1}={}){let a=s?0:2;return this.writeFileSy...
method preserveTimePromise (line 9) | async preserveTimePromise(e,r){let s=await this.lstatPromise(e),a=await ...
method preserveTimeSync (line 9) | async preserveTimeSync(e,r){let s=this.lstatSync(e),a=r();typeof a<"u"&&...
method constructor (line 9) | constructor(){super(K)}
method getExtractHint (line 9) | getExtractHint(e){return this.baseFs.getExtractHint(e)}
method resolve (line 9) | resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}
method getRealPath (line 9) | getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}
method openPromise (line 9) | async openPromise(e,r,s){return this.baseFs.openPromise(this.mapToBase(e...
method openSync (line 9) | openSync(e,r,s){return this.baseFs.openSync(this.mapToBase(e),r,s)}
method opendirPromise (line 9) | async opendirPromise(e,r){return Object.assign(await this.baseFs.opendir...
method opendirSync (line 9) | opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapTo...
method readPromise (line 9) | async readPromise(e,r,s,a,n){return await this.baseFs.readPromise(e,r,s,...
method readSync (line 9) | readSync(e,r,s,a,n){return this.baseFs.readSync(e,r,s,a,n)}
method writePromise (line 9) | async writePromise(e,r,s,a,n){return typeof r=="string"?await this.baseF...
method writeSync (line 9) | writeSync(e,r,s,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r...
method closePromise (line 9) | async closePromise(e){return this.baseFs.closePromise(e)}
method closeSync (line 9) | closeSync(e){this.baseFs.closeSync(e)}
method createReadStream (line 9) | createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this....
method createWriteStream (line 9) | createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?thi...
method realpathPromise (line 9) | async realpathPromise(e){return this.mapFromBase(await this.baseFs.realp...
method realpathSync (line 9) | realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.ma...
method existsPromise (line 9) | async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}
method existsSync (line 9) | existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}
method accessSync (line 9) | accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}
method accessPromise (line 9) | async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase...
method statPromise (line 9) | async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}
method statSync (line 9) | statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}
method fstatPromise (line 9) | async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}
method fstatSync (line 9) | fstatSync(e,r){return this.baseFs.fstatSync(e,r)}
method lstatPromise (line 9) | lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}
method lstatSync (line 9) | lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}
method fchmodPromise (line 9) | async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}
method fchmodSync (line 9) | fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}
method chmodPromise (line 9) | async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e...
method chmodSync (line 9) | chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}
method fchownPromise (line 9) | async fchownPromise(e,r,s){return this.baseFs.fchownPromise(e,r,s)}
method fchownSync (line 9) | fchownSync(e,r,s){return this.baseFs.fchownSync(e,r,s)}
method chownPromise (line 9) | async chownPromise(e,r,s){return this.baseFs.chownPromise(this.mapToBase...
method chownSync (line 9) | chownSync(e,r,s){return this.baseFs.chownSync(this.mapToBase(e),r,s)}
method renamePromise (line 9) | async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase...
method renameSync (line 9) | renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.map...
method copyFilePromise (line 9) | async copyFilePromise(e,r,s=0){return this.baseFs.copyFilePromise(this.m...
method copyFileSync (line 9) | copyFileSync(e,r,s=0){return this.baseFs.copyFileSync(this.mapToBase(e),...
method appendFilePromise (line 9) | async appendFilePromise(e,r,s){return this.baseFs.appendFilePromise(this...
method appendFileSync (line 9) | appendFileSync(e,r,s){return this.baseFs.appendFileSync(this.fsMapToBase...
method writeFilePromise (line 9) | async writeFilePromise(e,r,s){return this.baseFs.writeFilePromise(this.f...
method writeFileSync (line 9) | writeFileSync(e,r,s){return this.baseFs.writeFileSync(this.fsMapToBase(e...
method unlinkPromise (line 9) | async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}
method unlinkSync (line 9) | unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}
method utimesPromise (line 9) | async utimesPromise(e,r,s){return this.baseFs.utimesPromise(this.mapToBa...
method utimesSync (line 9) | utimesSync(e,r,s){return this.baseFs.utimesSync(this.mapToBase(e),r,s)}
method lutimesPromise (line 9) | async lutimesPromise(e,r,s){return this.baseFs.lutimesPromise(this.mapTo...
method lutimesSync (line 9) | lutimesSync(e,r,s){return this.baseFs.lutimesSync(this.mapToBase(e),r,s)}
method mkdirPromise (line 9) | async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e...
method mkdirSync (line 9) | mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}
method rmdirPromise (line 9) | async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e...
method rmdirSync (line 9) | rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}
method rmPromise (line 9) | async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}
method rmSync (line 9) | rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}
method linkPromise (line 9) | async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),...
method linkSync (line 9) | linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBa...
method symlinkPromise (line 9) | async symlinkPromise(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.is...
method symlinkSync (line 9) | symlinkSync(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(...
method readFilePromise (line 9) | async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMap...
method readFileSync (line 9) | readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}
method readdirPromise (line 9) | readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}
method readdirSync (line 9) | readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}
method readlinkPromise (line 9) | async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readl...
method readlinkSync (line 9) | readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.ma...
method truncatePromise (line 9) | async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapTo...
method truncateSync (line 9) | truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}
method ftruncatePromise (line 9) | async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}
method ftruncateSync (line 9) | ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}
method watch (line 9) | watch(e,r,s){return this.baseFs.watch(this.mapToBase(e),r,s)}
method watchFile (line 9) | watchFile(e,r,s){return this.baseFs.watchFile(this.mapToBase(e),r,s)}
method unwatchFile (line 9) | unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}
method fsMapToBase (line 9) | fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}
method constructor (line 9) | constructor(e,{baseFs:r,pathUtils:s}){super(s),this.target=e,this.baseFs=r}
method getRealPath (line 9) | getRealPath(){return this.target}
method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
method mapFromBase (line 9) | mapFromBase(e){return e}
method mapToBase (line 9) | mapToBase(e){return e}
function k$ (line 9) | function k$(t){let e=t;return typeof t.path=="string"&&(e.path=ue.toPort...
method constructor (line 9) | constructor(e=Q$.default){super(),this.realFs=e}
method getExtractHint (line 9) | getExtractHint(){return!1}
method getRealPath (line 9) | getRealPath(){return vt.root}
method resolve (line 9) | resolve(e){return K.resolve(e)}
method openPromise (line 9) | async openPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.op...
method openSync (line 9) | openSync(e,r,s){return this.realFs.openSync(ue.fromPortablePath(e),r,s)}
method opendirPromise (line 9) | async opendirPromise(e,r){return await new Promise((s,a)=>{typeof r<"u"?...
method opendirSync (line 9) | opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(ue.fromPorta...
method readPromise (line 9) | async readPromise(e,r,s=0,a=0,n=-1){return await new Promise((c,f)=>{thi...
method readSync (line 9) | readSync(e,r,s,a,n){return this.realFs.readSync(e,r,s,a,n)}
method writePromise (line 9) | async writePromise(e,r,s,a,n){return await new Promise((c,f)=>typeof r==...
method writeSync (line 9) | writeSync(e,r,s,a,n){return typeof r=="string"?this.realFs.writeSync(e,r...
method closePromise (line 9) | async closePromise(e){await new Promise((r,s)=>{this.realFs.close(e,this...
method closeSync (line 9) | closeSync(e){this.realFs.closeSync(e)}
method createReadStream (line 9) | createReadStream(e,r){let s=e!==null?ue.fromPortablePath(e):e;return thi...
method createWriteStream (line 9) | createWriteStream(e,r){let s=e!==null?ue.fromPortablePath(e):e;return th...
method realpathPromise (line 9) | async realpathPromise(e){return await new Promise((r,s)=>{this.realFs.re...
method realpathSync (line 9) | realpathSync(e){return ue.toPortablePath(this.realFs.realpathSync(ue.fro...
method existsPromise (line 9) | async existsPromise(e){return await new Promise(r=>{this.realFs.exists(u...
method accessSync (line 9) | accessSync(e,r){return this.realFs.accessSync(ue.fromPortablePath(e),r)}
method accessPromise (line 9) | async accessPromise(e,r){return await new Promise((s,a)=>{this.realFs.ac...
method existsSync (line 9) | existsSync(e){return this.realFs.existsSync(ue.fromPortablePath(e))}
method statPromise (line 9) | async statPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.st...
method statSync (line 9) | statSync(e,r){return r?this.realFs.statSync(ue.fromPortablePath(e),r):th...
method fstatPromise (line 9) | async fstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.f...
method fstatSync (line 9) | fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync...
method lstatPromise (line 9) | async lstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.l...
method lstatSync (line 9) | lstatSync(e,r){return r?this.realFs.lstatSync(ue.fromPortablePath(e),r):...
method fchmodPromise (line 9) | async fchmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.fc...
method fchmodSync (line 9) | fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}
method chmodPromise (line 9) | async chmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.chm...
method chmodSync (line 9) | chmodSync(e,r){return this.realFs.chmodSync(ue.fromPortablePath(e),r)}
method fchownPromise (line 9) | async fchownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs....
method fchownSync (line 9) | fchownSync(e,r,s){return this.realFs.fchownSync(e,r,s)}
method chownPromise (line 9) | async chownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.c...
method chownSync (line 9) | chownSync(e,r,s){return this.realFs.chownSync(ue.fromPortablePath(e),r,s)}
method renamePromise (line 9) | async renamePromise(e,r){return await new Promise((s,a)=>{this.realFs.re...
method renameSync (line 9) | renameSync(e,r){return this.realFs.renameSync(ue.fromPortablePath(e),ue....
method copyFilePromise (line 9) | async copyFilePromise(e,r,s=0){return await new Promise((a,n)=>{this.rea...
method copyFileSync (line 9) | copyFileSync(e,r,s=0){return this.realFs.copyFileSync(ue.fromPortablePat...
method appendFilePromise (line 9) | async appendFilePromise(e,r,s){return await new Promise((a,n)=>{let c=ty...
method appendFileSync (line 9) | appendFileSync(e,r,s){let a=typeof e=="string"?ue.fromPortablePath(e):e;...
method writeFilePromise (line 9) | async writeFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typ...
method writeFileSync (line 9) | writeFileSync(e,r,s){let a=typeof e=="string"?ue.fromPortablePath(e):e;s...
method unlinkPromise (line 9) | async unlinkPromise(e){return await new Promise((r,s)=>{this.realFs.unli...
method unlinkSync (line 9) | unlinkSync(e){return this.realFs.unlinkSync(ue.fromPortablePath(e))}
method utimesPromise (line 9) | async utimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs....
method utimesSync (line 9) | utimesSync(e,r,s){this.realFs.utimesSync(ue.fromPortablePath(e),r,s)}
method lutimesPromise (line 9) | async lutimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs...
method lutimesSync (line 9) | lutimesSync(e,r,s){this.realFs.lutimesSync(ue.fromPortablePath(e),r,s)}
method mkdirPromise (line 9) | async mkdirPromise(e,r){return await new Promise((s,a)=>{this.realFs.mkd...
method mkdirSync (line 9) | mkdirSync(e,r){return this.realFs.mkdirSync(ue.fromPortablePath(e),r)}
method rmdirPromise (line 9) | async rmdirPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.r...
method rmdirSync (line 9) | rmdirSync(e,r){return this.realFs.rmdirSync(ue.fromPortablePath(e),r)}
method rmPromise (line 9) | async rmPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rm(u...
method rmSync (line 9) | rmSync(e,r){return this.realFs.rmSync(ue.fromPortablePath(e),r)}
method linkPromise (line 9) | async linkPromise(e,r){return await new Promise((s,a)=>{this.realFs.link...
method linkSync (line 9) | linkSync(e,r){return this.realFs.linkSync(ue.fromPortablePath(e),ue.from...
method symlinkPromise (line 9) | async symlinkPromise(e,r,s){return await new Promise((a,n)=>{this.realFs...
method symlinkSync (line 9) | symlinkSync(e,r,s){return this.realFs.symlinkSync(ue.fromPortablePath(e....
method readFilePromise (line 9) | async readFilePromise(e,r){return await new Promise((s,a)=>{let n=typeof...
method readFileSync (line 9) | readFileSync(e,r){let s=typeof e=="string"?ue.fromPortablePath(e):e;retu...
method readdirPromise (line 9) | async readdirPromise(e,r){return await new Promise((s,a)=>{r?r.recursive...
method readdirSync (line 9) | readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.with...
method readlinkPromise (line 9) | async readlinkPromise(e){return await new Promise((r,s)=>{this.realFs.re...
method readlinkSync (line 9) | readlinkSync(e){return ue.toPortablePath(this.realFs.readlinkSync(ue.fro...
method truncatePromise (line 9) | async truncatePromise(e,r){return await new Promise((s,a)=>{this.realFs....
method truncateSync (line 9) | truncateSync(e,r){return this.realFs.truncateSync(ue.fromPortablePath(e)...
method ftruncatePromise (line 9) | async ftruncatePromise(e,r){return await new Promise((s,a)=>{this.realFs...
method ftruncateSync (line 9) | ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}
method watch (line 9) | watch(e,r,s){return this.realFs.watch(ue.fromPortablePath(e),r,s)}
method watchFile (line 9) | watchFile(e,r,s){return this.realFs.watchFile(ue.fromPortablePath(e),r,s)}
method unwatchFile (line 9) | unwatchFile(e,r){return this.realFs.unwatchFile(ue.fromPortablePath(e),r)}
method makeCallback (line 9) | makeCallback(e,r){return(s,a)=>{s?r(s):e(a)}}
method constructor (line 9) | constructor(e,{baseFs:r=new Yn}={}){super(K),this.target=this.pathUtils....
method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
method resolve (line 9) | resolve(e){return this.pathUtils.isAbsolute(e)?K.normalize(e):this.baseF...
method mapFromBase (line 9) | mapFromBase(e){return e}
method mapToBase (line 9) | mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(t...
method constructor (line 9) | constructor(e,{baseFs:r=new Yn}={}){super(K),this.target=this.pathUtils....
method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
method getTarget (line 9) | getTarget(){return this.target}
method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
method mapToBase (line 9) | mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsol...
method mapFromBase (line 9) | mapFromBase(e){return this.pathUtils.resolve(R$,this.pathUtils.relative(...
method constructor (line 9) | constructor(r,s){super(s);this.instance=null;this.factory=r}
method baseFs (line 9) | get baseFs(){return this.instance||(this.instance=this.factory()),this.i...
method baseFs (line 9) | set baseFs(r){this.instance=r}
method mapFromBase (line 9) | mapFromBase(r){return r}
method mapToBase (line 9) | mapToBase(r){return r}
method constructor (line 9) | constructor({baseFs:r=new Yn,filter:s=null,magicByte:a=42,maxOpenFiles:n...
method getExtractHint (line 9) | getExtractHint(r){return this.baseFs.getExtractHint(r)}
method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
method saveAndClose (line 9) | saveAndClose(){if(md(this),this.mountInstances)for(let[r,{childFs:s}]of ...
method discardAndClose (line 9) | discardAndClose(){if(md(this),this.mountInstances)for(let[r,{childFs:s}]...
method resolve (line 9) | resolve(r){return this.baseFs.resolve(r)}
method remapFd (line 9) | remapFd(r,s){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,s...
method openPromise (line 9) | async openPromise(r,s,a){return await this.makeCallPromise(r,async()=>aw...
method openSync (line 9) | openSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,s,...
method opendirPromise (line 9) | async opendirPromise(r,s){return await this.makeCallPromise(r,async()=>a...
method opendirSync (line 9) | opendirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.opendirSync(...
method readPromise (line 9) | async readPromise(r,s,a,n,c){if((r&rl)!==this.magic)return await this.ba...
method readSync (line 9) | readSync(r,s,a,n,c){if((r&rl)!==this.magic)return this.baseFs.readSync(r...
method writePromise (line 9) | async writePromise(r,s,a,n,c){if((r&rl)!==this.magic)return typeof s=="s...
method writeSync (line 9) | writeSync(r,s,a,n,c){if((r&rl)!==this.magic)return typeof s=="string"?th...
method closePromise (line 9) | async closePromise(r){if((r&rl)!==this.magic)return await this.baseFs.cl...
method closeSync (line 9) | closeSync(r){if((r&rl)!==this.magic)return this.baseFs.closeSync(r);let ...
method createReadStream (line 9) | createReadStream(r,s){return r===null?this.baseFs.createReadStream(r,s):...
method createWriteStream (line 9) | createWriteStream(r,s){return r===null?this.baseFs.createWriteStream(r,s...
method realpathPromise (line 9) | async realpathPromise(r){return await this.makeCallPromise(r,async()=>aw...
method realpathSync (line 9) | realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(...
method existsPromise (line 9) | async existsPromise(r){return await this.makeCallPromise(r,async()=>awai...
method existsSync (line 9) | existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(...
method accessPromise (line 9) | async accessPromise(r,s){return await this.makeCallPromise(r,async()=>aw...
method accessSync (line 9) | accessSync(r,s){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,...
method statPromise (line 9) | async statPromise(r,s){return await this.makeCallPromise(r,async()=>awai...
method statSync (line 9) | statSync(r,s){return this.makeCallSync(r,()=>this.baseFs.statSync(r,s),(...
method fstatPromise (line 9) | async fstatPromise(r,s){if((r&rl)!==this.magic)return this.baseFs.fstatP...
method fstatSync (line 9) | fstatSync(r,s){if((r&rl)!==this.magic)return this.baseFs.fstatSync(r,s);...
method lstatPromise (line 9) | async lstatPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
method lstatSync (line 9) | lstatSync(r,s){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,s)...
method fchmodPromise (line 9) | async fchmodPromise(r,s){if((r&rl)!==this.magic)return this.baseFs.fchmo...
method fchmodSync (line 9) | fchmodSync(r,s){if((r&rl)!==this.magic)return this.baseFs.fchmodSync(r,s...
method chmodPromise (line 9) | async chmodPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
method chmodSync (line 9) | chmodSync(r,s){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,s)...
method fchownPromise (line 9) | async fchownPromise(r,s,a){if((r&rl)!==this.magic)return this.baseFs.fch...
method fchownSync (line 9) | fchownSync(r,s,a){if((r&rl)!==this.magic)return this.baseFs.fchownSync(r...
method chownPromise (line 9) | async chownPromise(r,s,a){return await this.makeCallPromise(r,async()=>a...
method chownSync (line 9) | chownSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,...
method renamePromise (line 9) | async renamePromise(r,s){return await this.makeCallPromise(r,async()=>aw...
method renameSync (line 9) | renameSync(r,s){return this.makeCallSync(r,()=>this.makeCallSync(s,()=>t...
method copyFilePromise (line 9) | async copyFilePromise(r,s,a=0){let n=async(c,f,p,h)=>{if(a&Cd.constants....
method copyFileSync (line 9) | copyFileSync(r,s,a=0){let n=(c,f,p,h)=>{if(a&Cd.constants.COPYFILE_FICLO...
method appendFilePromise (line 9) | async appendFilePromise(r,s,a){return await this.makeCallPromise(r,async...
method appendFileSync (line 9) | appendFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.appendF...
method writeFilePromise (line 9) | async writeFilePromise(r,s,a){return await this.makeCallPromise(r,async(...
method writeFileSync (line 9) | writeFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.writeFil...
method unlinkPromise (line 9) | async unlinkPromise(r){return await this.makeCallPromise(r,async()=>awai...
method unlinkSync (line 9) | unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(...
method utimesPromise (line 9) | async utimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>...
method utimesSync (line 9) | utimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(...
method lutimesPromise (line 9) | async lutimesPromise(r,s,a){return await this.makeCallPromise(r,async()=...
method lutimesSync (line 9) | lutimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSyn...
method mkdirPromise (line 9) | async mkdirPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
method mkdirSync (line 9) | mkdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,s)...
method rmdirPromise (line 9) | async rmdirPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
method rmdirSync (line 9) | rmdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,s)...
method rmPromise (line 9) | async rmPromise(r,s){return await this.makeCallPromise(r,async()=>await ...
method rmSync (line 9) | rmSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,s),(a,{s...
method linkPromise (line 9) | async linkPromise(r,s){return await this.makeCallPromise(s,async()=>awai...
method linkSync (line 9) | linkSync(r,s){return this.makeCallSync(s,()=>this.baseFs.linkSync(r,s),(...
method symlinkPromise (line 9) | async symlinkPromise(r,s,a){return await this.makeCallPromise(s,async()=...
method symlinkSync (line 9) | symlinkSync(r,s,a){return this.makeCallSync(s,()=>this.baseFs.symlinkSyn...
method readFilePromise (line 9) | async readFilePromise(r,s){return this.makeCallPromise(r,async()=>await ...
method readFileSync (line 9) | readFileSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readFileSyn...
method readdirPromise (line 9) | async readdirPromise(r,s){return await this.makeCallPromise(r,async()=>a...
method readdirSync (line 9) | readdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readdirSync(...
method readlinkPromise (line 9) | async readlinkPromise(r){return await this.makeCallPromise(r,async()=>aw...
method readlinkSync (line 9) | readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(...
method truncatePromise (line 9) | async truncatePromise(r,s){return await this.makeCallPromise(r,async()=>...
method truncateSync (line 9) | truncateSync(r,s){return this.makeCallSync(r,()=>this.baseFs.truncateSyn...
method ftruncatePromise (line 9) | async ftruncatePromise(r,s){if((r&rl)!==this.magic)return this.baseFs.ft...
method ftruncateSync (line 9) | ftruncateSync(r,s){if((r&rl)!==this.magic)return this.baseFs.ftruncateSy...
method watch (line 9) | watch(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,s,a),(n,...
method watchFile (line 9) | watchFile(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,...
method unwatchFile (line 9) | unwatchFile(r,s){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(...
method makeCallPromise (line 9) | async makeCallPromise(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="stri...
method makeCallSync (line 9) | makeCallSync(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")retur...
method findMount (line 9) | findMount(r){if(this.filter&&!this.filter.test(r))return null;let s="";f...
method limitOpenFiles (line 9) | limitOpenFiles(r){if(this.mountInstances===null)return;let s=Date.now(),...
method getMountPromise (line 9) | async getMountPromise(r,s){if(this.mountInstances){let a=this.mountInsta...
method getMountSync (line 9) | getMountSync(r,s){if(this.mountInstances){let a=this.mountInstances.get(...
method constructor (line 9) | constructor(){super(K)}
method getExtractHint (line 9) | getExtractHint(){throw er()}
method getRealPath (line 9) | getRealPath(){throw er()}
method resolve (line 9) | resolve(){throw er()}
method openPromise (line 9) | async openPromise(){throw er()}
method openSync (line 9) | openSync(){throw er()}
method opendirPromise (line 9) | async opendirPromise(){throw er()}
method opendirSync (line 9) | opendirSync(){throw er()}
method readPromise (line 9) | async readPromise(){throw er()}
method readSync (line 9) | readSync(){throw er()}
method writePromise (line 9) | async writePromise(){throw er()}
method writeSync (line 9) | writeSync(){throw er()}
method closePromise (line 9) | async closePromise(){throw er()}
method closeSync (line 9) | closeSync(){throw er()}
method createWriteStream (line 9) | createWriteStream(){throw er()}
method createReadStream (line 9) | createReadStream(){throw er()}
method realpathPromise (line 9) | async realpathPromise(){throw er()}
method realpathSync (line 9) | realpathSync(){throw er()}
method readdirPromise (line 9) | async readdirPromise(){throw er()}
method readdirSync (line 9) | readdirSync(){throw er()}
method existsPromise (line 9) | async existsPromise(e){throw er()}
method existsSync (line 9) | existsSync(e){throw er()}
method accessPromise (line 9) | async accessPromise(){throw er()}
method accessSync (line 9) | accessSync(){throw er()}
method statPromise (line 9) | async statPromise(){throw er()}
method statSync (line 9) | statSync(){throw er()}
method fstatPromise (line 9) | async fstatPromise(e){throw er()}
method fstatSync (line 9) | fstatSync(e){throw er()}
method lstatPromise (line 9) | async lstatPromise(e){throw er()}
method lstatSync (line 9) | lstatSync(e){throw er()}
method fchmodPromise (line 9) | async fchmodPromise(){throw er()}
method fchmodSync (line 9) | fchmodSync(){throw er()}
method chmodPromise (line 9) | async chmodPromise(){throw er()}
method chmodSync (line 9) | chmodSync(){throw er()}
method fchownPromise (line 9) | async fchownPromise(){throw er()}
method fchownSync (line 9) | fchownSync(){throw er()}
method chownPromise (line 9) | async chownPromise(){throw er()}
method chownSync (line 9) | chownSync(){throw er()}
method mkdirPromise (line 9) | async mkdirPromise(){throw er()}
method mkdirSync (line 9) | mkdirSync(){throw er()}
method rmdirPromise (line 9) | async rmdirPromise(){throw er()}
method rmdirSync (line 9) | rmdirSync(){throw er()}
method rmPromise (line 9) | async rmPromise(){throw er()}
method rmSync (line 9) | rmSync(){throw er()}
method linkPromise (line 9) | async linkPromise(){throw er()}
method linkSync (line 9) | linkSync(){throw er()}
method symlinkPromise (line 9) | async symlinkPromise(){throw er()}
method symlinkSync (line 9) | symlinkSync(){throw er()}
method renamePromise (line 9) | async renamePromise(){throw er()}
method renameSync (line 9) | renameSync(){throw er()}
method copyFilePromise (line 9) | async copyFilePromise(){throw er()}
method copyFileSync (line 9) | copyFileSync(){throw er()}
method appendFilePromise (line 9) | async appendFilePromise(){throw er()}
method appendFileSync (line 9) | appendFileSync(){throw er()}
method writeFilePromise (line 9) | async writeFilePromise(){throw er()}
method writeFileSync (line 9) | writeFileSync(){throw er()}
method unlinkPromise (line 9) | async unlinkPromise(){throw er()}
method unlinkSync (line 9) | unlinkSync(){throw er()}
method utimesPromise (line 9) | async utimesPromise(){throw er()}
method utimesSync (line 9) | utimesSync(){throw er()}
method lutimesPromise (line 9) | async lutimesPromise(){throw er()}
method lutimesSync (line 9) | lutimesSync(){throw er()}
method readFilePromise (line 9) | async readFilePromise(){throw er()}
method readFileSync (line 9) | readFileSync(){throw er()}
method readlinkPromise (line 9) | async readlinkPromise(){throw er()}
method readlinkSync (line 9) | readlinkSync(){throw er()}
method truncatePromise (line 9) | async truncatePromise(){throw er()}
method truncateSync (line 9) | truncateSync(){throw er()}
method ftruncatePromise (line 9) | async ftruncatePromise(e,r){throw er()}
method ftruncateSync (line 9) | ftruncateSync(e,r){throw er()}
method watch (line 9) | watch(){throw er()}
method watchFile (line 9) | watchFile(){throw er()}
method unwatchFile (line 9) | unwatchFile(){throw er()}
method constructor (line 9) | constructor(e){super(ue),this.baseFs=e}
method mapFromBase (line 9) | mapFromBase(e){return ue.fromPortablePath(e)}
method mapToBase (line 9) | mapToBase(e){return ue.toPortablePath(e)}
method makeVirtualPath (line 9) | static makeVirtualPath(e,r,s){if(K.basename(e)!=="__virtual__")throw new...
method resolveVirtual (line 9) | static resolveVirtual(e){let r=e.match(k_);if(!r||!r[3]&&r[5])return e;l...
method constructor (line 9) | constructor({baseFs:e=new Yn}={}){super(K),this.baseFs=e}
method getExtractHint (line 9) | getExtractHint(e){return this.baseFs.getExtractHint(e)}
method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
method realpathSync (line 9) | realpathSync(e){let r=e.match(k_);if(!r)return this.baseFs.realpathSync(...
method realpathPromise (line 9) | async realpathPromise(e){let r=e.match(k_);if(!r)return await this.baseF...
method mapToBase (line 9) | mapToBase(e){if(e==="")return e;if(this.pathUtils.isAbsolute(e))return t...
method mapFromBase (line 9) | mapFromBase(e){return e}
function E7e (line 9) | function E7e(t,e){return typeof Q_.default.isUtf8<"u"?Q_.default.isUtf8(...
method constructor (line 9) | constructor(e){super(ue),this.baseFs=e}
method mapFromBase (line 9) | mapFromBase(e){return e}
method mapToBase (line 9) | mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0...
method constructor (line 9) | constructor(e,r){this[Y$]=1;this[W$]=void 0;this[G$]=void 0;this[q$]=voi...
method fd (line 9) | get fd(){return this[Cp]}
method appendFile (line 9) | async appendFile(e,r){try{this[Nu](this.appendFile);let s=(typeof r=="st...
method chown (line 9) | async chown(e,r){try{return this[Nu](this.chown),await this[Ho].fchownPr...
method chmod (line 9) | async chmod(e){try{return this[Nu](this.chmod),await this[Ho].fchmodProm...
method createReadStream (line 9) | createReadStream(e){return this[Ho].createReadStream(null,{...e,fd:this....
method createWriteStream (line 9) | createWriteStream(e){return this[Ho].createWriteStream(null,{...e,fd:thi...
method datasync (line 9) | datasync(){throw new Error("Method not implemented.")}
method sync (line 9) | sync(){throw new Error("Method not implemented.")}
method read (line 9) | async read(e,r,s,a){try{this[Nu](this.read);let n;return Buffer.isBuffer...
method readFile (line 9) | async readFile(e){try{this[Nu](this.readFile);let r=(typeof e=="string"?...
method readLines (line 9) | readLines(e){return(0,V$.createInterface)({input:this.createReadStream(e...
method stat (line 9) | async stat(e){try{return this[Nu](this.stat),await this[Ho].fstatPromise...
method truncate (line 9) | async truncate(e){try{return this[Nu](this.truncate),await this[Ho].ftru...
method utimes (line 9) | utimes(e,r){throw new Error("Method not implemented.")}
method writeFile (line 9) | async writeFile(e,r){try{this[Nu](this.writeFile);let s=(typeof r=="stri...
method write (line 9) | async write(...e){try{if(this[Nu](this.write),ArrayBuffer.isView(e[0])){...
method writev (line 9) | async writev(e,r){try{this[Nu](this.writev);let s=0;if(typeof r<"u")for(...
method readv (line 9) | readv(e,r){throw new Error("Method not implemented.")}
method close (line 9) | close(){if(this[Cp]===-1)return Promise.resolve();if(this[i0])return thi...
method [(Ho,Cp,Y$=sE,W$=i0,G$=px,q$=hx,Nu)] (line 9) | [(Ho,Cp,Y$=sE,W$=i0,G$=px,q$=hx,Nu)](e){if(this[Cp]===-1){let r=new Erro...
method [Ou] (line 9) | [Ou](){if(this[sE]--,this[sE]===0){let e=this[Cp];this[Cp]=-1,this[Ho].c...
function _2 (line 9) | function _2(t,e){e=new Ax(e);let r=(s,a,n)=>{let c=s[a];s[a]=n,typeof c?...
function gx (line 9) | function gx(t,e){let r=Object.create(t);return _2(r,e),r}
function Z$ (line 9) | function Z$(t){let e=Math.ceil(Math.random()*4294967296).toString(16).pa...
function X$ (line 9) | function X$(){if(T_)return T_;let t=ue.toPortablePath($$.default.tmpdir(...
method detachTemp (line 9) | detachTemp(t){Lu.delete(t)}
method mktempSync (line 9) | mktempSync(t){let{tmpdir:e,realTmpdir:r}=X$();for(;;){let s=Z$("xfs-");t...
method mktempPromise (line 9) | async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=X$();for(;;){let s=Z$(...
method rmtempPromise (line 9) | async rmtempPromise(){await Promise.all(Array.from(Lu.values()).map(asyn...
method rmtempSync (line 9) | rmtempSync(){for(let t of Lu)try{le.removeSync(t),Lu.delete(t)}catch{}}
function C7e (line 9) | function C7e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT...
function ree (line 9) | function ree(t,e,r){return!t.isSymbolicLink()&&!t.isFile()?!1:C7e(e,r)}
function nee (line 9) | function nee(t,e,r){tee.stat(t,function(s,a){r(s,s?!1:ree(a,t,e))})}
function w7e (line 9) | function w7e(t,e){return ree(tee.statSync(t),t,e)}
function aee (line 9) | function aee(t,e,r){oee.stat(t,function(s,a){r(s,s?!1:lee(a,e))})}
function B7e (line 9) | function B7e(t,e){return lee(oee.statSync(t),e)}
function lee (line 9) | function lee(t,e){return t.isFile()&&v7e(t,e)}
function v7e (line 9) | function v7e(t,e){var r=t.mode,s=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:pr...
function R_ (line 9) | function R_(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Pro...
function S7e (line 9) | function S7e(t,e){try{return dx.sync(t,e||{})}catch(r){if(e&&e.ignoreErr...
function Bee (line 9) | function Bee(t,e){let r=t.options.env||process.env,s=process.cwd(),a=t.o...
function k7e (line 9) | function k7e(t){return Bee(t)||Bee(t,!0)}
function Q7e (line 9) | function Q7e(t){return t=t.replace(N_,"^$1"),t}
function T7e (line 9) | function T7e(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"...
function N7e (line 9) | function N7e(t){let r=Buffer.alloc(150),s;try{s=L_.openSync(t,"r"),L_.re...
function H7e (line 9) | function H7e(t){t.file=Ree(t);let e=t.file&&L7e(t.file);return e?(t.args...
function j7e (line 9) | function j7e(t){if(!M7e)return t;let e=H7e(t),r=!_7e.test(e);if(t.option...
function q7e (line 9) | function q7e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[]...
function __ (line 9) | function __(t,e){return Object.assign(new Error(`${e} ${t.command} ENOEN...
function G7e (line 9) | function G7e(t,e){if(!M_)return;let r=t.emit;t.emit=function(s,a){if(s==...
function Lee (line 9) | function Lee(t,e){return M_&&t===1&&!e.file?__(e.original,"spawn"):null}
function W7e (line 9) | function W7e(t,e){return M_&&t===1&&!e.file?__(e.original,"spawnSync"):n...
function Hee (line 9) | function Hee(t,e,r){let s=U_(t,e,r),a=Uee.spawn(s.command,s.args,s.optio...
function Y7e (line 9) | function Y7e(t,e,r){let s=U_(t,e,r),a=Uee.spawnSync(s.command,s.args,s.o...
function V7e (line 9) | function V7e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
function wd (line 9) | function wd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.lo...
function s (line 9) | function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}
function a (line 9) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
function n (line 9) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
function c (line 9) | function c(h){return r[h.type](h)}
function f (line 9) | function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=...
function p (line 9) | function p(h){return h?'"'+a(h)+'"':"end of input"}
function K7e (line 9) | function K7e(t,e){e=e!==void 0?e:{};var r={},s={Start:Ya},a=Ya,n=functio...
function yx (line 12) | function yx(t,e={isGlobPattern:()=>!1}){try{return(0,Gee.parse)(t,e)}cat...
function cE (line 12) | function cE(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:s},a...
function Ex (line 12) | function Ex(t){return`${uE(t.chain)}${t.then?` ${q_(t.then)}`:""}`}
function q_ (line 12) | function q_(t){return`${t.type} ${Ex(t.line)}`}
function uE (line 12) | function uE(t){return`${W_(t)}${t.then?` ${G_(t.then)}`:""}`}
function G_ (line 12) | function G_(t){return`${t.type} ${uE(t.chain)}`}
function W_ (line 12) | function W_(t){switch(t.type){case"command":return`${t.envs.length>0?`${...
function mx (line 12) | function mx(t){return`${t.name}=${t.args[0]?Bd(t.args[0]):""}`}
function Y_ (line 12) | function Y_(t){switch(t.type){case"redirection":return H2(t);case"argume...
function H2 (line 12) | function H2(t){return`${t.subtype} ${t.args.map(e=>Bd(e)).join(" ")}`}
function Bd (line 12) | function Bd(t){return t.segments.map(e=>V_(e)).join("")}
function V_ (line 12) | function V_(t){let e=(s,a)=>a?`"${s}"`:s,r=s=>s===""?"''":s.match(/[()}<...
function Ix (line 12) | function Ix(t){let e=a=>{switch(a){case"addition":return"+";case"subtrac...
function Z7e (line 13) | function Z7e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
function vd (line 13) | function vd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.lo...
function s (line 13) | function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}
function a (line 13) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
function n (line 13) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
function c (line 13) | function c(h){return r[h.type](h)}
function f (line 13) | function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=...
function p (line 13) | function p(h){return h?'"'+a(h)+'"':"end of input"}
function X7e (line 13) | function X7e(t,e){e=e!==void 0?e:{};var r={},s={resolution:Ne},a=Ne,n="/...
function Cx (line 13) | function Cx(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The...
function wx (line 13) | function wx(t){let e="";return t.from&&(e+=t.from.fullName,t.from.descri...
function Xee (line 13) | function Xee(t){return typeof t>"u"||t===null}
function $7e (line 13) | function $7e(t){return typeof t=="object"&&t!==null}
function eKe (line 13) | function eKe(t){return Array.isArray(t)?t:Xee(t)?[]:[t]}
function tKe (line 13) | function tKe(t,e){var r,s,a,n;if(e)for(n=Object.keys(e),r=0,s=n.length;r...
function rKe (line 13) | function rKe(t,e){var r="",s;for(s=0;s<e;s+=1)r+=t;return r}
function nKe (line 13) | function nKe(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}
function j2 (line 13) | function j2(t,e){Error.call(this),this.name="YAMLException",this.reason=...
function K_ (line 13) | function K_(t,e,r,s,a){this.name=t,this.buffer=e,this.position=r,this.li...
function oKe (line 17) | function oKe(t){var e={};return t!==null&&Object.keys(t).forEach(functio...
function aKe (line 17) | function aKe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(iKe.i...
function J_ (line 17) | function J_(t,e,r){var s=[];return t.include.forEach(function(a){r=J_(a,...
function cKe (line 17) | function cKe(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;...
function AE (line 17) | function AE(t){this.include=t.include||[],this.implicit=t.implicit||[],t...
function gKe (line 17) | function gKe(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~...
function dKe (line 17) | function dKe(){return null}
function mKe (line 17) | function mKe(t){return t===null}
function EKe (line 17) | function EKe(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="...
function IKe (line 17) | function IKe(t){return t==="true"||t==="True"||t==="TRUE"}
function CKe (line 17) | function CKe(t){return Object.prototype.toString.call(t)==="[object Bool...
function vKe (line 17) | function vKe(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}
function SKe (line 17) | function SKe(t){return 48<=t&&t<=55}
function DKe (line 17) | function DKe(t){return 48<=t&&t<=57}
function bKe (line 17) | function bKe(t){if(t===null)return!1;var e=t.length,r=0,s=!1,a;if(!e)ret...
function PKe (line 17) | function PKe(t){var e=t,r=1,s,a,n=[];return e.indexOf("_")!==-1&&(e=e.re...
function xKe (line 17) | function xKe(t){return Object.prototype.toString.call(t)==="[object Numb...
function TKe (line 17) | function TKe(t){return!(t===null||!QKe.test(t)||t[t.length-1]==="_")}
function RKe (line 17) | function RKe(t){var e,r,s,a;return e=t.replace(/_/g,"").toLowerCase(),r=...
function NKe (line 17) | function NKe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".na...
function OKe (line 17) | function OKe(t){return Object.prototype.toString.call(t)==="[object Numb...
function UKe (line 17) | function UKe(t){return t===null?!1:Ste.exec(t)!==null||Dte.exec(t)!==null}
function HKe (line 17) | function HKe(t){var e,r,s,a,n,c,f,p=0,h=null,E,C,S;if(e=Ste.exec(t),e===...
function jKe (line 17) | function jKe(t){return t.toISOString()}
function GKe (line 17) | function GKe(t){return t==="<<"||t===null}
function YKe (line 18) | function YKe(t){if(t===null)return!1;var e,r,s=0,a=t.length,n=X_;for(r=0...
function VKe (line 18) | function VKe(t){var e,r,s=t.replace(/[\r\n=]/g,""),a=s.length,n=X_,c=0,f...
function KKe (line 18) | function KKe(t){var e="",r=0,s,a,n=t.length,c=X_;for(s=0;s<n;s++)s%3===0...
function JKe (line 18) | function JKe(t){return Pd&&Pd.isBuffer(t)}
function $Ke (line 18) | function $Ke(t){if(t===null)return!0;var e=[],r,s,a,n,c,f=t;for(r=0,s=f....
function eJe (line 18) | function eJe(t){return t!==null?t:[]}
function nJe (line 18) | function nJe(t){if(t===null)return!0;var e,r,s,a,n,c=t;for(n=new Array(c...
function iJe (line 18) | function iJe(t){if(t===null)return[];var e,r,s,a,n,c=t;for(n=new Array(c...
function aJe (line 18) | function aJe(t){if(t===null)return!0;var e,r=t;for(e in r)if(oJe.call(r,...
function lJe (line 18) | function lJe(t){return t!==null?t:{}}
function fJe (line 18) | function fJe(){return!0}
function AJe (line 18) | function AJe(){}
function pJe (line 18) | function pJe(){return""}
function hJe (line 18) | function hJe(t){return typeof t>"u"}
function dJe (line 18) | function dJe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)...
function mJe (line 18) | function mJe(t){var e=t,r=/\/([gim]*)$/.exec(t),s="";return e[0]==="/"&&...
function yJe (line 18) | function yJe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multi...
function EJe (line 18) | function EJe(t){return Object.prototype.toString.call(t)==="[object RegE...
function CJe (line 18) | function CJe(t){if(t===null)return!1;try{var e="("+t+")",r=Sx.parse(e,{r...
function wJe (line 18) | function wJe(t){var e="("+t+")",r=Sx.parse(e,{range:!0}),s=[],a;if(r.typ...
function BJe (line 18) | function BJe(t){return t.toString()}
function vJe (line 18) | function vJe(t){return Object.prototype.toString.call(t)==="[object Func...
function Zte (line 18) | function Zte(t){return Object.prototype.toString.call(t)}
function qf (line 18) | function qf(t){return t===10||t===13}
function kd (line 18) | function kd(t){return t===9||t===32}
function nl (line 18) | function nl(t){return t===9||t===32||t===10||t===13}
function hE (line 18) | function hE(t){return t===44||t===91||t===93||t===123||t===125}
function QJe (line 18) | function QJe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-9...
function TJe (line 18) | function TJe(t){return t===120?2:t===117?4:t===85?8:0}
function RJe (line 18) | function RJe(t){return 48<=t&&t<=57?t-48:-1}
function Xte (line 18) | function Xte(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t=...
function FJe (line 19) | function FJe(t){return t<=65535?String.fromCharCode(t):String.fromCharCo...
function NJe (line 19) | function NJe(t,e){this.input=t,this.filename=e.filename||null,this.schem...
function ure (line 19) | function ure(t,e){return new rre(e,new SJe(t.filename,t.input,t.position...
function Rr (line 19) | function Rr(t,e){throw ure(t,e)}
function Px (line 19) | function Px(t,e){t.onWarning&&t.onWarning.call(null,ure(t,e))}
function s0 (line 19) | function s0(t,e,r,s){var a,n,c,f;if(e<r){if(f=t.input.slice(e,r),s)for(a...
function ere (line 19) | function ere(t,e,r,s){var a,n,c,f;for(wp.isObject(r)||Rr(t,"cannot merge...
function gE (line 19) | function gE(t,e,r,s,a,n,c,f){var p,h;if(Array.isArray(a))for(a=Array.pro...
function eU (line 19) | function eU(t){var e;e=t.input.charCodeAt(t.position),e===10?t.position+...
function ls (line 19) | function ls(t,e,r){for(var s=0,a=t.input.charCodeAt(t.position);a!==0;){...
function xx (line 19) | function xx(t){var e=t.position,r;return r=t.input.charCodeAt(e),!!((r==...
function tU (line 19) | function tU(t,e){e===1?t.result+=" ":e>1&&(t.result+=wp.repeat(`
function OJe (line 20) | function OJe(t,e,r){var s,a,n,c,f,p,h,E,C=t.kind,S=t.result,P;if(P=t.inp...
function LJe (line 20) | function LJe(t,e){var r,s,a;if(r=t.input.charCodeAt(t.position),r!==39)r...
function MJe (line 20) | function MJe(t,e){var r,s,a,n,c,f;if(f=t.input.charCodeAt(t.position),f!...
function _Je (line 20) | function _Je(t,e){var r=!0,s,a=t.tag,n,c=t.anchor,f,p,h,E,C,S={},P,I,R,N...
function UJe (line 20) | function UJe(t,e){var r,s,a=$_,n=!1,c=!1,f=e,p=0,h=!1,E,C;if(C=t.input.c...
function tre (line 26) | function tre(t,e){var r,s=t.tag,a=t.anchor,n=[],c,f=!1,p;for(t.anchor!==...
function HJe (line 26) | function HJe(t,e,r){var s,a,n,c,f=t.tag,p=t.anchor,h={},E={},C=null,S=nu...
function jJe (line 26) | function jJe(t){var e,r=!1,s=!1,a,n,c;if(c=t.input.charCodeAt(t.position...
function qJe (line 26) | function qJe(t){var e,r;if(r=t.input.charCodeAt(t.position),r!==38)retur...
function GJe (line 26) | function GJe(t){var e,r,s;if(s=t.input.charCodeAt(t.position),s!==42)ret...
function dE (line 26) | function dE(t,e,r,s,a){var n,c,f,p=1,h=!1,E=!1,C,S,P,I,R;if(t.listener!=...
function WJe (line 26) | function WJe(t){var e=t.position,r,s,a,n=!1,c;for(t.version=null,t.check...
function fre (line 26) | function fre(t,e){t=String(t),e=e||{},t.length!==0&&(t.charCodeAt(t.leng...
function Are (line 27) | function Are(t,e,r){e!==null&&typeof e=="object"&&typeof r>"u"&&(r=e,e=n...
function pre (line 27) | function pre(t,e){var r=fre(t,e);if(r.length!==0){if(r.length===1)return...
function YJe (line 27) | function YJe(t,e,r){return typeof e=="object"&&e!==null&&typeof r>"u"&&(...
function VJe (line 27) | function VJe(t,e){return pre(t,wp.extend({schema:nre},e))}
function pze (line 27) | function pze(t,e){var r,s,a,n,c,f,p;if(e===null)return{};for(r={},s=Obje...
function gre (line 27) | function gre(t){var e,r,s;if(e=t.toString(16).toUpperCase(),t<=255)r="x"...
function hze (line 27) | function hze(t){this.schema=t.schema||KJe,this.indent=Math.max(1,t.inden...
function dre (line 27) | function dre(t,e){for(var r=Y2.repeat(" ",e),s=0,a=-1,n="",c,f=t.length;...
function rU (line 29) | function rU(t,e){return`
function gze (line 30) | function gze(t,e){var r,s,a;for(r=0,s=t.implicitTypes.length;r<s;r+=1)if...
function iU (line 30) | function iU(t){return t===XJe||t===zJe}
function mE (line 30) | function mE(t){return 32<=t&&t<=126||161<=t&&t<=55295&&t!==8232&&t!==823...
function dze (line 30) | function dze(t){return mE(t)&&!iU(t)&&t!==65279&&t!==ZJe&&t!==W2}
function mre (line 30) | function mre(t,e){return mE(t)&&t!==65279&&t!==Sre&&t!==bre&&t!==Pre&&t!...
function mze (line 30) | function mze(t){return mE(t)&&t!==65279&&!iU(t)&&t!==sze&&t!==lze&&t!==D...
function Qre (line 30) | function Qre(t){var e=/^\n* /;return e.test(t)}
function yze (line 30) | function yze(t,e,r,s,a){var n,c,f,p=!1,h=!1,E=s!==-1,C=-1,S=mze(t.charCo...
function Eze (line 30) | function Eze(t,e,r,s){t.dump=function(){if(e.length===0)return"''";if(!t...
function yre (line 30) | function yre(t,e){var r=Qre(t)?String(e):"",s=t[t.length-1]===`
function Ere (line 34) | function Ere(t){return t[t.length-1]===`
function Ize (line 35) | function Ize(t,e){for(var r=/(\n+)([^\n]*)/g,s=function(){var h=t.indexOf(`
function Ire (line 38) | function Ire(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,s,a=...
function Cze (line 41) | function Cze(t){for(var e="",r,s,a,n=0;n<t.length;n++){if(r=t.charCodeAt...
function wze (line 41) | function wze(t,e,r){var s="",a=t.tag,n,c;for(n=0,c=r.length;n<c;n+=1)Qd(...
function Bze (line 41) | function Bze(t,e,r,s){var a="",n=t.tag,c,f;for(c=0,f=r.length;c<f;c+=1)Q...
function vze (line 41) | function vze(t,e,r){var s="",a=t.tag,n=Object.keys(r),c,f,p,h,E;for(c=0,...
function Sze (line 41) | function Sze(t,e,r,s){var a="",n=t.tag,c=Object.keys(r),f,p,h,E,C,S;if(t...
function Cre (line 41) | function Cre(t,e,r){var s,a,n,c,f,p;for(a=r?t.explicitTypes:t.implicitTy...
function Qd (line 41) | function Qd(t,e,r,s,a,n){t.tag=null,t.dump=r,Cre(t,r,!1)||Cre(t,r,!0);va...
function Dze (line 41) | function Dze(t,e){var r=[],s=[],a,n;for(nU(t,r,s),a=0,n=s.length;a<n;a+=...
function nU (line 41) | function nU(t,e,r){var s,a,n;if(t!==null&&typeof t=="object")if(a=e.inde...
function Ore (line 41) | function Ore(t,e){e=e||{};var r=new hze(e);return r.noRefs||Dze(t,r),Qd(...
function bze (line 42) | function bze(t,e){return Ore(t,Y2.extend({schema:JJe},e))}
function Tx (line 42) | function Tx(t){return function(){throw new Error("Function "+t+" is depr...
function xze (line 42) | function xze(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
function Td (line 42) | function Td(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.lo...
function s (line 42) | function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}
function a (line 42) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
function n (line 42) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
function c (line 42) | function c(h){return r[h.type](h)}
function f (line 42) | function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=...
function p (line 42) | function p(h){return h?'"'+a(h)+'"':"end of input"}
function kze (line 42) | function kze(t,e){e=e!==void 0?e:{};var r={},s={Start:cc},a=cc,n=functio...
function Wre (line 51) | function Wre(t){return t.match(Qze)?t:JSON.stringify(t)}
function Vre (line 51) | function Vre(t){return typeof t>"u"?!0:typeof t=="object"&&t!==null&&!Ar...
function oU (line 51) | function oU(t,e,r){if(t===null)return`null
function il (line 61) | function il(t){try{let e=oU(t,0,!1);return e!==`
function Tze (line 62) | function Tze(t){return t.endsWith(`
function Fze (line 64) | function Fze(t){if(Rze.test(t))return Tze(t);let e=(0,Fx.safeLoad)(t,{sc...
function cs (line 64) | function cs(t){return Fze(t)}
method constructor (line 64) | constructor(e){this.data=e}
function Xre (line 64) | function Xre(t){return typeof t=="string"?!!Ps[t]:"env"in t?Ps[t.env]&&P...
method constructor (line 64) | constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageEr...
method constructor (line 64) | constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanio...
method constructor (line 75) | constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type...
function Lze (line 80) | function Lze(t){let e=t.split(`
function qo (line 82) | function qo(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,`
function Ea (line 90) | function Ea(t){return{...t,[J2]:!0}}
function Gf (line 90) | function Gf(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&...
function _x (line 90) | function _x(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(...
function z2 (line 90) | function z2(t,e){return e.length===1?new nt(`${t}${_x(e[0],{mergeName:!0...
function Nd (line 92) | function Nd(t,e,r){if(typeof r>"u")return e;let s=[],a=[],n=f=>{let p=e;...
function ti (line 92) | function ti(t){return t===null?"null":t===void 0?"undefined":t===""?"an ...
function EE (line 92) | function EE(t,e){if(t.length===0)return"nothing";if(t.length===1)return ...
function a0 (line 92) | function a0(t,e){var r,s,a;return typeof e=="number"?`${(r=t?.p)!==null&...
function hU (line 92) | function hU(t,e,r){return t===1?e:r}
function mr (line 92) | function mr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}
function qze (line 92) | function qze(t,e){return r=>{t[e]=r}}
function Yf (line 92) | function Yf(t,e){return r=>{let s=t[e];return t[e]=r,Yf(t,e).bind(null,s)}}
function Z2 (line 92) | function Z2(t,e,r){let s=()=>(t(r()),a),a=()=>(t(e),s);return s}
function gU (line 92) | function gU(){return Wr({test:(t,e)=>!0})}
function ine (line 92) | function ine(t){return Wr({test:(e,r)=>e!==t?mr(r,`Expected ${ti(t)} (go...
function IE (line 92) | function IE(){return Wr({test:(t,e)=>typeof t!="string"?mr(e,`Expected a...
function po (line 92) | function po(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>ty...
function Wze (line 92) | function Wze(){return Wr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(...
function dU (line 92) | function dU(){return Wr({test:(t,e)=>{var r;if(typeof t!="number"){if(ty...
function Yze (line 92) | function Yze(t){return Wr({test:(e,r)=>{var s;if(typeof r?.coercions>"u"...
function Vze (line 92) | function Vze(){return Wr({test:(t,e)=>{var r;if(!(t instanceof Date)){if...
function Ux (line 92) | function Ux(t,{delimiter:e}={}){return Wr({test:(r,s)=>{var a;let n=r;if...
function Kze (line 92) | function Kze(t,{delimiter:e}={}){let r=Ux(t,{delimiter:e});return Wr({te...
function Jze (line 92) | function Jze(t,e){let r=Ux(Hx([t,e])),s=jx(e,{keys:t});return Wr({test:(...
function Hx (line 92) | function Hx(t,{delimiter:e}={}){let r=ane(t.length);return Wr({test:(s,a...
function jx (line 92) | function jx(t,{keys:e=null}={}){let r=Ux(Hx([e??IE(),t]));return Wr({tes...
function zze (line 92) | function zze(t,e={}){return jx(t,e)}
function sne (line 92) | function sne(t,{extra:e=null}={}){let r=Object.keys(t),s=Wr({test:(a,n)=...
function Zze (line 92) | function Zze(t){return sne(t,{extra:jx(gU())})}
function one (line 92) | function one(t){return()=>t}
function Wr (line 92) | function Wr({test:t}){return one(t)()}
function $ze (line 92) | function $ze(t,e){if(!e(t))throw new l0}
function eZe (line 92) | function eZe(t,e){let r=[];if(!e(t,{errors:r}))throw new l0({errors:r})}
function tZe (line 92) | function tZe(t,e){}
function rZe (line 92) | function rZe(t,e,{coerce:r=!1,errors:s,throw:a}={}){let n=s?[]:void 0;if...
function nZe (line 92) | function nZe(t,e){let r=Hx(t);return(...s)=>{if(!r(s))throw new l0;retur...
function iZe (line 92) | function iZe(t){return Wr({test:(e,r)=>e.length>=t?!0:mr(r,`Expected to ...
function sZe (line 92) | function sZe(t){return Wr({test:(e,r)=>e.length<=t?!0:mr(r,`Expected to ...
function ane (line 92) | function ane(t){return Wr({test:(e,r)=>e.length!==t?mr(r,`Expected to ha...
function oZe (line 92) | function oZe({map:t}={}){return Wr({test:(e,r)=>{let s=new Set,a=new Set...
function aZe (line 92) | function aZe(){return Wr({test:(t,e)=>t<=0?!0:mr(e,`Expected to be negat...
function lZe (line 92) | function lZe(){return Wr({test:(t,e)=>t>=0?!0:mr(e,`Expected to be posit...
function yU (line 92) | function yU(t){return Wr({test:(e,r)=>e>=t?!0:mr(r,`Expected to be at le...
function cZe (line 92) | function cZe(t){return Wr({test:(e,r)=>e<=t?!0:mr(r,`Expected to be at m...
function uZe (line 92) | function uZe(t,e){return Wr({test:(r,s)=>r>=t&&r<=e?!0:mr(s,`Expected to...
function fZe (line 92) | function fZe(t,e){return Wr({test:(r,s)=>r>=t&&r<e?!0:mr(s,`Expected to ...
function EU (line 92) | function EU({unsafe:t=!1}={}){return Wr({test:(e,r)=>e!==Math.round(e)?m...
function X2 (line 92) | function X2(t){return Wr({test:(e,r)=>t.test(e)?!0:mr(r,`Expected to mat...
function AZe (line 92) | function AZe(){return Wr({test:(t,e)=>t!==t.toLowerCase()?mr(e,`Expected...
function pZe (line 92) | function pZe(){return Wr({test:(t,e)=>t!==t.toUpperCase()?mr(e,`Expected...
function hZe (line 92) | function hZe(){return Wr({test:(t,e)=>jze.test(t)?!0:mr(e,`Expected to b...
function gZe (line 92) | function gZe(){return Wr({test:(t,e)=>nne.test(t)?!0:mr(e,`Expected to b...
function dZe (line 92) | function dZe({alpha:t=!1}){return Wr({test:(e,r)=>(t?_ze.test(e):Uze.tes...
function mZe (line 92) | function mZe(){return Wr({test:(t,e)=>Hze.test(t)?!0:mr(e,`Expected to b...
function yZe (line 92) | function yZe(t=gU()){return Wr({test:(e,r)=>{let s;try{s=JSON.parse(e)}c...
function qx (line 92) | function qx(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Wr({test:(s,...
function $2 (line 92) | function $2(t,...e){let r=Array.isArray(e[0])?e[0]:e;return qx(t,r)}
function EZe (line 92) | function EZe(t){return Wr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}
function IZe (line 92) | function IZe(t){return Wr({test:(e,r)=>e===null?!0:t(e,r)})}
function CZe (line 92) | function CZe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r...
function IU (line 92) | function IU(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!...
function wZe (line 92) | function wZe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r...
function BZe (line 92) | function BZe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r...
function tB (line 92) | function tB(t,e,r,s){var a,n;let c=new Set((a=s?.ignore)!==null&&a!==voi...
method constructor (line 92) | constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=`
method constructor (line 94) | constructor(){this.help=!1}
method Usage (line 94) | static Usage(e){return e}
method catch (line 94) | async catch(e){throw e}
method validateAndExecute (line 94) | async validateAndExecute(){let r=this.constructor.schema;if(Array.isArra...
function sl (line 94) | function sl(t){uU&&console.log(t)}
function cne (line 94) | function cne(){let t={nodes:[]};for(let e=0;e<En.CustomNode;++e)t.nodes....
function SZe (line 94) | function SZe(t){let e=cne(),r=[],s=e.nodes.length;for(let a of t){r.push...
function Mu (line 94) | function Mu(t,e){return t.nodes.push(e),t.nodes.length-1}
function DZe (line 94) | function DZe(t){let e=new Set,r=s=>{if(e.has(s))return;e.add(s);let a=t....
function bZe (line 94) | function bZe(t,{prefix:e=""}={}){if(uU){sl(`${e}Nodes are:`);for(let r=0...
function PZe (line 94) | function PZe(t,e,r=!1){sl(`Running a vm on ${JSON.stringify(e)}`);let s=...
function xZe (line 94) | function xZe(t,e,{endToken:r=ei.EndOfInput}={}){let s=PZe(t,[...e,r]);re...
function kZe (line 94) | function kZe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path....
function QZe (line 94) | function QZe(t,e){let r=e.filter(S=>S.selectedIndex!==null),s=r.filter(S...
function TZe (line 94) | function TZe(t){let e=[],r=[];for(let s of t)s.selectedIndex===Fd?r.push...
function une (line 94) | function une(t,e,...r){return e===void 0?Array.from(t):une(t.filter((s,a...
function Hl (line 94) | function Hl(){return{dynamics:[],shortcuts:[],statics:{}}}
function fne (line 94) | function fne(t){return t===En.SuccessNode||t===En.ErrorNode}
function CU (line 94) | function CU(t,e=0){return{to:fne(t.to)?t.to:t.to>=En.CustomNode?t.to+e-E...
function RZe (line 94) | function RZe(t,e=0){let r=Hl();for(let[s,a]of t.dynamics)r.dynamics.push...
function qs (line 94) | function qs(t,e,r,s,a){t.nodes[e].dynamics.push([r,{to:s,reducer:a}])}
function CE (line 94) | function CE(t,e,r,s){t.nodes[e].shortcuts.push({to:r,reducer:s})}
function Ca (line 94) | function Ca(t,e,r,s,a){(Object.prototype.hasOwnProperty.call(t.nodes[e]....
function Gx (line 94) | function Gx(t,e,r,s,a){if(Array.isArray(e)){let[n,...c]=e;return t[n](r,...
method constructor (line 94) | constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trai...
method addPath (line 94) | addPath(e){this.paths.push(e)}
method setArity (line 94) | setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,ex...
method addPositional (line 94) | addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra==...
method addRest (line 94) | addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===jl)throw n...
method addProxy (line 94) | addProxy({required:e=0}={}){this.addRest({required:e}),this.arity.proxy=!0}
method addOption (line 94) | addOption({names:e,description:r,arity:s=0,hidden:a=!1,required:n=!1,all...
method setContext (line 94) | setContext(e){this.context=e}
method usage (line 94) | usage({detailed:e=!0,inlineOptions:r=!0}={}){let s=[this.cliOpts.binaryN...
method compile (line 94) | compile(){if(typeof this.context>"u")throw new Error("Assertion failed: ...
method registerOptions (line 94) | registerOptions(e,r){qs(e,r,["isOption","--"],r,"inhibateOptions"),qs(e,...
method constructor (line 94) | constructor({binaryName:e="..."}={}){this.builders=[],this.opts={binaryN...
method build (line 94) | static build(e,r={}){return new t(r).commands(e).compile()}
method getBuilderByIndex (line 94) | getBuilderByIndex(e){if(!(e>=0&&e<this.builders.length))throw new Error(...
method commands (line 94) | commands(e){for(let r of e)r(this.command());return this}
method command (line 94) | command(){let e=new BU(this.builders.length,this.opts);return this.build...
method compile (line 94) | compile(){let e=[],r=[];for(let a of this.builders){let{machine:n,contex...
function pne (line 94) | function pne(){return Vx.default&&"getColorDepth"in Vx.default.WriteStre...
function hne (line 94) | function hne(t){let e=Ane;if(typeof e>"u"){if(t.stdout===process.stdout&...
method constructor (line 94) | constructor(e){super(),this.contexts=e,this.commands=[]}
method from (line 94) | static from(e,r){let s=new t(r);s.path=e.path;for(let a of e.options)swi...
method execute (line 94) | async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index...
function Ene (line 98) | async function Ene(...t){let{resolvedOptions:e,resolvedCommandClasses:r,...
function Ine (line 98) | async function Ine(...t){let{resolvedOptions:e,resolvedCommandClasses:r,...
function Cne (line 98) | function Cne(t){let e,r,s,a;switch(typeof process<"u"&&typeof process.ar...
function yne (line 98) | function yne(t){return t()}
method constructor (line 98) | constructor({binaryLabel:e,binaryName:r="...",binaryVersion:s,enableCapt...
method from (line 98) | static from(e,r={}){let s=new t(r),a=Array.isArray(e)?e:[e];for(let n of...
method register (line 98) | register(e){var r;let s=new Map,a=new e;for(let p in a){let h=a[p];typeo...
method process (line 98) | process(e,r){let{input:s,context:a,partial:n}=typeof e=="object"&&Array....
method run (line 98) | async run(e,r){var s,a;let n,c={...t.defaultContext,...r},f=(s=this.enab...
method runExit (line 98) | async runExit(e,r){process.exitCode=await this.run(e,r)}
method definition (line 98) | definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:s}=thi...
method definitions (line 98) | definitions({colored:e=!1}={}){let r=[];for(let s of this.registrations....
method usage (line 98) | usage(e=null,{colored:r,detailed:s=!1,prefix:a="$ "}={}){var n;if(e===nu...
method error (line 124) | error(e,r){var s,{colored:a,command:n=(s=e[mne])!==null&&s!==void 0?s:nu...
method format (line 127) | format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.d...
method getUsageByRegistration (line 127) | getUsageByRegistration(e,r){let s=this.registrations.get(e);if(typeof s>...
method getUsageByIndex (line 127) | getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}
method execute (line 127) | async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.def...
method execute (line 128) | async execute(){this.context.stdout.write(this.cli.usage())}
function Jx (line 128) | function Jx(t={}){return Ea({definition(e,r){var s;e.addProxy({name:(s=t...
method constructor (line 128) | constructor(){super(...arguments),this.args=Jx()}
method execute (line 128) | async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.pro...
method execute (line 129) | async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVer...
function Pne (line 130) | function Pne(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(","),f=...
function kne (line 130) | function kne(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(","),c=new Set(n);ret...
function Tne (line 130) | function Tne(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(","),c=new Set(n);ret...
function Fne (line 130) | function Fne(t={}){return Ea({definition(e,r){var s;e.addRest({name:(s=t...
function NZe (line 130) | function NZe(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(","),f=...
function OZe (line 130) | function OZe(t={}){let{required:e=!0}=t;return Ea({definition(r,s){var a...
function One (line 130) | function One(t,...e){return typeof t=="string"?NZe(t,...e):OZe(t)}
function jZe (line 130) | function jZe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,`
function qZe (line 132) | function qZe(t){let e=jne(t),r=Gs.configDotenv({path:e});if(!r.parsed)th...
function GZe (line 132) | function GZe(t){console.log(`[dotenv@${PU}][INFO] ${t}`)}
function WZe (line 132) | function WZe(t){console.log(`[dotenv@${PU}][WARN] ${t}`)}
function DU (line 132) | function DU(t){console.log(`[dotenv@${PU}][DEBUG] ${t}`)}
function Hne (line 132) | function Hne(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_K...
function YZe (line 132) | function YZe(t,e){let r;try{r=new URL(e)}catch(f){throw f.code==="ERR_IN...
function jne (line 132) | function jne(t){let e=bU.resolve(process.cwd(),".env");return t&&t.path&...
function VZe (line 132) | function VZe(t){return t[0]==="~"?bU.join(MZe.homedir(),t.slice(1)):t}
function KZe (line 132) | function KZe(t){GZe("Loading env from encrypted .env.vault");let e=Gs._p...
function JZe (line 132) | function JZe(t){let e=bU.resolve(process.cwd(),".env"),r="utf8",s=!!(t&&...
function zZe (line 132) | function zZe(t){let e=jne(t);return Hne(t).length===0?Gs.configDotenv(t)...
function ZZe (line 132) | function ZZe(t,e){let r=Buffer.from(e.slice(-64),"hex"),s=Buffer.from(t,...
function XZe (line 132) | function XZe(t,e,r={}){let s=!!(r&&r.debug),a=!!(r&&r.override);if(typeo...
function Vf (line 132) | function Vf(t){return`YN${t.toString(10).padStart(4,"0")}`}
function zx (line 132) | function zx(t){let e=Number(t.slice(2));if(typeof Dr[e]>"u")throw new Er...
method constructor (line 132) | constructor(e,r){if(r=yXe(r),e instanceof t){if(e.loose===!!r.loose&&e.i...
method format (line 132) | format(){return this.version=`${this.major}.${this.minor}.${this.patch}`...
method toString (line 132) | toString(){return this.version}
method compare (line 132) | compare(e){if($x("SemVer.compare",this.version,this.options,e),!(e insta...
method compareMain (line 132) | compareMain(e){return e instanceof t||(e=new t(e,this.options)),BE(this....
method comparePre (line 132) | comparePre(e){if(e instanceof t||(e=new t(e,this.options)),this.prerelea...
method compareBuild (line 132) | compareBuild(e){e instanceof t||(e=new t(e,this.options));let r=0;do{let...
method inc (line 132) | inc(e,r,s){switch(e){case"premajor":this.prerelease.length=0,this.patch=...
function Fn (line 132) | function Fn(t){var e=this;if(e instanceof Fn||(e=new Fn),e.tail=null,e.h...
function A$e (line 132) | function A$e(t,e,r){var s=e===t.head?new Md(r,null,e,t):new Md(r,e,e.nex...
function p$e (line 132) | function p$e(t,e){t.tail=new Md(e,t.tail,null,t),t.head||(t.head=t.tail)...
function h$e (line 132) | function h$e(t,e){t.head=new Md(e,null,t.head,t),t.tail||(t.tail=t.head)...
function Md (line 132) | function Md(t,e,r,s){if(!(this instanceof Md))return new Md(t,e,r,s);thi...
method constructor (line 132) | constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(type...
method max (line 132) | set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a...
method max (line 132) | get max(){return this[_d]}
method allowStale (line 132) | set allowStale(e){this[fB]=!!e}
method allowStale (line 132) | get allowStale(){return this[fB]}
method maxAge (line 132) | set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be ...
method maxAge (line 132) | get maxAge(){return this[Ud]}
method lengthCalculator (line 132) | set lengthCalculator(e){typeof e!="function"&&(e=LU),e!==this[vE]&&(this...
method lengthCalculator (line 132) | get lengthCalculator(){return this[vE]}
method length (line 132) | get length(){return this[bp]}
method itemCount (line 132) | get itemCount(){return this[Ws].length}
method rforEach (line 132) | rforEach(e,r){r=r||this;for(let s=this[Ws].tail;s!==null;){let a=s.prev;...
method forEach (line 132) | forEach(e,r){r=r||this;for(let s=this[Ws].head;s!==null;){let a=s.next;J...
method keys (line 132) | keys(){return this[Ws].toArray().map(e=>e.key)}
method values (line 132) | values(){return this[Ws].toArray().map(e=>e.value)}
method reset (line 132) | reset(){this[Dp]&&this[Ws]&&this[Ws].length&&this[Ws].forEach(e=>this[Dp...
method dump (line 132) | dump(){return this[Ws].map(e=>lk(this,e)?!1:{k:e.key,v:e.value,e:e.now+(...
method dumpLru (line 132) | dumpLru(){return this[Ws]}
method set (line 132) | set(e,r,s){if(s=s||this[Ud],s&&typeof s!="number")throw new TypeError("m...
method has (line 132) | has(e){if(!this[_u].has(e))return!1;let r=this[_u].get(e).value;return!l...
method get (line 132) | get(e){return MU(this,e,!0)}
method peek (line 132) | peek(e){return MU(this,e,!1)}
method pop (line 132) | pop(){let e=this[Ws].tail;return e?(SE(this,e),e.value):null}
method del (line 132) | del(e){SE(this,this[_u].get(e))}
method load (line 132) | load(e){this.reset();let r=Date.now();for(let s=e.length-1;s>=0;s--){let...
method prune (line 132) | prune(){this[_u].forEach((e,r)=>MU(this,r,!1))}
method constructor (line 132) | constructor(e,r,s,a,n){this.key=e,this.value=r,this.length=s,this.now=a,...
method constructor (line 132) | constructor(e,r){if(r=m$e(r),e instanceof t)return e.loose===!!r.loose&&...
method format (line 132) | format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||"...
method toString (line 132) | toString(){return this.range}
method parseRange (line 132) | parseRange(e){let s=((this.options.includePrerelease&&w$e)|(this.options...
method intersects (line 132) | intersects(e,r){if(!(e instanceof t))throw new TypeError("a Range is req...
method test (line 132) | test(e){if(!e)return!1;if(typeof e=="string")try{e=new y$e(e,this.option...
method ANY (line 132) | static get ANY(){return pB}
method constructor (line 132) | constructor(e,r){if(r=nse(r),e instanceof t){if(e.loose===!!r.loose)retu...
method parse (line 132) | parse(e){let r=this.options.loose?ise[sse.COMPARATORLOOSE]:ise[sse.COMPA...
method toString (line 132) | toString(){return this.value}
method test (line 132) | test(e){if(GU("Comparator.test",e,this.options.loose),this.semver===pB||...
method intersects (line 132) | intersects(e,r){if(!(e instanceof t))throw new TypeError("a Comparator i...
function $et (line 132) | function $et(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
function Hd (line 132) | function Hd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.lo...
function s (line 132) | function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}
function a (line 132) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
function n (line 132) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
function c (line 132) | function c(h){return r[h.type](h)}
function f (line 132) | function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=...
function p (line 132) | function p(h){return h?'"'+a(h)+'"':"end of input"}
function ett (line 132) | function ett(t,e){e=e!==void 0?e:{};var r={},s={Expression:y},a=y,n="|",...
function rtt (line 134) | function rtt(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}
function ntt (line 134) | function ntt(){let t={},e=Object.keys(fk);for(let r=e.length,s=0;s<r;s++...
function itt (line 134) | function itt(t){let e=ntt(),r=[t];for(e[t].distance=0;r.length;){let s=r...
function stt (line 134) | function stt(t,e){return function(r){return e(t(r))}}
function ott (line 134) | function ott(t,e){let r=[e[t].parent,t],s=fk[e[t].parent][t],a=
Copy disabled (too large)
Download .json
Condensed preview — 2057 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,494K chars).
[
{
"path": ".cargo/config.toml",
"chars": 2086,
"preview": "[env]\nLIBSQLITE3_FLAGS = \"-DSQLITE_ENABLE_MATH_FUNCTIONS\" # necessary for rusqlite dependency in order to bundle SQLite "
},
{
"path": ".claude/skills/async-io-model/SKILL.md",
"chars": 5830,
"preview": "---\nname: async-io-model\ndescription: Explanations of common asynchronous patterns used in tursodb. Involves IOResult, s"
},
{
"path": ".claude/skills/cdc/SKILL.md",
"chars": 17415,
"preview": "---\nname: cdc\ndescription: Change Data Capture - architecture, entrypoints, bytecode emission, sync engine integration, "
},
{
"path": ".claude/skills/code-quality/SKILL.md",
"chars": 2253,
"preview": "---\nname: code-quality\ndescription: General Correctness rules, Rust patterns, comments, avoiding over-engineering. When "
},
{
"path": ".claude/skills/debugging/SKILL.md",
"chars": 1894,
"preview": "---\nname: debugging\ndescription: How to debug tursodb using Bytecode comparison, logging, ThreadSanitizer, deterministic"
},
{
"path": ".claude/skills/differential-fuzzer/SKILL.md",
"chars": 4436,
"preview": "---\nname: differential-fuzzer\ndescription: Information about the differential fuzzer tool, how to run it and use it catc"
},
{
"path": ".claude/skills/index-knowledge/SKILL.md",
"chars": 10001,
"preview": "---\nname: index-knowledge\ndescription: Generate hierarchical AGENTS.md knowledge base for a codebase. Creates root + com"
},
{
"path": ".claude/skills/mvcc/SKILL.md",
"chars": 2707,
"preview": "---\nname: mvcc\ndescription: Overview of Experimental MVCC feature - snapshot isolation, versioning, limitations\n---\n# MV"
},
{
"path": ".claude/skills/pr-workflow/SKILL.md",
"chars": 1062,
"preview": "---\nname: pr-workflow\ndescription: General guidelines for Commits, formatting, CI, dependencies, security\n---\n# PR Workf"
},
{
"path": ".claude/skills/storage-format/SKILL.md",
"chars": 3568,
"preview": "---\nname: storage-format\ndescription: SQLite file format, B-trees, pages, cells, overflow, freelist that is used in turs"
},
{
"path": ".claude/skills/testing/SKILL.md",
"chars": 3062,
"preview": "---\nname: testing\ndescription: How to write tests, when to use each type of test, and how to run them. Contains informat"
},
{
"path": ".claude/skills/transaction-correctness/SKILL.md",
"chars": 3060,
"preview": "---\nname: transaction-correctness\ndescription: How WAL mechanics, checkpointing, concurrency rules, recovery work in tur"
},
{
"path": ".config/nextest.toml",
"chars": 513,
"preview": "[profile.loom]\n# Filter to only run tests with \"loom_\" in the name\ndefault-filter = 'test(/loom_/)'\n# Loom tests are slo"
},
{
"path": ".devcontainer/Dockerfile",
"chars": 4082,
"preview": "FROM node:20\n\nARG TZ\nARG CLAUDE_CODE_VERSION\nARG GIT_DELTA_VERSION\nARG ZSH_IN_DOCKER_VERSION\nARG GO_VERSION\nARG RUST_VER"
},
{
"path": ".devcontainer/Dockerfile.squid",
"chars": 112,
"preview": "FROM ubuntu/squid:latest\nRUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/*\n"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 1144,
"preview": "{\n \"name\": \"tursodb sandbox\",\n \"dockerComposeFile\": [\"docker-compose.yml\"],\n \"service\": \"tursodb\",\n \"remoteUser\": \"n"
},
{
"path": ".devcontainer/docker-compose.yml",
"chars": 1402,
"preview": "version: \"3.9\"\n\nservices:\n proxy:\n build:\n context: .\n dockerfile: Dockerfile.squid\n networks: [sandbox"
},
{
"path": ".devcontainer/init-firewall.sh",
"chars": 4683,
"preview": "#!/bin/bash\nset -euo pipefail # Exit on error, undefined vars, and pipeline failures\nIFS=$'\\n\\t' # Stricter word "
},
{
"path": ".devcontainer/squid.conf",
"chars": 669,
"preview": "http_port 3128\n\n# DNS\ndns_v4_first on\n\n# Allowed domains\nacl allowed dstdomain \\\n .pythonhosted.org \\\n .pypi.org \\"
},
{
"path": ".dockerignore",
"chars": 88,
"preview": "*target\n.git\nturso-test-runner\nassets\nperf/clickbench\nperf/tpc-h\ntesting/sqlright/build\n"
},
{
"path": ".github/labeler.yml",
"chars": 2444,
"preview": "simulator:\n - changed-files:\n - any-glob-to-any-file: \"testing/simulator/**/*\"\ndocs:\n - changed-files:\n - an"
},
{
"path": ".github/pull_request_template.md",
"chars": 1091,
"preview": "# NOTICE:\n<!-- \nIn order to streamline the contribution process, please check the \"allow edits from maintainers\" checkbo"
},
{
"path": ".github/shared/install_sqlite/action.yml",
"chars": 494,
"preview": "name: \"Install SQLite\"\ndescription: \"Installs sqlite3 CLI for compat tests that invoke it as a subprocess (make test-com"
},
{
"path": ".github/shared/setup-mold/action.yml",
"chars": 1348,
"preview": "name: \"Setup mold linker\"\ndescription: \"Installs mold linker with retry logic to handle transient GitHub download failur"
},
{
"path": ".github/shared/setup-sccache/action.yml",
"chars": 647,
"preview": "name: \"Setup sccache\"\ndescription: \"Installs sccache with graceful fallback if cache service is unavailable\"\n\nruns:\n us"
},
{
"path": ".github/turso-bot.yml",
"chars": 223,
"preview": "# Turso Bot configuration\n# Place this file in your repository at .github/turso-bot.yml\n\n# Enable or disable the bot for"
},
{
"path": ".github/workflows/antithesis-schedule.yml",
"chars": 403,
"preview": "name: Antithesis nightly\n\non:\n schedule:\n - cron: \"0 0 * * 0-5\" # Sun-Fri: 4 hour run\n - cron: \"0 0 * * 6\" # Sa"
},
{
"path": ".github/workflows/antithesis.yml",
"chars": 2009,
"preview": "name: Antithesis experiment\n\non:\n # Allows the workflow to be triggered manually\n workflow_dispatch:\n inputs:\n "
},
{
"path": ".github/workflows/build-sim.yml",
"chars": 1397,
"preview": "name: Build and push limbo-sim image\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n\n# Add permissions nee"
},
{
"path": ".github/workflows/build-sqlancer.yml",
"chars": 1469,
"preview": "name: Build and push sqlancer-runner image\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n paths:\n "
},
{
"path": ".github/workflows/c-compat.yml",
"chars": 1475,
"preview": "name: C compat Tests\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n tags:\n - v*\n pull_request:\n "
},
{
"path": ".github/workflows/claude.yml",
"chars": 2372,
"preview": "name: Claude Code\n\non:\n issue_comment:\n types: [created]\n pull_request_review_comment:\n types: [created]\n pull_"
},
{
"path": ".github/workflows/codspeed.yml",
"chars": 2994,
"preview": "name: CodSpeed\n\non:\n push:\n branches:\n - \"main\"\n pull_request:\n workflow_dispatch:\n\nconcurrency:\n group: ${{"
},
{
"path": ".github/workflows/dotnet-publish.yml",
"chars": 3477,
"preview": "name: Dotnet Publish\n\non:\n # Manually trigger the workflow\n workflow_dispatch:\n\nenv:\n working-directory: bindings/dot"
},
{
"path": ".github/workflows/dotnet-test.yml",
"chars": 1087,
"preview": "name: Dotnet Tests\n\non:\n push:\n branches:\n - main\n tags:\n - v*\n pull_request:\n branches:\n - ma"
},
{
"path": ".github/workflows/elle.yml",
"chars": 4004,
"preview": "name: Elle Consistency Check\n\non:\n push:\n branches:\n - main\n pull_request:\n branches:\n - main\n workfl"
},
{
"path": ".github/workflows/fuzz.yml",
"chars": 4248,
"preview": "name: Run long fuzz tests and stress test\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n tags:\n -"
},
{
"path": ".github/workflows/go.yml",
"chars": 13190,
"preview": "## path=../../.github/workflows/go-publish.yml\nname: Build & Publish Go Driver\n\non:\n workflow_dispatch:\n push:\n bra"
},
{
"path": ".github/workflows/java-publish.yml",
"chars": 4056,
"preview": "name: Publish Java Bindings to Maven Central\n\non:\n # Manually trigger the workflow\n workflow_dispatch:\n\nenv:\n working"
},
{
"path": ".github/workflows/java.yml",
"chars": 1108,
"preview": "name: Java Tests\n\non:\n push:\n branches:\n - main\n tags:\n - v*\n pull_request:\n branches:\n - main"
},
{
"path": ".github/workflows/labeler.yml",
"chars": 304,
"preview": "name: \"Pull Request Labeler\"\non:\n - pull_request_target\n\njobs:\n labeler:\n timeout-minutes: 30\n permissions:\n "
},
{
"path": ".github/workflows/napi.yml",
"chars": 11346,
"preview": "name: Build & publish @tursodatabase/database\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n tags:\n "
},
{
"path": ".github/workflows/perf_nightly.yml",
"chars": 7275,
"preview": "name: Nightly Benchmarks on Nyrkiö Runners (stability)\n\non:\n workflow_dispatch:\n branches: [\"main\", \"notmain\", \"mast"
},
{
"path": ".github/workflows/publish-crates.yml",
"chars": 411,
"preview": "name: Publish Crates\n\non:\n push:\n tags:\n - '**[0-9]+.[0-9]+.[0-9]+*'\n\njobs:\n publish:\n runs-on: ubuntu-late"
},
{
"path": ".github/workflows/python.yml",
"chars": 6551,
"preview": "name: Python\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n tags:\n - v*\n pull_request:\n branc"
},
{
"path": ".github/workflows/react-native.yml",
"chars": 5593,
"preview": "name: Build & publish @tursodatabase/sync-react-native\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n "
},
{
"path": ".github/workflows/release.yml",
"chars": 12661,
"preview": "# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist\n#\n# Copyright 2022-2024, axodotdev\n# SPDX-"
},
{
"path": ".github/workflows/rust.yml",
"chars": 12802,
"preview": "name: Rust\n\non:\n workflow_dispatch:\n push:\n branches: [\"main\"]\n pull_request:\n branches: [\"main\"]\n\nconcurrency:"
},
{
"path": ".github/workflows/rust_perf.yml",
"chars": 9471,
"preview": "name: Rust Benchmarks+Nyrkiö\n\non:\n workflow_dispatch:\n push:\n branches: [\"main\", \"master\", \"notmain\"]\n pull_reques"
},
{
"path": ".github/workflows/sqltest.yml",
"chars": 3534,
"preview": "name: SQL Tests\n\non:\n workflow_dispatch:\n push:\n branches: [\"main\"]\n pull_request:\n branches: [\"main\"]\n\nconcurr"
},
{
"path": ".github/workflows/stale.yml",
"chars": 819,
"preview": "name: Stale\n\non:\n schedule:\n - cron: '0 0 * * *' # Runs every day at midnight UTC\n\npermissions:\n issues: read\n pu"
},
{
"path": ".github/workflows/turso-serverless.yml",
"chars": 894,
"preview": "name: turso-serverless\n\non:\n workflow_dispatch:\n push:\n branches: [ main ]\n paths:\n - 'packages/turso-serve"
},
{
"path": ".github.json",
"chars": 294,
"preview": "{\n \"penberg\": {\n \"name\": \"Pekka Enberg\",\n \"email\": \"penberg@iki.fi\"\n },\n \"pereman2\": {\n \"n"
},
{
"path": ".gitignore",
"chars": 981,
"preview": "/target\n/target.noindex\n/.idea\n/.vscode\n/.sqlite3\n**/target\n\n*.so\n*.dylib\n*.ipynb\n*.o\n*.sqlite\n# Python\n.mypy_cache/\n.py"
},
{
"path": ".python-version",
"chars": 5,
"preview": "3.13\n"
},
{
"path": "AGENTS.md",
"chars": 3832,
"preview": "# Turso Agent Guidelines\n\nSQLite rewrite in Rust. 40+ crate workspace.\n\n## Quick Reference\n\n```bash\ncargo build "
},
{
"path": "CHANGELOG.md",
"chars": 174194,
"preview": "# Changelog\n\n## 0.5.0 -- 2026-03-04\n\n### Added\n* github/release: Add retry logic to network-dependent install steps (Pek"
},
{
"path": "COMPAT.md",
"chars": 66717,
"preview": "# Turso compatibility with SQLite\n\nThis document describes the compatibility of Turso with SQLite.\n\n## Table of contents"
},
{
"path": "CONTRIBUTING.md",
"chars": 14776,
"preview": "# Contributing to Turso\n\nWe'd love to have you contribute to Turso!\n\nThis document is a quick helper to get you going.\n\n"
},
{
"path": "Cargo.toml",
"chars": 4851,
"preview": "# Copyright 2023-2026 the Turso authors. All rights reserved. MIT license.\n\n[workspace]\nresolver = \"2\"\nmembers = [\n \""
},
{
"path": "Dockerfile.antithesis",
"chars": 6148,
"preview": "FROM lukemathwalker/cargo-chef:0.1.72-rust-1.88.0-slim-bullseye AS chef\nRUN apt update \\\n && apt install -y git libss"
},
{
"path": "Dockerfile.cli",
"chars": 339,
"preview": "FROM rust:1.88.0 as builder\n\nWORKDIR /app\n\n# Copy the actual source code\nCOPY . .\n\n# Build the CLI binary\nRUN cargo buil"
},
{
"path": "LICENSE.md",
"chars": 1070,
"preview": "MIT License\n\nCopyright 2024 the Turso authors\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
},
{
"path": "Makefile",
"chars": 7604,
"preview": "MINIMUM_RUST_VERSION := 1.73.0\nCURRENT_RUST_VERSION := $(shell rustc -V | sed -E 's/rustc ([0-9]+\\.[0-9]+\\.[0-9]+).*/\\1/"
},
{
"path": "NOTICE.md",
"chars": 2194,
"preview": "Limbo\n=======\n\nPlease visit our GitHub for more information:\n\n* https://github.com/tursodatabase/turso\n\nDependencies\n==="
},
{
"path": "PERF.md",
"chars": 1573,
"preview": "# Performance Testing\n\n## Mobibench\n\n1. Clone the source repository of Mobibench fork for Turso:\n\n```console\ngit clone g"
},
{
"path": "Pipfile",
"chars": 156,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nfaker = \"26.0.0\"\n\n[dev-packages]\n"
},
{
"path": "README.md",
"chars": 15796,
"preview": "<p align=\"center\">\n <img src=\"assets/turso.png\" alt=\"Turso Database\" width=\"800\"/>\n <h1 align=\"center\">Turso Database<"
},
{
"path": "bindings/dotnet/.gitignore",
"chars": 7979,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
},
{
"path": "bindings/dotnet/Cargo.toml",
"chars": 328,
"preview": "[package]\nname = \"turso-dotnet\"\nversion.workspace = true\nauthors.workspace = true\nedition.workspace = true\nlicense.works"
},
{
"path": "bindings/dotnet/Makefile",
"chars": 1533,
"preview": "ifeq ($(OS),Windows_NT)\n\tOS_TARGET = windows64\nelse \n UNAME_S := $(shell uname -s)\n\tifeq ($(UNAME_S),Linux)\n\t\tOS_TARG"
},
{
"path": "bindings/dotnet/Readme.md",
"chars": 655,
"preview": "# Turso_dotnet\n\nDotnet binding for turso database.\n\n## Getting Started\n\n```C#\nusing Turso;\n\nusing var connection = new T"
},
{
"path": "bindings/dotnet/Turso.slnx",
"chars": 983,
"preview": "<Solution>\n <Configurations>\n <Platform Name=\"Any CPU\" />\n <Platform Name=\"x64\" />\n <Platform Name=\"x86\" />\n "
},
{
"path": "bindings/dotnet/rs_src/lib.rs",
"chars": 15690,
"preview": "use std::borrow::Cow;\nuse std::ffi::CStr;\nuse std::num::NonZero;\nuse std::os::raw::c_char;\nuse std::ptr::null;\nuse std::"
},
{
"path": "bindings/dotnet/src/Benchmarks/Benchmarks.cs",
"chars": 2091,
"preview": "using System.Data;\nusing System.Data.SQLite;\nusing System.Runtime.CompilerServices;\nusing BenchmarkDotNet.Attributes;\nus"
},
{
"path": "bindings/dotnet/src/Benchmarks/Benchmarks.csproj",
"chars": 773,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>ne"
},
{
"path": "bindings/dotnet/src/Benchmarks/Program.cs",
"chars": 79,
"preview": "\nusing BenchmarkDotNet.Running;\n\nBenchmarkRunner.Run<Benchmarks.Benchmarks>();"
},
{
"path": "bindings/dotnet/src/Turso/Turso.csproj",
"chars": 608,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <OutputType>Library</OutputType>\n <TargetFramework>net9.0</"
},
{
"path": "bindings/dotnet/src/Turso/TursoCommand.cs",
"chars": 3360,
"preview": "using System.Data;\nusing System.Data.Common;\nusing Turso.Raw.Public;\nusing Turso.Raw.Public.Handles;\n\nnamespace Turso;\n"
},
{
"path": "bindings/dotnet/src/Turso/TursoConnection.cs",
"chars": 2537,
"preview": "using System.Data;\nusing System.Data.Common;\nusing Turso.Raw.Public;\nusing Turso.Raw.Public.Handles;\n\nnamespace Turso;\n"
},
{
"path": "bindings/dotnet/src/Turso/TursoConnectionOptions.cs",
"chars": 2826,
"preview": "using Turso.Raw.Public.Value;\n\nnamespace Turso;\n\npublic class TursoConnectionOptions\n{\n private Dictionary<string, s"
},
{
"path": "bindings/dotnet/src/Turso/TursoDataReader.cs",
"chars": 7216,
"preview": "using System.Collections;\nusing System.ComponentModel;\nusing System.Data.Common;\nusing System.Globalization;\nusing Syst"
},
{
"path": "bindings/dotnet/src/Turso/TursoParameter.cs",
"chars": 4220,
"preview": "using System.Data;\nusing System.Data.Common;\nusing Turso.Raw.Public.Value;\n\nnamespace Turso;\n\npublic class TursoParamete"
},
{
"path": "bindings/dotnet/src/Turso/TursoParameterCollection.cs",
"chars": 3611,
"preview": "using System.Collections;\nusing System.Data.Common;\n\nnamespace Turso;\n\npublic class TursoParameterCollection : DbParamet"
},
{
"path": "bindings/dotnet/src/Turso/TursoTransaction.cs",
"chars": 1443,
"preview": "using System.Data.Common;\nusing IsolationLevel = System.Data.IsolationLevel;\n\nnamespace Turso;\n\npublic class TursoTransa"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Data/TursoNativeArray.cs",
"chars": 190,
"preview": "using System.Runtime.InteropServices;\n\nnamespace Turso.Raw.Data;\n\n[StructLayout(LayoutKind.Sequential)]\ninternal struct "
},
{
"path": "bindings/dotnet/src/Turso.Raw/Data/TursoNativeRowValueUnion.cs",
"chars": 381,
"preview": "using System.Runtime.InteropServices;\n\nnamespace Turso.Raw.Data;\n\n[StructLayout(LayoutKind.Explicit)]\ninternal struct Tu"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Data/TursoNativeValue.cs",
"chars": 305,
"preview": "using System.Runtime.InteropServices;\nusing Turso.Raw.Public.Value;\n\nnamespace Turso.Raw.Data;\n\n[StructLayout(LayoutKind"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Public/Handles/TursoDatabaseHandle.cs",
"chars": 640,
"preview": "using System.Runtime.InteropServices;\n\nnamespace Turso.Raw.Public.Handles;\n\npublic class TursoDatabaseHandle() : SafeHan"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Public/Handles/TursoStatementHandle.cs",
"chars": 645,
"preview": "using System.Runtime.InteropServices;\n\nnamespace Turso.Raw.Public.Handles;\n\npublic class TursoStatementHandle() : SafeHa"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Public/TursoBindings.cs",
"chars": 6793,
"preview": "using System.Runtime.InteropServices;\nusing System.Text;\nusing Turso.Raw.Data;\nusing Turso.Raw.Public.Handles;\nusing Tur"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Public/TursoException.cs",
"chars": 94,
"preview": "namespace Turso.Raw.Public;\n\npublic class TursoException(string message) : Exception(message);"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Public/Value/TursoEncryptionCipher.cs",
"chars": 1295,
"preview": "namespace Turso.Raw.Public.Value;\n\n/// <summary>\n/// Supported encryption ciphers for local database encryption.\n/// </s"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Public/Value/TursoValue.cs",
"chars": 838,
"preview": "namespace Turso.Raw.Public.Value;\n\npublic struct TursoValue\n{\n public TursoValueType ValueType;\n public long IntVa"
},
{
"path": "bindings/dotnet/src/Turso.Raw/Public/Value/TursoValueType.cs",
"chars": 153,
"preview": "namespace Turso.Raw.Public.Value;\n\npublic enum TursoValueType\n{\n Empty = 0,\n Null = 1,\n Integer = 2,\n Real ="
},
{
"path": "bindings/dotnet/src/Turso.Raw/Turso.Raw.csproj",
"chars": 4113,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n <Impli"
},
{
"path": "bindings/dotnet/src/Turso.Raw/TursoInterop.cs",
"chars": 3091,
"preview": "using System.Runtime.InteropServices;\nusing Turso.Raw.Data;\nusing Turso.Raw.Public.Handles;\n\nnamespace Turso.Raw;\n\ninte"
},
{
"path": "bindings/dotnet/src/Turso.Tests/Turso.Tests.csproj",
"chars": 1086,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n <LangV"
},
{
"path": "bindings/dotnet/src/Turso.Tests/TursoTests.cs",
"chars": 11591,
"preview": "using System.Data.Common;\nusing AwesomeAssertions;\nusing Turso.Raw.Public;\nusing Turso.Raw.Public.Value;\n\nnamespace Tur"
},
{
"path": "bindings/go/LICENSE.md",
"chars": 1071,
"preview": "MIT License\n\nCopyright 2025 the Turso authors\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
},
{
"path": "bindings/go/README.md",
"chars": 4120,
"preview": "<p align=\"center\">\n <h1 align=\"center\">Turso Database for Go</h1>\n</p>\n\n<p align=\"center\">\n <a title=\"Go\" target=\"_bla"
},
{
"path": "bindings/go/VERSION",
"chars": 8,
"preview": "6119c6f0"
},
{
"path": "bindings/go/bindings.go",
"chars": 422,
"preview": "package turso\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tturso_libs \"github.com/tursodatabase/turso-go-platform-libs\"\n)\n\nvar initLibrary"
},
{
"path": "bindings/go/bindings_db.go",
"chars": 27846,
"preview": "package turso // import \"github.com/tursodatabase/turso/go\"\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"unsafe\"\n\n\t\"github.co"
},
{
"path": "bindings/go/bindings_db_test.go",
"chars": 12970,
"preview": "package turso\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\ntype"
},
{
"path": "bindings/go/bindings_sync.go",
"chars": 27406,
"preview": "package turso // import \"github.com/tursodatabase/turso/go\"\n\nimport (\n\t\"runtime\"\n\t\"unsafe\"\n\n\t\"github.com/ebitengine/pure"
},
{
"path": "bindings/go/driver_db.go",
"chars": 22304,
"preview": "package turso\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"net/url\"\n\t\"st"
},
{
"path": "bindings/go/driver_db_test.go",
"chars": 46309,
"preview": "package turso\n\nimport (\n\t\"bytes\"\n\t\"database/sql\"\n\t\"fmt\"\n\t\"log\"\n\t\"math\"\n\t\"os\"\n\t\"path\"\n\t\"runtime\"\n\t\"slices\"\n\t\"sync\"\n\t\"test"
},
{
"path": "bindings/go/driver_sync.go",
"chars": 18490,
"preview": "package turso\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\""
},
{
"path": "bindings/go/driver_sync_test.go",
"chars": 21105,
"preview": "package turso\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/rand\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n"
},
{
"path": "bindings/go/go-bindings-db-tests.mdx",
"chars": 1251,
"preview": "---\nname: 2025-11-26-go-bindings-test\n---\n\n<Output path=\"./bindings_db_test.go\">\n\n<Code model=\"openai/gpt-5\" language=\"g"
},
{
"path": "bindings/go/go-bindings-db.mdx",
"chars": 6072,
"preview": "---\nname: 2025-11-26-go-bindings\n---\n\n<Output path=\"./bindings_db.go\">\n\n<Code model=\"openai/gpt-5\" language=\"go\">\n\nGener"
},
{
"path": "bindings/go/go-bindings-sync.mdx",
"chars": 5064,
"preview": "---\nname: 2025-11-26-go-bindings-sync\n---\n\n<Output path=\"./bindings_sync.go\">\n\n<Code model=\"openai/gpt-5\" language=\"go\">"
},
{
"path": "bindings/go/go-driver-db.mdx",
"chars": 3057,
"preview": "---\nname: 2025-11-26-go-bindings\n---\n\n<Output path=\"./driver_db.go\">\n\n<Code model=\"openai/gpt-5\" language=\"go\">\n\nGenerat"
},
{
"path": "bindings/go/go-driver-sync.mdx",
"chars": 5979,
"preview": "---\nname: 2025-11-26-go-bindings-sync\n---\n\n<Output path=\"./driver_sync.go\">\n\n<Code model=\"openai/gpt-5\" language=\"go\">\n\n"
},
{
"path": "bindings/go/go.mod",
"chars": 423,
"preview": "module turso.tech/database/tursogo\n\ngo 1.24.0\n\ntoolchain go1.24.10\n\nrequire (\n\tgithub.com/ebitengine/purego v0.9.1\n\tgith"
},
{
"path": "bindings/go/go.sum",
"chars": 1749,
"preview": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.m"
},
{
"path": "bindings/java/.editorconfig",
"chars": 70,
"preview": "root = true\n\n[*.java]\nindent_size = 2\nij_continuation_indent_size = 4\n"
},
{
"path": "bindings/java/.gitignore",
"chars": 557,
"preview": ".gradle\nbuild/\n!gradle/wrapper/gradle-wrapper.jar\n!**/src/main/**/build/\n!**/src/test/**/build/\n\n### IntelliJ IDEA ###\n."
},
{
"path": "bindings/java/.sdkmanrc",
"chars": 18,
"preview": "java=8.0.452-amzn\n"
},
{
"path": "bindings/java/Cargo.toml",
"chars": 458,
"preview": "[package]\nname = \"turso-java\"\nversion.workspace = true\nauthors.workspace = true\nedition.workspace = true\nlicense.workspa"
},
{
"path": "bindings/java/Makefile",
"chars": 1905,
"preview": "RELEASE_DIR := libs\nTEMP_DIR := temp\n\nCARGO_BUILD := cargo build --profile release-official\n\nMACOS_X86_DIR := $(RELEASE_"
},
{
"path": "bindings/java/README.md",
"chars": 1201,
"preview": "# Turso JDBC Driver\n\nThe Turso JDBC driver is a library for accessing and creating Turso database files using Java.\n\n## "
},
{
"path": "bindings/java/build.gradle.kts",
"chars": 6046,
"preview": "import net.ltgt.gradle.errorprone.CheckSeverity\nimport net.ltgt.gradle.errorprone.errorprone\nimport org.gradle.api.tasks"
},
{
"path": "bindings/java/example/.gitignore",
"chars": 149,
"preview": ".gradle\nbuild/\n!gradle/wrapper/gradle-wrapper.jar\n!**/src/main/**/build/\n!**/src/test/**/build/\nsample.db\nsample.db-wal\n"
},
{
"path": "bindings/java/example/build.gradle.kts",
"chars": 512,
"preview": "plugins {\n id(\"java\")\n}\n\ngroup = \"tech.turso\"\nversion = \"1.0-SNAPSHOT\"\n\nrepositories {\n mavenLocal()\n mavenCent"
},
{
"path": "bindings/java/example/gradle/wrapper/gradle-wrapper.properties",
"chars": 231,
"preview": "#Sun Feb 02 20:06:51 KST 2025\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://"
},
{
"path": "bindings/java/example/gradlew",
"chars": 8047,
"preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "bindings/java/example/gradlew.bat",
"chars": 2674,
"preview": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "bindings/java/example/settings.gradle.kts",
"chars": 30,
"preview": "rootProject.name = \"example\"\n\n"
},
{
"path": "bindings/java/example/src/main/java/tech.turso/Main.java",
"chars": 997,
"preview": "package tech.turso;\n\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport java.s"
},
{
"path": "bindings/java/gradle/publish.gradle.kts",
"chars": 9524,
"preview": "import java.security.MessageDigest\nimport org.gradle.api.publish.PublishingExtension\nimport org.gradle.api.publish.maven"
},
{
"path": "bindings/java/gradle/wrapper/gradle-wrapper.properties",
"chars": 251,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
},
{
"path": "bindings/java/gradle.properties",
"chars": 561,
"preview": "projectGroup=tech.turso\nprojectVersion=0.6.0-pre.4\nprojectArtifactId=turso\n\n# POM metadata\npomName=Turso JDBC Driver\npom"
},
{
"path": "bindings/java/gradlew",
"chars": 8739,
"preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "bindings/java/gradlew.bat",
"chars": 2966,
"preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
},
{
"path": "bindings/java/rs_src/errors.rs",
"chars": 3774,
"preview": "use jni::errors::{Error, JniError};\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum TursoError {\n #[error(\"Cu"
},
{
"path": "bindings/java/rs_src/lib.rs",
"chars": 80,
"preview": "mod errors;\nmod turso_connection;\nmod turso_db;\nmod turso_statement;\nmod utils;\n"
},
{
"path": "bindings/java/rs_src/turso_connection.rs",
"chars": 3085,
"preview": "use crate::errors::{\n Result, TursoError, TURSO_ETC, TURSO_FAILED_TO_PARSE_BYTE_ARRAY,\n TURSO_FAILED_TO_PREPARE_ST"
},
{
"path": "bindings/java/rs_src/turso_db.rs",
"chars": 6942,
"preview": "use crate::errors::{Result, TursoError, TURSO_ETC};\nuse crate::turso_connection::TursoConnection;\nuse crate::utils::set_"
},
{
"path": "bindings/java/rs_src/turso_statement.rs",
"chars": 12109,
"preview": "use crate::errors::{Result, SQLITE_ERROR, SQLITE_OK};\nuse crate::errors::{TursoError, TURSO_ETC};\nuse crate::turso_conne"
},
{
"path": "bindings/java/rs_src/utils.rs",
"chars": 1844,
"preview": "use crate::errors::TursoError;\nuse jni::objects::{JByteArray, JObject};\nuse jni::JNIEnv;\n\npub(crate) fn utf8_byte_arr_to"
},
{
"path": "bindings/java/settings.gradle.kts",
"chars": 27,
"preview": "rootProject.name = \"turso\"\n"
},
{
"path": "bindings/java/src/main/java/examples/EncryptionExample.java",
"chars": 4834,
"preview": "package examples;\n\nimport tech.turso.core.TursoConnection;\nimport tech.turso.core.TursoDB;\nimport tech.turso.core.TursoE"
},
{
"path": "bindings/java/src/main/java/tech/turso/JDBC.java",
"chars": 2435,
"preview": "package tech.turso;\n\nimport java.sql.*;\nimport java.util.Locale;\nimport java.util.Properties;\nimport tech.turso.annotati"
},
{
"path": "bindings/java/src/main/java/tech/turso/TursoConfig.java",
"chars": 1435,
"preview": "package tech.turso;\n\nimport java.sql.DriverPropertyInfo;\nimport java.util.Arrays;\nimport java.util.Properties;\n\n/** Turs"
},
{
"path": "bindings/java/src/main/java/tech/turso/TursoDataSource.java",
"chars": 2108,
"preview": "package tech.turso;\n\nimport java.io.PrintWriter;\nimport java.sql.Connection;\nimport java.sql.SQLException;\nimport java.s"
},
{
"path": "bindings/java/src/main/java/tech/turso/TursoErrorCode.java",
"chars": 3284,
"preview": "package tech.turso;\n\nimport tech.turso.core.SqliteCode;\n\n/** Turso error code. Superset of SQLite3 error code. */\npublic"
},
{
"path": "bindings/java/src/main/java/tech/turso/annotations/NativeInvocation.java",
"chars": 496,
"preview": "package tech.turso.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport "
},
{
"path": "bindings/java/src/main/java/tech/turso/annotations/Nullable.java",
"chars": 555,
"preview": "package tech.turso.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport "
},
{
"path": "bindings/java/src/main/java/tech/turso/annotations/SkipNullableCheck.java",
"chars": 613,
"preview": "package tech.turso.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport "
},
{
"path": "bindings/java/src/main/java/tech/turso/annotations/VisibleForTesting.java",
"chars": 380,
"preview": "package tech.turso.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport "
},
{
"path": "bindings/java/src/main/java/tech/turso/core/SqliteCode.java",
"chars": 3431,
"preview": "/*\n * Copyright (c) 2007 David Crawshaw <david@zentus.com>\n *\n * Permission to use, copy, modify, and/or distribute this"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoConnection.java",
"chars": 10505,
"preview": "package tech.turso.core;\n\nimport static tech.turso.utils.ByteArrayUtils.stringToUtf8ByteArray;\n\nimport java.sql.Connecti"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoDB.java",
"chars": 8748,
"preview": "package tech.turso.core;\n\nimport static tech.turso.utils.ByteArrayUtils.stringToUtf8ByteArray;\n\nimport java.io.File;\nimp"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoEncryptionCipher.java",
"chars": 737,
"preview": "package tech.turso.core;\n\n/** Supported encryption ciphers for local database encryption. */\npublic enum TursoEncryption"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoPropertiesHolder.java",
"chars": 1229,
"preview": "package tech.turso.core;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Properties;\nimport te"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoResultSet.java",
"chars": 5899,
"preview": "package tech.turso.core;\n\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport tech.turso.annotations.Nullabl"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoStatement.java",
"chars": 11289,
"preview": "package tech.turso.core;\n\nimport java.sql.SQLException;\nimport tech.turso.annotations.NativeInvocation;\nimport tech.turs"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoStepResult.java",
"chars": 2784,
"preview": "package tech.turso.core;\n\nimport java.util.Arrays;\nimport tech.turso.annotations.NativeInvocation;\nimport tech.turso.ann"
},
{
"path": "bindings/java/src/main/java/tech/turso/core/TursoTransactionMode.java",
"chars": 2597,
"preview": "package tech.turso.core;\n\nimport java.sql.Connection;\n\n/**\n * Defines the transaction modes supported by Turso (SQLite)."
},
{
"path": "bindings/java/src/main/java/tech/turso/exceptions/TursoException.java",
"chars": 422,
"preview": "package tech.turso.exceptions;\n\nimport java.sql.SQLException;\nimport tech.turso.TursoErrorCode;\n\npublic final class Turs"
},
{
"path": "bindings/java/src/main/java/tech/turso/jdbc4/JDBC4Connection.java",
"chars": 10643,
"preview": "package tech.turso.jdbc4;\n\nimport java.sql.*;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Propertie"
},
{
"path": "bindings/java/src/main/java/tech/turso/jdbc4/JDBC4DatabaseMetaData.java",
"chars": 27917,
"preview": "package tech.turso.jdbc4;\n\nimport java.sql.Connection;\nimport java.sql.DatabaseMetaData;\nimport java.sql.PreparedStateme"
},
{
"path": "bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java",
"chars": 19108,
"preview": "package tech.turso.jdbc4;\n\nimport static java.util.Objects.requireNonNull;\n\nimport java.io.ByteArrayOutputStream;\nimport"
},
{
"path": "bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java",
"chars": 41220,
"preview": "package tech.turso.jdbc4;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.InputStream;\nimport java.io.Reader;\nimpor"
},
{
"path": "bindings/java/src/main/java/tech/turso/jdbc4/JDBC4Statement.java",
"chars": 12863,
"preview": "package tech.turso.jdbc4;\n\nimport static java.util.Objects.requireNonNull;\n\nimport java.sql.BatchUpdateException;\nimport"
},
{
"path": "bindings/java/src/main/java/tech/turso/utils/ByteArrayUtils.java",
"chars": 1010,
"preview": "package tech.turso.utils;\n\nimport java.nio.charset.StandardCharsets;\nimport tech.turso.annotations.Nullable;\n\n/** Utilit"
},
{
"path": "bindings/java/src/main/java/tech/turso/utils/Logger.java",
"chars": 340,
"preview": "package tech.turso.utils;\n\n/** A simple internal Logger interface. */\npublic interface Logger {\n void trace(String mess"
},
{
"path": "bindings/java/src/main/java/tech/turso/utils/LoggerFactory.java",
"chars": 3156,
"preview": "package tech.turso.utils;\n\nimport java.util.logging.Level;\n\n/**\n * A factory for {@link Logger} instances that uses SLF4"
},
{
"path": "bindings/java/src/main/java/tech/turso/utils/TursoExceptionUtils.java",
"chars": 1298,
"preview": "package tech.turso.utils;\n\nimport static tech.turso.utils.ByteArrayUtils.utf8ByteBufferToString;\n\nimport java.sql.SQLExc"
},
{
"path": "bindings/java/src/main/resources/META-INF/services/java.sql.Driver",
"chars": 16,
"preview": "tech.turso.JDBC\n"
},
{
"path": "bindings/java/src/main/resources/turso-jdbc.properties",
"chars": 138,
"preview": "driverName=turso-jdbc\n# find a way to relate driverVersion with project.version defined in gradle.properties\ndriverVersi"
},
{
"path": "bindings/java/src/test/java/tech/turso/IntegrationTest.java",
"chars": 1199,
"preview": "package tech.turso;\n\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport java.sql.Statement;\nimport java.uti"
},
{
"path": "bindings/java/src/test/java/tech/turso/JDBCTest.java",
"chars": 1785,
"preview": "package tech.turso;\n\nimport static org.assertj.core.api.AssertionsForClassTypes.assertThat;\nimport static org.junit.jupi"
},
{
"path": "bindings/java/src/test/java/tech/turso/TestUtils.java",
"chars": 307,
"preview": "package tech.turso;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\n\npublic class TestUtils {\n /** Create temp"
},
{
"path": "bindings/java/src/test/java/tech/turso/core/TursoDBTest.java",
"chars": 3883,
"preview": "package tech.turso.core;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.junit.jupiter.api."
},
{
"path": "bindings/java/src/test/java/tech/turso/core/TursoStatementTest.java",
"chars": 4151,
"preview": "package tech.turso.core;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nimport java.util.Properties;\nimport org.jun"
},
{
"path": "bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ConnectionTest.java",
"chars": 3117,
"preview": "package tech.turso.jdbc4;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nimport java.sql.ResultSet;\nimport java.sql"
},
{
"path": "bindings/java/src/test/java/tech/turso/jdbc4/JDBC4DatabaseMetaDataTest.java",
"chars": 4440,
"preview": "package tech.turso.jdbc4;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static org.junit.jupiter."
},
{
"path": "bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java",
"chars": 41850,
"preview": "package tech.turso.jdbc4;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nimport java.io.ByteArrayInputStream;\nimpor"
},
{
"path": "bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ResultSetTest.java",
"chars": 41419,
"preview": "package tech.turso.jdbc4;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nimport java.io.InputStream;\nimport java.io"
},
{
"path": "bindings/java/src/test/java/tech/turso/jdbc4/JDBC4StatementTest.java",
"chars": 16079,
"preview": "package tech.turso.jdbc4;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.junit.jupiter.api"
},
{
"path": "bindings/java/src/test/java/tech/turso/jdbc4/TransactionTest.java",
"chars": 8799,
"preview": "package tech.turso.jdbc4;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nimport java.sql.*;\nimport java.util.Proper"
},
{
"path": "bindings/java/src/test/resources/turso/CACHEDIR.TAG",
"chars": 177,
"preview": "Signature: 8a477f597d28d172789f06886806bc55\n# This file is a cache directory tag created by cargo.\n# For information abo"
},
{
"path": "bindings/javascript/.gitignore",
"chars": 3304,
"preview": "# Created by https://www.toptal.com/developers/gitignore/api/node\n# Edit at https://www.toptal.com/developers/gitignore?"
},
{
"path": "bindings/javascript/.npmignore",
"chars": 136,
"preview": "target\nCargo.lock\n.cargo\n.github\nnpm\n.eslintrc\n.prettierignore\nrustfmt.toml\nyarn.lock\n*.node\n.yarn\n__test__\nrenovate.jso"
},
{
"path": "bindings/javascript/.yarn/releases/yarn-4.9.2.cjs",
"chars": 3004991,
"preview": "#!/usr/bin/env node\n/* eslint-disable */\n//prettier-ignore\n(()=>{var UVe=Object.create;var E_=Object.defineProperty;var "
},
{
"path": "bindings/javascript/.yarnrc.yml",
"chars": 150,
"preview": "nodeLinker: node-modules\n\nyarnPath: .yarn/releases/yarn-4.9.2.cjs\nenableHardenedMode: false\nsupportedArchitectures:\n cp"
},
{
"path": "bindings/javascript/Cargo.toml",
"chars": 811,
"preview": "[package]\nname = \"turso_node\"\nversion.workspace = true\nauthors.workspace = true\nedition.workspace = true\nlicense.workspa"
},
{
"path": "bindings/javascript/Makefile",
"chars": 641,
"preview": "pack-native:\n\tnpm publish --dry-run && npm pack\npack-wasm:\n\tcp package.json package.native.json\n\tcp package.browser.json"
},
{
"path": "bindings/javascript/README.md",
"chars": 4182,
"preview": "<p align=\"center\">\n <h1 align=\"center\">Turso Database for JavaScript</h1>\n</p>\n\n<p align=\"center\">\n <a title=\"JavaScri"
},
{
"path": "bindings/javascript/build.rs",
"chars": 65,
"preview": "extern crate napi_build;\n\nfn main() {\n napi_build::setup();\n}\n"
},
{
"path": "bindings/javascript/docs/API.md",
"chars": 7545,
"preview": "# class Database\n\nThe `Database` class represents a connection that can prepare and execute SQL statements.\n\n## Methods\n"
},
{
"path": "bindings/javascript/docs/CONTRIBUTING.md",
"chars": 1559,
"preview": "# Contributing\n\nSo you want to contribute to Limbo's binding for the ~second~ best language in the world? Awesome.\n\nFirs"
},
{
"path": "bindings/javascript/package.json",
"chars": 497,
"preview": "{\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"npm run build --workspaces\",\n \"build:native\": \"npm run build --wor"
},
{
"path": "bindings/javascript/packages/common/README.md",
"chars": 408,
"preview": "## About\n\nThis package is the Turso embedded database common JS library which is shared between final builds for Node an"
},
{
"path": "bindings/javascript/packages/common/async-lock.ts",
"chars": 725,
"preview": "export class AsyncLock {\n locked: boolean;\n queue: any[];\n constructor() {\n this.locked = false;\n "
},
{
"path": "bindings/javascript/packages/common/bind.ts",
"chars": 1877,
"preview": "// Bind parameters to a statement.\n//\n// This function is used to bind parameters to a statement. It supports both\n// na"
},
{
"path": "bindings/javascript/packages/common/compat.ts",
"chars": 10465,
"preview": "import { bindParams } from \"./bind.js\";\nimport { SqliteError } from \"./sqlite-error.js\";\nimport { NativeDatabase, Native"
}
]
// ... and 1857 more files (download for full content)
About this extraction
This page contains the full source code of the tursodatabase/turso GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2057 files (28.0 MB), approximately 4.1M tokens, and a symbol index with 18192 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.