rubydb 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -15
- data/.github/workflows/benchmark.yml +26 -26
- data/.github/workflows/compatibility.yml +63 -63
- data/.github/workflows/fuzz.yml +33 -33
- data/.github/workflows/lint.yml +21 -21
- data/.github/workflows/operations.yml +24 -24
- data/.github/workflows/production-validation.yml +111 -111
- data/.github/workflows/release.yml +77 -77
- data/.github/workflows/security.yml +39 -37
- data/.github/workflows/test.yml +26 -26
- data/.github/workflows/workload.yml +58 -58
- data/.gitignore +12 -5
- data/.rubocop.yml +50 -44
- data/.standard.yml +9 -14
- data/ARCHITECTURE.md +21 -21
- data/CHANGELOG.md +49 -27
- data/CODE_OF_CONDUCT.md +13 -13
- data/CONTRIBUTING.md +29 -29
- data/GOVERNANCE.md +16 -16
- data/Gemfile +18 -17
- data/Gemfile.lock +125 -71
- data/README.md +249 -162
- data/ROADMAP.md +27 -27
- data/Rakefile +71 -71
- data/SECURITY.md +54 -54
- data/SUPPORT.md +14 -14
- data/adapters/activerecord/Gemfile +11 -11
- data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +877 -880
- data/adapters/activerecord/rubydb-activerecord.gemspec +21 -21
- data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +155 -143
- data/adapters/ruby/README.md +18 -18
- data/adapters/sequel/README.md +11 -11
- data/config/monitoring/prometheus-alerts.yml +39 -39
- data/config/production.yml +36 -36
- data/docs/README.md +75 -71
- data/docs/architecture/concurrency.md +14 -14
- data/docs/architecture/current-state.md +125 -125
- data/docs/architecture/execution-engine.md +25 -25
- data/docs/architecture/indexes.md +19 -19
- data/docs/architecture/mvcc.md +19 -19
- data/docs/architecture/overview.md +13 -13
- data/docs/architecture/pages.md +11 -11
- data/docs/architecture/production-roadmap.md +82 -82
- data/docs/architecture/query-planner.md +20 -20
- data/docs/architecture/recovery.md +18 -18
- data/docs/architecture/sql-engine.md +12 -12
- data/docs/architecture/storage-engine.md +14 -14
- data/docs/architecture/transactions.md +10 -10
- data/docs/architecture/wal.md +28 -28
- data/docs/cli-cheatsheet.md +98 -98
- data/docs/cli.md +275 -275
- data/docs/contributing/architecture.md +9 -9
- data/docs/contributing/benchmarking.md +14 -14
- data/docs/contributing/development.md +16 -16
- data/docs/contributing/release-process.md +49 -49
- data/docs/contributing/testing.md +16 -16
- data/docs/debugging.md +229 -229
- data/docs/developer/branching.md +10 -10
- data/docs/developer/database-diff.md +10 -10
- data/docs/developer/local-development.md +17 -17
- data/docs/developer/snapshots.md +9 -9
- data/docs/developer/temporal-data.md +10 -10
- data/docs/developer-guide.md +297 -297
- data/docs/getting-started/first-database.md +16 -16
- data/docs/getting-started/first-query.md +13 -13
- data/docs/getting-started/installation.md +19 -19
- data/docs/getting-started/local-to-production.md +300 -300
- data/docs/getting-started/quickstart.md +17 -17
- data/docs/getting-started/rails.md +16 -16
- data/docs/hardening_backlog.md +93 -93
- data/docs/lessons-learned.md +112 -112
- data/docs/operations/backups.md +33 -33
- data/docs/operations/disaster-recovery.md +31 -31
- data/docs/operations/failover.md +30 -30
- data/docs/operations/monitoring.md +25 -25
- data/docs/operations/production-guide.md +295 -295
- data/docs/operations/production-runbook.md +45 -45
- data/docs/operations/replication.md +33 -33
- data/docs/operations/restore.md +6 -6
- data/docs/operations/runbook.md +34 -34
- data/docs/operations/upgrades.md +14 -14
- data/docs/operations/workload-testing.md +17 -17
- data/docs/production-readiness.md +118 -118
- data/docs/production_validation.md +150 -150
- data/docs/rails/active-record.md +11 -11
- data/docs/rails/compatibility-guide.md +90 -90
- data/docs/rails/database-yml.md +92 -92
- data/docs/rails/installation.md +17 -17
- data/docs/rails/migrations.md +17 -17
- data/docs/rails/production.md +82 -82
- data/docs/rails/troubleshooting.md +18 -18
- data/docs/release.md +25 -25
- data/docs/server/architecture.md +10 -10
- data/docs/server/authentication.md +10 -10
- data/docs/server/configuration.md +16 -16
- data/docs/server/connection-pooling.md +10 -10
- data/docs/server/deployment.md +10 -10
- data/docs/server/protocol.md +12 -12
- data/docs/sql/compatibility-guide.md +82 -82
- data/docs/sql/compatibility.md +39 -39
- data/docs/sql/data-types.md +10 -10
- data/docs/sql/functions.md +9 -9
- data/docs/sql/joins.md +9 -9
- data/docs/sql/operators.md +9 -9
- data/docs/sql/sqlite-compatibility.md +21 -21
- data/docs/sql/syntax.md +10 -10
- data/docs/sql/transactions.md +10 -10
- data/docs/troubleshooting.md +244 -244
- data/lessons/01-foundations.md +73 -0
- data/lessons/02-local-development.md +121 -0
- data/lessons/03-embedded-rubydb.md +99 -0
- data/lessons/04-rails-complex-apps.md +138 -0
- data/lessons/05-rubydb-production-server.md +237 -0
- data/lessons/06-postgresql-massive-apps.md +96 -0
- data/lessons/07-hybrid-microservices.md +94 -0
- data/lessons/08-migrations-backups-recovery.md +86 -0
- data/lessons/09-observability-security-scale.md +87 -0
- data/lessons/10-release-readiness.md +125 -0
- data/lib/rubydb/backup/archive.rb +332 -334
- data/lib/rubydb/backup/backup.rb +400 -401
- data/lib/rubydb/backup/incremental.rb +349 -353
- data/lib/rubydb/backup/restore.rb +289 -290
- data/lib/rubydb/backup/snapshot.rb +265 -267
- data/lib/rubydb/backup/verification.rb +276 -279
- data/lib/rubydb/branching/branch.rb +181 -181
- data/lib/rubydb/branching/branch_manager.rb +307 -311
- data/lib/rubydb/branching/branch_metadata.rb +140 -140
- data/lib/rubydb/branching/checkout.rb +165 -166
- data/lib/rubydb/branching/copy_on_write.rb +272 -272
- data/lib/rubydb/branching/diff.rb +137 -138
- data/lib/rubydb/branching/merge.rb +282 -285
- data/lib/rubydb/build_info.rb +15 -15
- data/lib/rubydb/catalog/catalog.rb +391 -391
- data/lib/rubydb/catalog/column.rb +112 -112
- data/lib/rubydb/catalog/constraint.rb +180 -180
- data/lib/rubydb/catalog/database.rb +184 -184
- data/lib/rubydb/catalog/index.rb +97 -97
- data/lib/rubydb/catalog/schema.rb +103 -103
- data/lib/rubydb/catalog/sequence.rb +90 -90
- data/lib/rubydb/catalog/system_catalog.rb +698 -698
- data/lib/rubydb/catalog/table.rb +178 -178
- data/lib/rubydb/catalog/trigger.rb +102 -102
- data/lib/rubydb/catalog/view.rb +66 -66
- data/lib/rubydb/cli/application.rb +163 -163
- data/lib/rubydb/cli/commands/backup.rb +80 -81
- data/lib/rubydb/cli/commands/branch.rb +72 -72
- data/lib/rubydb/cli/commands/checkout.rb +54 -54
- data/lib/rubydb/cli/commands/create.rb +58 -58
- data/lib/rubydb/cli/commands/diff.rb +76 -77
- data/lib/rubydb/cli/commands/doctor.rb +74 -74
- data/lib/rubydb/cli/commands/drop.rb +57 -57
- data/lib/rubydb/cli/commands/init.rb +101 -102
- data/lib/rubydb/cli/commands/inspect.rb +95 -95
- data/lib/rubydb/cli/commands/merge.rb +63 -63
- data/lib/rubydb/cli/commands/migrate.rb +62 -62
- data/lib/rubydb/cli/commands/restart.rb +42 -39
- data/lib/rubydb/cli/commands/restore.rb +121 -121
- data/lib/rubydb/cli/commands/shell.rb +365 -365
- data/lib/rubydb/cli/commands/snapshot.rb +79 -79
- data/lib/rubydb/cli/commands/start.rb +88 -82
- data/lib/rubydb/cli/commands/status.rb +96 -92
- data/lib/rubydb/cli/commands/stop.rb +47 -47
- data/lib/rubydb/cli/commands/vacuum.rb +58 -58
- data/lib/rubydb/cli/formatter.rb +221 -221
- data/lib/rubydb/cli/output.rb +168 -168
- data/lib/rubydb/client/client.rb +302 -304
- data/lib/rubydb/client/connection.rb +414 -415
- data/lib/rubydb/client/connection_pool.rb +168 -168
- data/lib/rubydb/client/connection_url.rb +96 -96
- data/lib/rubydb/client/prepared_statement.rb +60 -60
- data/lib/rubydb/client/result.rb +123 -123
- data/lib/rubydb/client/statement.rb +52 -52
- data/lib/rubydb/client/transaction.rb +130 -130
- data/lib/rubydb/concurrency/concurrency.rb +19 -19
- data/lib/rubydb/concurrency/deadlock_detector.rb +148 -150
- data/lib/rubydb/concurrency/latch.rb +101 -101
- data/lib/rubydb/concurrency/lock_graph.rb +163 -165
- data/lib/rubydb/concurrency/mutex.rb +181 -183
- data/lib/rubydb/concurrency/rw_lock.rb +180 -180
- data/lib/rubydb/concurrency/scheduler.rb +248 -250
- data/lib/rubydb/concurrency/worker_pool.rb +145 -143
- data/lib/rubydb/configuration/config.rb +170 -170
- data/lib/rubydb/configuration/defaults.rb +179 -179
- data/lib/rubydb/configuration/environment.rb +152 -152
- data/lib/rubydb/configuration/parser.rb +185 -185
- data/lib/rubydb/configuration/validation.rb +221 -221
- data/lib/rubydb/constants.rb +74 -74
- data/lib/rubydb/constraints/check.rb +181 -181
- data/lib/rubydb/constraints/constraint.rb +101 -101
- data/lib/rubydb/constraints/foreign_key.rb +130 -130
- data/lib/rubydb/constraints/not_null.rb +64 -64
- data/lib/rubydb/constraints/primary_key.rb +99 -99
- data/lib/rubydb/constraints/unique.rb +106 -108
- data/lib/rubydb/constraints/validator.rb +349 -350
- data/lib/rubydb/errors/authentication_error.rb +10 -10
- data/lib/rubydb/errors/authorization_error.rb +23 -23
- data/lib/rubydb/errors/client_error.rb +10 -10
- data/lib/rubydb/errors/configuration_error.rb +10 -10
- data/lib/rubydb/errors/connection_error.rb +10 -10
- data/lib/rubydb/errors/constraint_error.rb +23 -23
- data/lib/rubydb/errors/corruption_error.rb +10 -10
- data/lib/rubydb/errors/database_error.rb +10 -10
- data/lib/rubydb/errors/error.rb +20 -20
- data/lib/rubydb/errors/execution_error.rb +10 -10
- data/lib/rubydb/errors/parser_error.rb +10 -10
- data/lib/rubydb/errors/recovery_error.rb +10 -10
- data/lib/rubydb/errors/replication_error.rb +10 -10
- data/lib/rubydb/errors/server_error.rb +6 -6
- data/lib/rubydb/errors/storage_error.rb +10 -10
- data/lib/rubydb/errors/transaction_error.rb +10 -10
- data/lib/rubydb/execution/aggregate_executor.rb +134 -138
- data/lib/rubydb/execution/delete_executor.rb +110 -112
- data/lib/rubydb/execution/distinct_executor.rb +131 -135
- data/lib/rubydb/execution/executor.rb +1195 -1192
- data/lib/rubydb/execution/expression.rb +191 -193
- data/lib/rubydb/execution/index_scan.rb +142 -142
- data/lib/rubydb/execution/insert_executor.rb +215 -217
- data/lib/rubydb/execution/join_executor.rb +243 -249
- data/lib/rubydb/execution/limit_executor.rb +83 -85
- data/lib/rubydb/execution/optimizer.rb +227 -215
- data/lib/rubydb/execution/plan.rb +355 -353
- data/lib/rubydb/execution/planner.rb +542 -536
- data/lib/rubydb/execution/predicate.rb +235 -235
- data/lib/rubydb/execution/scan.rb +49 -49
- data/lib/rubydb/execution/sequential_scan.rb +63 -63
- data/lib/rubydb/execution/sort_executor.rb +180 -185
- data/lib/rubydb/execution/update_executor.rb +160 -162
- data/lib/rubydb/functions/aggregate.rb +70 -70
- data/lib/rubydb/functions/date_functions.rb +274 -278
- data/lib/rubydb/functions/function.rb +85 -85
- data/lib/rubydb/functions/json_functions.rb +231 -215
- data/lib/rubydb/functions/numeric_functions.rb +346 -346
- data/lib/rubydb/functions/scalar.rb +52 -52
- data/lib/rubydb/functions/string_functions.rb +383 -383
- data/lib/rubydb/functions/system_functions.rb +258 -246
- data/lib/rubydb/history/as_of.rb +238 -238
- data/lib/rubydb/history/change.rb +105 -105
- data/lib/rubydb/history/history.rb +131 -131
- data/lib/rubydb/history/history_manager.rb +228 -229
- data/lib/rubydb/history/temporal_query.rb +202 -202
- data/lib/rubydb/history/timeline.rb +144 -144
- data/lib/rubydb/indexes/btree.rb +186 -186
- data/lib/rubydb/indexes/btree_cursor.rb +258 -258
- data/lib/rubydb/indexes/btree_node.rb +384 -385
- data/lib/rubydb/indexes/hash_index.rb +150 -150
- data/lib/rubydb/indexes/index.rb +71 -71
- data/lib/rubydb/indexes/index_manager.rb +408 -406
- data/lib/rubydb/indexes/index_scan.rb +466 -470
- data/lib/rubydb/migrations/migration.rb +253 -254
- data/lib/rubydb/migrations/migration_lock.rb +146 -146
- data/lib/rubydb/migrations/migration_manager.rb +187 -176
- data/lib/rubydb/migrations/migration_version.rb +71 -71
- data/lib/rubydb/migrations/schema_diff.rb +211 -211
- data/lib/rubydb/migrations/schema_version.rb +64 -64
- data/lib/rubydb/monitoring/events.rb +155 -160
- data/lib/rubydb/monitoring/health.rb +216 -222
- data/lib/rubydb/monitoring/logger.rb +188 -193
- data/lib/rubydb/monitoring/metrics.rb +363 -359
- data/lib/rubydb/monitoring/performance.rb +176 -176
- data/lib/rubydb/monitoring/statistics.rb +168 -170
- data/lib/rubydb/mvcc/garbage_collector.rb +199 -199
- data/lib/rubydb/mvcc/mvcc.rb +16 -16
- data/lib/rubydb/mvcc/snapshot.rb +146 -147
- data/lib/rubydb/mvcc/vacuum.rb +180 -180
- data/lib/rubydb/mvcc/version.rb +106 -106
- data/lib/rubydb/mvcc/version_store.rb +396 -398
- data/lib/rubydb/mvcc/visibility.rb +107 -109
- data/lib/rubydb/protocol/capabilities.rb +125 -125
- data/lib/rubydb/protocol/decoder.rb +142 -145
- data/lib/rubydb/protocol/encoder.rb +131 -136
- data/lib/rubydb/protocol/handshake.rb +306 -305
- data/lib/rubydb/protocol/message.rb +121 -121
- data/lib/rubydb/protocol/parameter_binder.rb +101 -0
- data/lib/rubydb/protocol/protocol.rb +276 -277
- data/lib/rubydb/protocol/version.rb +54 -54
- data/lib/rubydb/rails/adapter.rb +245 -239
- data/lib/rubydb/rails/connection.rb +312 -314
- data/lib/rubydb/rails/database_statements.rb +122 -122
- data/lib/rubydb/rails/migration.rb +131 -131
- data/lib/rubydb/rails/quoting.rb +109 -109
- data/lib/rubydb/rails/result.rb +123 -120
- data/lib/rubydb/rails/schema_statements.rb +339 -339
- data/lib/rubydb/rails/transaction.rb +105 -105
- data/lib/rubydb/rails/type.rb +126 -126
- data/lib/rubydb/recovery/checkpoint.rb +261 -257
- data/lib/rubydb/recovery/consistency.rb +457 -467
- data/lib/rubydb/recovery/corruption_detector.rb +5 -5
- data/lib/rubydb/recovery/crash_recovery.rb +381 -387
- data/lib/rubydb/recovery/recovery_manager.rb +204 -206
- data/lib/rubydb/recovery/redo.rb +235 -237
- data/lib/rubydb/recovery/undo.rb +204 -206
- data/lib/rubydb/replication/failover.rb +5 -5
- data/lib/rubydb/replication/fencing.rb +63 -63
- data/lib/rubydb/replication/primary.rb +461 -450
- data/lib/rubydb/replication/replica.rb +382 -384
- data/lib/rubydb/replication/replication_log.rb +194 -200
- data/lib/rubydb/replication/replication_manager.rb +307 -308
- data/lib/rubydb/replication/replication_slot.rb +293 -295
- data/lib/rubydb/replication/replication_stream.rb +198 -201
- data/lib/rubydb/rubydb.rb +564 -560
- data/lib/rubydb/security/access_control.rb +252 -254
- data/lib/rubydb/security/audit_log.rb +209 -213
- data/lib/rubydb/security/authentication.rb +302 -302
- data/lib/rubydb/security/authorization.rb +282 -282
- data/lib/rubydb/security/credentials.rb +192 -196
- data/lib/rubydb/security/password.rb +205 -215
- data/lib/rubydb/security/permissions.rb +74 -74
- data/lib/rubydb/security/role.rb +99 -101
- data/lib/rubydb/security/user.rb +86 -86
- data/lib/rubydb/server/connection.rb +383 -366
- data/lib/rubydb/server/connection_pool.rb +193 -193
- data/lib/rubydb/server/lifecycle.rb +227 -228
- data/lib/rubydb/server/listener.rb +139 -136
- data/lib/rubydb/server/request_handler.rb +277 -276
- data/lib/rubydb/server/server.rb +363 -364
- data/lib/rubydb/server/session.rb +371 -369
- data/lib/rubydb/server/worker.rb +206 -210
- data/lib/rubydb/server/worker_pool.rb +168 -168
- data/lib/rubydb/sql/ast/alter_table.rb +169 -169
- data/lib/rubydb/sql/ast/begin_transaction.rb +47 -47
- data/lib/rubydb/sql/ast/commit.rb +37 -37
- data/lib/rubydb/sql/ast/constraint.rb +92 -83
- data/lib/rubydb/sql/ast/create_database.rb +41 -41
- data/lib/rubydb/sql/ast/create_index.rb +61 -61
- data/lib/rubydb/sql/ast/create_schema.rb +52 -52
- data/lib/rubydb/sql/ast/create_table.rb +187 -187
- data/lib/rubydb/sql/ast/delete.rb +54 -54
- data/lib/rubydb/sql/ast/drop_database.rb +41 -41
- data/lib/rubydb/sql/ast/drop_index.rb +41 -41
- data/lib/rubydb/sql/ast/drop_schema.rb +49 -49
- data/lib/rubydb/sql/ast/drop_table.rb +49 -49
- data/lib/rubydb/sql/ast/explain.rb +64 -64
- data/lib/rubydb/sql/ast/expression.rb +617 -604
- data/lib/rubydb/sql/ast/insert.rb +66 -66
- data/lib/rubydb/sql/ast/node.rb +42 -42
- data/lib/rubydb/sql/ast/rollback.rb +63 -63
- data/lib/rubydb/sql/ast/savepoint.rb +59 -59
- data/lib/rubydb/sql/ast/select.rb +88 -88
- data/lib/rubydb/sql/ast/set_operation.rb +22 -20
- data/lib/rubydb/sql/ast/trigger.rb +35 -29
- data/lib/rubydb/sql/ast/update.rb +88 -88
- data/lib/rubydb/sql/ast/vacuum.rb +19 -19
- data/lib/rubydb/sql/ast/view.rb +38 -32
- data/lib/rubydb/sql/ast/with.rb +32 -32
- data/lib/rubydb/sql/grammar.rb +86 -86
- data/lib/rubydb/sql/keywords.rb +156 -156
- data/lib/rubydb/sql/lexer.rb +209 -214
- data/lib/rubydb/sql/operators.rb +100 -100
- data/lib/rubydb/sql/parser.rb +1167 -1170
- data/lib/rubydb/sql/planner/analyzer.rb +283 -302
- data/lib/rubydb/sql/planner/binder.rb +537 -550
- data/lib/rubydb/sql/planner/type_checker.rb +427 -431
- data/lib/rubydb/sql/token.rb +210 -210
- data/lib/rubydb/storage/buffer_frame.rb +44 -44
- data/lib/rubydb/storage/buffer_pool.rb +155 -155
- data/lib/rubydb/storage/database_lock.rb +74 -74
- data/lib/rubydb/storage/deserializer.rb +332 -342
- data/lib/rubydb/storage/engine.rb +2347 -2330
- data/lib/rubydb/storage/file_manager.rb +191 -187
- data/lib/rubydb/storage/free_space_map.rb +79 -81
- data/lib/rubydb/storage/page.rb +92 -94
- data/lib/rubydb/storage/page_allocator.rb +852 -855
- data/lib/rubydb/storage/page_header.rb +63 -67
- data/lib/rubydb/storage/page_manager.rb +127 -131
- data/lib/rubydb/storage/record.rb +58 -58
- data/lib/rubydb/storage/row.rb +78 -78
- data/lib/rubydb/storage/serializer.rb +51 -51
- data/lib/rubydb/storage/storage_layout.rb +151 -151
- data/lib/rubydb/storage/storage_manager.rb +114 -114
- data/lib/rubydb/storage/tuple.rb +458 -461
- data/lib/rubydb/storage/visibility_map.rb +964 -973
- data/lib/rubydb/transactions/commit_manager.rb +219 -220
- data/lib/rubydb/transactions/isolation.rb +98 -98
- data/lib/rubydb/transactions/lock.rb +76 -76
- data/lib/rubydb/transactions/lock_manager.rb +359 -362
- data/lib/rubydb/transactions/savepoint.rb +142 -143
- data/lib/rubydb/transactions/transaction.rb +214 -215
- data/lib/rubydb/transactions/transaction_id.rb +84 -84
- data/lib/rubydb/transactions/transaction_log.rb +256 -257
- data/lib/rubydb/transactions/transaction_manager.rb +434 -435
- data/lib/rubydb/types/bigint.rb +36 -36
- data/lib/rubydb/types/blob.rb +37 -37
- data/lib/rubydb/types/boolean.rb +34 -34
- data/lib/rubydb/types/date.rb +39 -39
- data/lib/rubydb/types/decimal.rb +48 -48
- data/lib/rubydb/types/float.rb +34 -34
- data/lib/rubydb/types/integer.rb +36 -36
- data/lib/rubydb/types/json.rb +41 -41
- data/lib/rubydb/types/null.rb +34 -34
- data/lib/rubydb/types/smallint.rb +36 -36
- data/lib/rubydb/types/text.rb +37 -37
- data/lib/rubydb/types/time.rb +46 -46
- data/lib/rubydb/types/timestamp.rb +39 -39
- data/lib/rubydb/types/type.rb +119 -119
- data/lib/rubydb/types/uuid.rb +47 -47
- data/lib/rubydb/types/varchar.rb +37 -37
- data/lib/rubydb/version.rb +32 -32
- data/lib/rubydb/wal/archive.rb +190 -193
- data/lib/rubydb/wal/checkpoint.rb +181 -183
- data/lib/rubydb/wal/lsn.rb +94 -94
- data/lib/rubydb/wal/reader.rb +259 -260
- data/lib/rubydb/wal/record.rb +105 -105
- data/lib/rubydb/wal/segment.rb +193 -193
- data/lib/rubydb/wal/wal.rb +480 -452
- data/lib/rubydb/wal/writer.rb +236 -236
- data/lib/rubydb.rb +7 -7
- data/packaging/docker/docker-compose.failover.yml +43 -43
- data/packaging/homebrew/rubydb.rb +19 -19
- data/rubydb.gemspec +60 -57
- data/scripts/benchmark +7 -7
- data/scripts/durability_drill +37 -37
- data/scripts/fuzz +63 -63
- data/scripts/release +45 -40
- data/scripts/release_check +43 -43
- data/scripts/replication_failover_drill +268 -250
- data/scripts/replication_network_failover_drill +287 -255
- data/scripts/restore_drill +45 -45
- data/scripts/security +45 -0
- metadata +54 -1
data/docs/server/protocol.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# RubyDB server protocol
|
|
2
|
-
|
|
3
|
-
The client/server protocol uses bounded framed requests and responses with
|
|
4
|
-
handshake, authentication, query, prepared statement, transaction, health, and
|
|
5
|
-
metrics operations. Frames must be size-limited and malformed input must be
|
|
6
|
-
rejected without taking down the server.
|
|
7
|
-
|
|
8
|
-
Query deadlines and in-flight cancellation are request-scoped. Cancellation is
|
|
9
|
-
cooperative and must be checked by long-running execution paths. Do not expose
|
|
10
|
-
the listener publicly; use TLS/private networking and rotate credentials through
|
|
11
|
-
the documented operations procedure. The normative notes are in
|
|
12
|
-
`spec/wire/protocol.md` and `spec/protocol/protocol.md`.
|
|
1
|
+
# RubyDB server protocol
|
|
2
|
+
|
|
3
|
+
The client/server protocol uses bounded framed requests and responses with
|
|
4
|
+
handshake, authentication, query, prepared statement, transaction, health, and
|
|
5
|
+
metrics operations. Frames must be size-limited and malformed input must be
|
|
6
|
+
rejected without taking down the server.
|
|
7
|
+
|
|
8
|
+
Query deadlines and in-flight cancellation are request-scoped. Cancellation is
|
|
9
|
+
cooperative and must be checked by long-running execution paths. Do not expose
|
|
10
|
+
the listener publicly; use TLS/private networking and rotate credentials through
|
|
11
|
+
the documented operations procedure. The normative notes are in
|
|
12
|
+
`spec/wire/protocol.md` and `spec/protocol/protocol.md`.
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
# SQL compatibility guide
|
|
2
|
-
|
|
3
|
-
This page is a developer reference for evaluating SQL support. The normative
|
|
4
|
-
statement list is [SQL compatibility](compatibility.md); the SQLite-style
|
|
5
|
-
application profile is [here](sqlite-compatibility.md). RubyDB does not claim
|
|
6
|
-
complete PostgreSQL, MySQL, or SQLite dialect compatibility.
|
|
7
|
-
|
|
8
|
-
## Compatibility has four layers
|
|
9
|
-
|
|
10
|
-
An SQL feature is production-ready only when all four layers agree:
|
|
11
|
-
|
|
12
|
-
1. syntax is parsed and rejected with useful errors;
|
|
13
|
-
2. binding and type rules are defined, including `NULL`;
|
|
14
|
-
3. planner/executor results and transaction semantics are correct; and
|
|
15
|
-
4. Ruby, client/server, and ActiveRecord paths behave consistently.
|
|
16
|
-
|
|
17
|
-
A parser accepting a statement is not sufficient. Test duplicate rows,
|
|
18
|
-
ordering, aggregates, joins, constraints, rollback, savepoints, indexes,
|
|
19
|
-
timeouts, and recovery for every feature that mutates or reads data.
|
|
20
|
-
|
|
21
|
-
## Query review checklist
|
|
22
|
-
|
|
23
|
-
For each query shape, record schema, indexes, bind types, expected rows,
|
|
24
|
-
expected ordering, transaction isolation, and error behavior. Test empty,
|
|
25
|
-
single-row, duplicate, `NULL`, and large-result cases. Explicitly order results
|
|
26
|
-
when the application requires order; relational results are not inherently
|
|
27
|
-
ordered.
|
|
28
|
-
|
|
29
|
-
Review:
|
|
30
|
-
|
|
31
|
-
* projections and aliases;
|
|
32
|
-
* boolean precedence and `NULL` truth tables;
|
|
33
|
-
* inner, left, and multi-table joins;
|
|
34
|
-
* grouping, aggregate input, and `HAVING`;
|
|
35
|
-
* limits and offsets at boundaries;
|
|
36
|
-
* conflict/upsert behavior and affected-row counts;
|
|
37
|
-
* casts, defaults, and constraint errors; and
|
|
38
|
-
* snapshot visibility during concurrent writes.
|
|
39
|
-
|
|
40
|
-
## Application migration from SQLite
|
|
41
|
-
|
|
42
|
-
Start with a schema dump and a representative query/migration inventory. Run
|
|
43
|
-
the application test suite against RubyDB, not only a few hand-written
|
|
44
|
-
queries. Review pragmas, virtual tables, FTS, extensions, custom functions,
|
|
45
|
-
file-format assumptions, recursive queries, date/time behavior, collations,
|
|
46
|
-
and error handling. These areas are not included merely because the common
|
|
47
|
-
profile looks SQLite-like.
|
|
48
|
-
|
|
49
|
-
Never point RubyDB at an existing SQLite file and expect it to open. Migrate
|
|
50
|
-
through an explicit export/import process with checksums, row counts, and
|
|
51
|
-
application-level verification.
|
|
52
|
-
|
|
53
|
-
## SQL change workflow
|
|
54
|
-
|
|
55
|
-
Add a contract example under `spec/sql`, parser tests, execution tests, failure
|
|
56
|
-
tests, and adapter coverage when relevant. Update the compatibility page and
|
|
57
|
-
release notes. Add a regression for every bug. If semantics are intentionally
|
|
58
|
-
different from another database, document the difference with a migration
|
|
59
|
-
recommendation.
|
|
60
|
-
|
|
61
|
-
## Safe examples
|
|
62
|
-
|
|
63
|
-
```sql
|
|
64
|
-
CREATE TABLE IF NOT EXISTS users (
|
|
65
|
-
id INTEGER PRIMARY KEY,
|
|
66
|
-
email TEXT NOT NULL UNIQUE,
|
|
67
|
-
active BOOLEAN DEFAULT TRUE
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
INSERT INTO users (email, active) VALUES (?, ?);
|
|
71
|
-
|
|
72
|
-
SELECT active, COUNT(*) AS total
|
|
73
|
-
FROM users
|
|
74
|
-
WHERE email IS NOT NULL
|
|
75
|
-
GROUP BY active
|
|
76
|
-
HAVING COUNT(*) > 0
|
|
77
|
-
ORDER BY active;
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Use bound parameters from Ruby or ActiveRecord. Do not construct SQL by
|
|
81
|
-
concatenating user input.
|
|
82
|
-
|
|
1
|
+
# SQL compatibility guide
|
|
2
|
+
|
|
3
|
+
This page is a developer reference for evaluating SQL support. The normative
|
|
4
|
+
statement list is [SQL compatibility](compatibility.md); the SQLite-style
|
|
5
|
+
application profile is [here](sqlite-compatibility.md). RubyDB does not claim
|
|
6
|
+
complete PostgreSQL, MySQL, or SQLite dialect compatibility.
|
|
7
|
+
|
|
8
|
+
## Compatibility has four layers
|
|
9
|
+
|
|
10
|
+
An SQL feature is production-ready only when all four layers agree:
|
|
11
|
+
|
|
12
|
+
1. syntax is parsed and rejected with useful errors;
|
|
13
|
+
2. binding and type rules are defined, including `NULL`;
|
|
14
|
+
3. planner/executor results and transaction semantics are correct; and
|
|
15
|
+
4. Ruby, client/server, and ActiveRecord paths behave consistently.
|
|
16
|
+
|
|
17
|
+
A parser accepting a statement is not sufficient. Test duplicate rows,
|
|
18
|
+
ordering, aggregates, joins, constraints, rollback, savepoints, indexes,
|
|
19
|
+
timeouts, and recovery for every feature that mutates or reads data.
|
|
20
|
+
|
|
21
|
+
## Query review checklist
|
|
22
|
+
|
|
23
|
+
For each query shape, record schema, indexes, bind types, expected rows,
|
|
24
|
+
expected ordering, transaction isolation, and error behavior. Test empty,
|
|
25
|
+
single-row, duplicate, `NULL`, and large-result cases. Explicitly order results
|
|
26
|
+
when the application requires order; relational results are not inherently
|
|
27
|
+
ordered.
|
|
28
|
+
|
|
29
|
+
Review:
|
|
30
|
+
|
|
31
|
+
* projections and aliases;
|
|
32
|
+
* boolean precedence and `NULL` truth tables;
|
|
33
|
+
* inner, left, and multi-table joins;
|
|
34
|
+
* grouping, aggregate input, and `HAVING`;
|
|
35
|
+
* limits and offsets at boundaries;
|
|
36
|
+
* conflict/upsert behavior and affected-row counts;
|
|
37
|
+
* casts, defaults, and constraint errors; and
|
|
38
|
+
* snapshot visibility during concurrent writes.
|
|
39
|
+
|
|
40
|
+
## Application migration from SQLite
|
|
41
|
+
|
|
42
|
+
Start with a schema dump and a representative query/migration inventory. Run
|
|
43
|
+
the application test suite against RubyDB, not only a few hand-written
|
|
44
|
+
queries. Review pragmas, virtual tables, FTS, extensions, custom functions,
|
|
45
|
+
file-format assumptions, recursive queries, date/time behavior, collations,
|
|
46
|
+
and error handling. These areas are not included merely because the common
|
|
47
|
+
profile looks SQLite-like.
|
|
48
|
+
|
|
49
|
+
Never point RubyDB at an existing SQLite file and expect it to open. Migrate
|
|
50
|
+
through an explicit export/import process with checksums, row counts, and
|
|
51
|
+
application-level verification.
|
|
52
|
+
|
|
53
|
+
## SQL change workflow
|
|
54
|
+
|
|
55
|
+
Add a contract example under `spec/sql`, parser tests, execution tests, failure
|
|
56
|
+
tests, and adapter coverage when relevant. Update the compatibility page and
|
|
57
|
+
release notes. Add a regression for every bug. If semantics are intentionally
|
|
58
|
+
different from another database, document the difference with a migration
|
|
59
|
+
recommendation.
|
|
60
|
+
|
|
61
|
+
## Safe examples
|
|
62
|
+
|
|
63
|
+
```sql
|
|
64
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
65
|
+
id INTEGER PRIMARY KEY,
|
|
66
|
+
email TEXT NOT NULL UNIQUE,
|
|
67
|
+
active BOOLEAN DEFAULT TRUE
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
INSERT INTO users (email, active) VALUES (?, ?);
|
|
71
|
+
|
|
72
|
+
SELECT active, COUNT(*) AS total
|
|
73
|
+
FROM users
|
|
74
|
+
WHERE email IS NOT NULL
|
|
75
|
+
GROUP BY active
|
|
76
|
+
HAVING COUNT(*) > 0
|
|
77
|
+
ORDER BY active;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use bound parameters from Ruby or ActiveRecord. Do not construct SQL by
|
|
81
|
+
concatenating user input.
|
|
82
|
+
|
data/docs/sql/compatibility.md
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
# RubyDB SQL compatibility
|
|
2
|
-
|
|
3
|
-
RubyDB supports a deliberately documented SQL dialect. It includes a tested
|
|
4
|
-
SQLite-style compatibility profile for common new Ruby/Rails applications (see
|
|
5
|
-
`sqlite-compatibility.md`), but this is not a claim of complete SQLite,
|
|
6
|
-
PostgreSQL, or MySQL compatibility.
|
|
7
|
-
|
|
8
|
-
Supported and tested statements include:
|
|
9
|
-
|
|
10
|
-
- `SELECT` with projections, `WHERE`, ordering, limits, offsets, built-in
|
|
11
|
-
expressions, and `COUNT`, `SUM`, `AVG`, `MIN`, and `MAX` aggregates (including
|
|
12
|
-
`DISTINCT` aggregate arguments) with
|
|
13
|
-
`GROUP BY` and `HAVING`
|
|
14
|
-
- window ranking functions `ROW_NUMBER`, `RANK`, and `DENSE_RANK`, plus
|
|
15
|
-
partition-wide and explicit `ROWS`-framed aggregate windows using
|
|
16
|
-
`OVER (PARTITION BY ... ORDER BY ...)`
|
|
17
|
-
- `UNION`, `UNION ALL`, `INTERSECT`, and `EXCEPT` for compatible SELECT
|
|
18
|
-
projections
|
|
19
|
-
- non-correlated scalar subqueries, `IN (SELECT ...)`, and `EXISTS (SELECT ...)`
|
|
20
|
-
predicates
|
|
21
|
-
- materialized non-recursive and bounded recursive `WITH` common table
|
|
22
|
-
expressions
|
|
23
|
-
- `INSERT`, `UPDATE`, and `DELETE`, including multi-row `VALUES`,
|
|
24
|
-
`ON CONFLICT DO NOTHING`, and targeted `ON CONFLICT (...) DO UPDATE SET ...`
|
|
25
|
-
with `excluded.column`
|
|
26
|
-
- `CREATE TABLE` and `DROP TABLE`, including primary keys, unique constraints,
|
|
27
|
-
checks, foreign keys, and referential actions
|
|
28
|
-
- `CREATE INDEX`/`CREATE UNIQUE INDEX` and `DROP INDEX`
|
|
29
|
-
- `ALTER TABLE` add/drop columns and constraints
|
|
30
|
-
- `CREATE`/`DROP DATABASE`, `CREATE`/`DROP SCHEMA`, and `CREATE`/`DROP VIEW`
|
|
31
|
-
- supported trigger metadata DDL: `CREATE TRIGGER ... EXECUTE FUNCTION ...`
|
|
32
|
-
- `BEGIN`, `COMMIT`, `ROLLBACK`, `SAVEPOINT`, `ROLLBACK TO SAVEPOINT`, and
|
|
33
|
-
`RELEASE SAVEPOINT`
|
|
34
|
-
- `EXPLAIN`, `EXPLAIN ANALYZE`, and `VACUUM`
|
|
35
|
-
|
|
36
|
-
Unsupported syntax must fail with a parser or execution error. RubyDB does not
|
|
37
|
-
promise arbitrary SQL extensions, PostgreSQL wire-level compatibility, or
|
|
38
|
-
feature parity with another database engine. The executable contract is the
|
|
39
|
-
integration coverage under `spec/`.
|
|
1
|
+
# RubyDB SQL compatibility
|
|
2
|
+
|
|
3
|
+
RubyDB supports a deliberately documented SQL dialect. It includes a tested
|
|
4
|
+
SQLite-style compatibility profile for common new Ruby/Rails applications (see
|
|
5
|
+
`sqlite-compatibility.md`), but this is not a claim of complete SQLite,
|
|
6
|
+
PostgreSQL, or MySQL compatibility.
|
|
7
|
+
|
|
8
|
+
Supported and tested statements include:
|
|
9
|
+
|
|
10
|
+
- `SELECT` with projections, `WHERE`, ordering, limits, offsets, built-in
|
|
11
|
+
expressions, and `COUNT`, `SUM`, `AVG`, `MIN`, and `MAX` aggregates (including
|
|
12
|
+
`DISTINCT` aggregate arguments) with
|
|
13
|
+
`GROUP BY` and `HAVING`
|
|
14
|
+
- window ranking functions `ROW_NUMBER`, `RANK`, and `DENSE_RANK`, plus
|
|
15
|
+
partition-wide and explicit `ROWS`-framed aggregate windows using
|
|
16
|
+
`OVER (PARTITION BY ... ORDER BY ...)`
|
|
17
|
+
- `UNION`, `UNION ALL`, `INTERSECT`, and `EXCEPT` for compatible SELECT
|
|
18
|
+
projections
|
|
19
|
+
- non-correlated scalar subqueries, `IN (SELECT ...)`, and `EXISTS (SELECT ...)`
|
|
20
|
+
predicates
|
|
21
|
+
- materialized non-recursive and bounded recursive `WITH` common table
|
|
22
|
+
expressions
|
|
23
|
+
- `INSERT`, `UPDATE`, and `DELETE`, including multi-row `VALUES`,
|
|
24
|
+
`ON CONFLICT DO NOTHING`, and targeted `ON CONFLICT (...) DO UPDATE SET ...`
|
|
25
|
+
with `excluded.column`
|
|
26
|
+
- `CREATE TABLE` and `DROP TABLE`, including primary keys, unique constraints,
|
|
27
|
+
checks, foreign keys, and referential actions
|
|
28
|
+
- `CREATE INDEX`/`CREATE UNIQUE INDEX` and `DROP INDEX`
|
|
29
|
+
- `ALTER TABLE` add/drop columns and constraints
|
|
30
|
+
- `CREATE`/`DROP DATABASE`, `CREATE`/`DROP SCHEMA`, and `CREATE`/`DROP VIEW`
|
|
31
|
+
- supported trigger metadata DDL: `CREATE TRIGGER ... EXECUTE FUNCTION ...`
|
|
32
|
+
- `BEGIN`, `COMMIT`, `ROLLBACK`, `SAVEPOINT`, `ROLLBACK TO SAVEPOINT`, and
|
|
33
|
+
`RELEASE SAVEPOINT`
|
|
34
|
+
- `EXPLAIN`, `EXPLAIN ANALYZE`, and `VACUUM`
|
|
35
|
+
|
|
36
|
+
Unsupported syntax must fail with a parser or execution error. RubyDB does not
|
|
37
|
+
promise arbitrary SQL extensions, PostgreSQL wire-level compatibility, or
|
|
38
|
+
feature parity with another database engine. The executable contract is the
|
|
39
|
+
integration coverage under `spec/`.
|
data/docs/sql/data-types.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# SQL data types
|
|
2
|
-
|
|
3
|
-
The documented RubyDB types are `INTEGER`, `BIGINT`, `SMALLINT`, `FLOAT`,
|
|
4
|
-
`DECIMAL`, `BOOLEAN`, `TEXT`, `VARCHAR`, `BLOB`, `DATE`, `TIME`, `TIMESTAMP`,
|
|
5
|
-
`JSON`, and `UUID`. Type conversion, nullability, defaults, and constraint
|
|
6
|
-
behavior are validated through the SQL and Rails suites.
|
|
7
|
-
|
|
8
|
-
RubyDB does not claim storage or coercion compatibility with every other SQL
|
|
9
|
-
engine. Preserve types explicitly in migrations and test application boundary
|
|
10
|
-
values, nulls, booleans, timestamps, decimals, JSON, and binary data.
|
|
1
|
+
# SQL data types
|
|
2
|
+
|
|
3
|
+
The documented RubyDB types are `INTEGER`, `BIGINT`, `SMALLINT`, `FLOAT`,
|
|
4
|
+
`DECIMAL`, `BOOLEAN`, `TEXT`, `VARCHAR`, `BLOB`, `DATE`, `TIME`, `TIMESTAMP`,
|
|
5
|
+
`JSON`, and `UUID`. Type conversion, nullability, defaults, and constraint
|
|
6
|
+
behavior are validated through the SQL and Rails suites.
|
|
7
|
+
|
|
8
|
+
RubyDB does not claim storage or coercion compatibility with every other SQL
|
|
9
|
+
engine. Preserve types explicitly in migrations and test application boundary
|
|
10
|
+
values, nulls, booleans, timestamps, decimals, JSON, and binary data.
|
data/docs/sql/functions.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# SQL functions
|
|
2
|
-
|
|
3
|
-
The tested function surface includes `COUNT`, `SUM`, `AVG`, `MIN`, `MAX`,
|
|
4
|
-
`LOWER`, `UPPER`, `LENGTH`, `SUBSTR`, `CONCAT`, `COALESCE`, and `NULLIF`, plus
|
|
5
|
-
the documented window ranking and aggregate functions.
|
|
6
|
-
|
|
7
|
-
Function null behavior and return types are part of the compatibility contract.
|
|
8
|
-
Do not assume a PostgreSQL, MySQL, or SQLite extension exists because a function
|
|
9
|
-
has the same name; unsupported functions must be reported explicitly.
|
|
1
|
+
# SQL functions
|
|
2
|
+
|
|
3
|
+
The tested function surface includes `COUNT`, `SUM`, `AVG`, `MIN`, `MAX`,
|
|
4
|
+
`LOWER`, `UPPER`, `LENGTH`, `SUBSTR`, `CONCAT`, `COALESCE`, and `NULLIF`, plus
|
|
5
|
+
the documented window ranking and aggregate functions.
|
|
6
|
+
|
|
7
|
+
Function null behavior and return types are part of the compatibility contract.
|
|
8
|
+
Do not assume a PostgreSQL, MySQL, or SQLite extension exists because a function
|
|
9
|
+
has the same name; unsupported functions must be reported explicitly.
|
data/docs/sql/joins.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# SQL joins
|
|
2
|
-
|
|
3
|
-
RubyDB supports qualified `INNER`, `LEFT [OUTER]`, `RIGHT`, `FULL [OUTER]`, and
|
|
4
|
-
`CROSS JOIN` forms with `ON` predicates in the documented dialect. Outer joins
|
|
5
|
-
preserve unmatched rows with null-extended columns.
|
|
6
|
-
|
|
7
|
-
Use explicit table qualification when columns are ambiguous. Validate join
|
|
8
|
-
cardinality, null behavior, ordering, grouping, and transaction visibility with
|
|
9
|
-
representative data. Join reordering is limited to safe inner-join plans.
|
|
1
|
+
# SQL joins
|
|
2
|
+
|
|
3
|
+
RubyDB supports qualified `INNER`, `LEFT [OUTER]`, `RIGHT`, `FULL [OUTER]`, and
|
|
4
|
+
`CROSS JOIN` forms with `ON` predicates in the documented dialect. Outer joins
|
|
5
|
+
preserve unmatched rows with null-extended columns.
|
|
6
|
+
|
|
7
|
+
Use explicit table qualification when columns are ambiguous. Validate join
|
|
8
|
+
cardinality, null behavior, ordering, grouping, and transaction visibility with
|
|
9
|
+
representative data. Join reordering is limited to safe inner-join plans.
|
data/docs/sql/operators.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# SQL operators and predicates
|
|
2
|
-
|
|
3
|
-
The documented surface includes arithmetic, comparison, boolean `AND`/`OR` and
|
|
4
|
-
`NOT`, `IS NULL`/`IS NOT NULL`, `BETWEEN`, `IN`, `EXISTS`, `LIKE`, `ILIKE`, and
|
|
5
|
-
three-valued null behavior covered by the SQL tests.
|
|
6
|
-
|
|
7
|
-
Use bound parameters for user input. Test false, null, empty string, numeric
|
|
8
|
-
precision, and mixed-type values explicitly; similar syntax across SQL engines
|
|
9
|
-
does not guarantee identical semantics.
|
|
1
|
+
# SQL operators and predicates
|
|
2
|
+
|
|
3
|
+
The documented surface includes arithmetic, comparison, boolean `AND`/`OR` and
|
|
4
|
+
`NOT`, `IS NULL`/`IS NOT NULL`, `BETWEEN`, `IN`, `EXISTS`, `LIKE`, `ILIKE`, and
|
|
5
|
+
three-valued null behavior covered by the SQL tests.
|
|
6
|
+
|
|
7
|
+
Use bound parameters for user input. Test false, null, empty string, numeric
|
|
8
|
+
precision, and mixed-type values explicitly; similar syntax across SQL engines
|
|
9
|
+
does not guarantee identical semantics.
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# SQLite compatibility profile
|
|
2
|
-
|
|
3
|
-
RubyDB now maintains an explicit SQLite-style compatibility profile for new
|
|
4
|
-
Ruby and Rails applications. The profile is tested by
|
|
5
|
-
`spec/sqlite_compatibility_spec.rb` and covers the common application surface:
|
|
6
|
-
|
|
7
|
-
- `CREATE TABLE IF NOT EXISTS`, integer primary keys with `AUTOINCREMENT`,
|
|
8
|
-
defaults, `NOT NULL`, and `UNIQUE`
|
|
9
|
-
- CRUD, parameter binding through the Rails connection, transactions, and
|
|
10
|
-
rollback
|
|
11
|
-
- `WHERE`, `IS NULL`/boolean predicates, ordering, `LIMIT`/`OFFSET`, joins,
|
|
12
|
-
grouped aggregates, and `HAVING`
|
|
13
|
-
- targeted `ON CONFLICT ... DO UPDATE` upserts
|
|
14
|
-
- ActiveRecord schema inspection through the embedded adapter
|
|
15
|
-
|
|
16
|
-
This is useful for applications written against the documented RubyDB surface,
|
|
17
|
-
but it is not a complete replacement for the SQLite library. SQLite pragmas,
|
|
18
|
-
virtual tables, FTS, recursive query edge cases, extension APIs, file-format
|
|
19
|
-
compatibility, and every SQLite function/error behavior remain unsupported or
|
|
20
|
-
unverified. An existing SQLite application must run its own migration and
|
|
21
|
-
query suite before migration.
|
|
1
|
+
# SQLite compatibility profile
|
|
2
|
+
|
|
3
|
+
RubyDB now maintains an explicit SQLite-style compatibility profile for new
|
|
4
|
+
Ruby and Rails applications. The profile is tested by
|
|
5
|
+
`spec/sqlite_compatibility_spec.rb` and covers the common application surface:
|
|
6
|
+
|
|
7
|
+
- `CREATE TABLE IF NOT EXISTS`, integer primary keys with `AUTOINCREMENT`,
|
|
8
|
+
defaults, `NOT NULL`, and `UNIQUE`
|
|
9
|
+
- CRUD, parameter binding through the Rails connection, transactions, and
|
|
10
|
+
rollback
|
|
11
|
+
- `WHERE`, `IS NULL`/boolean predicates, ordering, `LIMIT`/`OFFSET`, joins,
|
|
12
|
+
grouped aggregates, and `HAVING`
|
|
13
|
+
- targeted `ON CONFLICT ... DO UPDATE` upserts
|
|
14
|
+
- ActiveRecord schema inspection through the embedded adapter
|
|
15
|
+
|
|
16
|
+
This is useful for applications written against the documented RubyDB surface,
|
|
17
|
+
but it is not a complete replacement for the SQLite library. SQLite pragmas,
|
|
18
|
+
virtual tables, FTS, recursive query edge cases, extension APIs, file-format
|
|
19
|
+
compatibility, and every SQLite function/error behavior remain unsupported or
|
|
20
|
+
unverified. An existing SQLite application must run its own migration and
|
|
21
|
+
query suite before migration.
|
data/docs/sql/syntax.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# SQL syntax
|
|
2
|
-
|
|
3
|
-
Statements are parsed by RubyDB's lexer and parser and executed through the
|
|
4
|
-
planner. The supported statements include `SELECT`, `INSERT`, `UPDATE`,
|
|
5
|
-
`DELETE`, table/index/schema/view DDL, transactions/savepoints, `EXPLAIN`, and
|
|
6
|
-
`VACUUM` as listed in [compatibility](compatibility.md).
|
|
7
|
-
|
|
8
|
-
Use semicolons for multiple statements only where the client path supports
|
|
9
|
-
them. Identifiers may be quoted with double quotes or backticks. Unsupported
|
|
10
|
-
syntax fails with a parser or execution error; it is never silently ignored.
|
|
1
|
+
# SQL syntax
|
|
2
|
+
|
|
3
|
+
Statements are parsed by RubyDB's lexer and parser and executed through the
|
|
4
|
+
planner. The supported statements include `SELECT`, `INSERT`, `UPDATE`,
|
|
5
|
+
`DELETE`, table/index/schema/view DDL, transactions/savepoints, `EXPLAIN`, and
|
|
6
|
+
`VACUUM` as listed in [compatibility](compatibility.md).
|
|
7
|
+
|
|
8
|
+
Use semicolons for multiple statements only where the client path supports
|
|
9
|
+
them. Identifiers may be quoted with double quotes or backticks. Unsupported
|
|
10
|
+
syntax fails with a parser or execution error; it is never silently ignored.
|
data/docs/sql/transactions.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# SQL transactions
|
|
2
|
-
|
|
3
|
-
RubyDB supports `BEGIN`, `COMMIT`, `ROLLBACK`, `SAVEPOINT`, `ROLLBACK TO
|
|
4
|
-
SAVEPOINT`, and `RELEASE SAVEPOINT`. Commits coordinate MVCC, locks, row
|
|
5
|
-
mutation, WAL, and durable acknowledgement.
|
|
6
|
-
|
|
7
|
-
Keep transactions short enough for the workload. Long-running readers can
|
|
8
|
-
retain old versions and delay vacuum; deadlock victims must retry the
|
|
9
|
-
application unit. Validate transaction behavior after restart and under
|
|
10
|
-
concurrency.
|
|
1
|
+
# SQL transactions
|
|
2
|
+
|
|
3
|
+
RubyDB supports `BEGIN`, `COMMIT`, `ROLLBACK`, `SAVEPOINT`, `ROLLBACK TO
|
|
4
|
+
SAVEPOINT`, and `RELEASE SAVEPOINT`. Commits coordinate MVCC, locks, row
|
|
5
|
+
mutation, WAL, and durable acknowledgement.
|
|
6
|
+
|
|
7
|
+
Keep transactions short enough for the workload. Long-running readers can
|
|
8
|
+
retain old versions and delay vacuum; deadlock victims must retry the
|
|
9
|
+
application unit. Validate transaction behavior after restart and under
|
|
10
|
+
concurrency.
|