rubydb 0.1.4 → 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.
Files changed (420) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +15 -15
  3. data/.github/workflows/benchmark.yml +26 -26
  4. data/.github/workflows/compatibility.yml +63 -63
  5. data/.github/workflows/fuzz.yml +33 -33
  6. data/.github/workflows/lint.yml +21 -21
  7. data/.github/workflows/operations.yml +24 -24
  8. data/.github/workflows/production-validation.yml +111 -111
  9. data/.github/workflows/release.yml +77 -77
  10. data/.github/workflows/security.yml +39 -37
  11. data/.github/workflows/test.yml +26 -26
  12. data/.github/workflows/workload.yml +58 -58
  13. data/.gitignore +12 -5
  14. data/.rubocop.yml +50 -44
  15. data/.standard.yml +9 -14
  16. data/ARCHITECTURE.md +21 -21
  17. data/CHANGELOG.md +43 -27
  18. data/CODE_OF_CONDUCT.md +13 -13
  19. data/CONTRIBUTING.md +29 -29
  20. data/GOVERNANCE.md +16 -16
  21. data/Gemfile +18 -17
  22. data/Gemfile.lock +125 -71
  23. data/README.md +249 -162
  24. data/ROADMAP.md +27 -27
  25. data/Rakefile +71 -71
  26. data/SECURITY.md +54 -54
  27. data/SUPPORT.md +14 -14
  28. data/adapters/activerecord/Gemfile +11 -11
  29. data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +873 -879
  30. data/adapters/activerecord/rubydb-activerecord.gemspec +20 -20
  31. data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +143 -143
  32. data/adapters/ruby/README.md +18 -18
  33. data/adapters/sequel/README.md +11 -11
  34. data/config/monitoring/prometheus-alerts.yml +39 -39
  35. data/config/production.yml +36 -36
  36. data/docs/README.md +75 -71
  37. data/docs/architecture/concurrency.md +14 -14
  38. data/docs/architecture/current-state.md +125 -125
  39. data/docs/architecture/execution-engine.md +25 -25
  40. data/docs/architecture/indexes.md +19 -19
  41. data/docs/architecture/mvcc.md +19 -19
  42. data/docs/architecture/overview.md +13 -13
  43. data/docs/architecture/pages.md +11 -11
  44. data/docs/architecture/production-roadmap.md +82 -82
  45. data/docs/architecture/query-planner.md +20 -20
  46. data/docs/architecture/recovery.md +18 -18
  47. data/docs/architecture/sql-engine.md +12 -12
  48. data/docs/architecture/storage-engine.md +14 -14
  49. data/docs/architecture/transactions.md +10 -10
  50. data/docs/architecture/wal.md +28 -28
  51. data/docs/cli-cheatsheet.md +98 -98
  52. data/docs/cli.md +275 -275
  53. data/docs/contributing/architecture.md +9 -9
  54. data/docs/contributing/benchmarking.md +14 -14
  55. data/docs/contributing/development.md +16 -16
  56. data/docs/contributing/release-process.md +49 -49
  57. data/docs/contributing/testing.md +16 -16
  58. data/docs/debugging.md +229 -229
  59. data/docs/developer/branching.md +10 -10
  60. data/docs/developer/database-diff.md +10 -10
  61. data/docs/developer/local-development.md +17 -17
  62. data/docs/developer/snapshots.md +9 -9
  63. data/docs/developer/temporal-data.md +10 -10
  64. data/docs/developer-guide.md +297 -297
  65. data/docs/getting-started/first-database.md +16 -16
  66. data/docs/getting-started/first-query.md +13 -13
  67. data/docs/getting-started/installation.md +19 -19
  68. data/docs/getting-started/local-to-production.md +300 -300
  69. data/docs/getting-started/quickstart.md +17 -17
  70. data/docs/getting-started/rails.md +16 -16
  71. data/docs/hardening_backlog.md +93 -93
  72. data/docs/lessons-learned.md +112 -112
  73. data/docs/operations/backups.md +33 -33
  74. data/docs/operations/disaster-recovery.md +31 -31
  75. data/docs/operations/failover.md +30 -30
  76. data/docs/operations/monitoring.md +25 -25
  77. data/docs/operations/production-guide.md +295 -295
  78. data/docs/operations/production-runbook.md +45 -45
  79. data/docs/operations/replication.md +33 -33
  80. data/docs/operations/restore.md +6 -6
  81. data/docs/operations/runbook.md +34 -34
  82. data/docs/operations/upgrades.md +14 -14
  83. data/docs/operations/workload-testing.md +17 -17
  84. data/docs/production-readiness.md +118 -118
  85. data/docs/production_validation.md +150 -150
  86. data/docs/rails/active-record.md +11 -11
  87. data/docs/rails/compatibility-guide.md +90 -90
  88. data/docs/rails/database-yml.md +92 -92
  89. data/docs/rails/installation.md +17 -17
  90. data/docs/rails/migrations.md +17 -17
  91. data/docs/rails/production.md +82 -82
  92. data/docs/rails/troubleshooting.md +18 -18
  93. data/docs/release.md +25 -25
  94. data/docs/server/architecture.md +10 -10
  95. data/docs/server/authentication.md +10 -10
  96. data/docs/server/configuration.md +16 -16
  97. data/docs/server/connection-pooling.md +10 -10
  98. data/docs/server/deployment.md +10 -10
  99. data/docs/server/protocol.md +12 -12
  100. data/docs/sql/compatibility-guide.md +82 -82
  101. data/docs/sql/compatibility.md +39 -39
  102. data/docs/sql/data-types.md +10 -10
  103. data/docs/sql/functions.md +9 -9
  104. data/docs/sql/joins.md +9 -9
  105. data/docs/sql/operators.md +9 -9
  106. data/docs/sql/sqlite-compatibility.md +21 -21
  107. data/docs/sql/syntax.md +10 -10
  108. data/docs/sql/transactions.md +10 -10
  109. data/docs/troubleshooting.md +244 -244
  110. data/lessons/01-foundations.md +73 -0
  111. data/lessons/02-local-development.md +121 -0
  112. data/lessons/03-embedded-rubydb.md +99 -0
  113. data/lessons/04-rails-complex-apps.md +138 -0
  114. data/lessons/05-rubydb-production-server.md +237 -0
  115. data/lessons/06-postgresql-massive-apps.md +96 -0
  116. data/lessons/07-hybrid-microservices.md +94 -0
  117. data/lessons/08-migrations-backups-recovery.md +86 -0
  118. data/lessons/09-observability-security-scale.md +87 -0
  119. data/lessons/10-release-readiness.md +125 -0
  120. data/lib/rubydb/backup/archive.rb +332 -334
  121. data/lib/rubydb/backup/backup.rb +400 -401
  122. data/lib/rubydb/backup/incremental.rb +349 -353
  123. data/lib/rubydb/backup/restore.rb +289 -290
  124. data/lib/rubydb/backup/snapshot.rb +265 -267
  125. data/lib/rubydb/backup/verification.rb +276 -279
  126. data/lib/rubydb/branching/branch.rb +181 -181
  127. data/lib/rubydb/branching/branch_manager.rb +307 -311
  128. data/lib/rubydb/branching/branch_metadata.rb +140 -140
  129. data/lib/rubydb/branching/checkout.rb +165 -166
  130. data/lib/rubydb/branching/copy_on_write.rb +272 -272
  131. data/lib/rubydb/branching/diff.rb +137 -138
  132. data/lib/rubydb/branching/merge.rb +282 -285
  133. data/lib/rubydb/build_info.rb +15 -15
  134. data/lib/rubydb/catalog/catalog.rb +391 -391
  135. data/lib/rubydb/catalog/column.rb +112 -112
  136. data/lib/rubydb/catalog/constraint.rb +180 -180
  137. data/lib/rubydb/catalog/database.rb +184 -184
  138. data/lib/rubydb/catalog/index.rb +97 -97
  139. data/lib/rubydb/catalog/schema.rb +103 -103
  140. data/lib/rubydb/catalog/sequence.rb +90 -90
  141. data/lib/rubydb/catalog/system_catalog.rb +698 -698
  142. data/lib/rubydb/catalog/table.rb +178 -178
  143. data/lib/rubydb/catalog/trigger.rb +102 -102
  144. data/lib/rubydb/catalog/view.rb +66 -66
  145. data/lib/rubydb/cli/application.rb +163 -163
  146. data/lib/rubydb/cli/commands/backup.rb +80 -81
  147. data/lib/rubydb/cli/commands/branch.rb +72 -72
  148. data/lib/rubydb/cli/commands/checkout.rb +54 -54
  149. data/lib/rubydb/cli/commands/create.rb +58 -58
  150. data/lib/rubydb/cli/commands/diff.rb +76 -77
  151. data/lib/rubydb/cli/commands/doctor.rb +74 -74
  152. data/lib/rubydb/cli/commands/drop.rb +57 -57
  153. data/lib/rubydb/cli/commands/init.rb +101 -102
  154. data/lib/rubydb/cli/commands/inspect.rb +95 -95
  155. data/lib/rubydb/cli/commands/merge.rb +63 -63
  156. data/lib/rubydb/cli/commands/migrate.rb +62 -62
  157. data/lib/rubydb/cli/commands/restart.rb +42 -39
  158. data/lib/rubydb/cli/commands/restore.rb +121 -121
  159. data/lib/rubydb/cli/commands/shell.rb +365 -365
  160. data/lib/rubydb/cli/commands/snapshot.rb +79 -79
  161. data/lib/rubydb/cli/commands/start.rb +88 -82
  162. data/lib/rubydb/cli/commands/status.rb +96 -92
  163. data/lib/rubydb/cli/commands/stop.rb +47 -47
  164. data/lib/rubydb/cli/commands/vacuum.rb +58 -58
  165. data/lib/rubydb/cli/formatter.rb +221 -221
  166. data/lib/rubydb/cli/output.rb +168 -168
  167. data/lib/rubydb/client/client.rb +302 -304
  168. data/lib/rubydb/client/connection.rb +414 -415
  169. data/lib/rubydb/client/connection_pool.rb +168 -168
  170. data/lib/rubydb/client/connection_url.rb +96 -96
  171. data/lib/rubydb/client/prepared_statement.rb +60 -60
  172. data/lib/rubydb/client/result.rb +123 -123
  173. data/lib/rubydb/client/statement.rb +52 -52
  174. data/lib/rubydb/client/transaction.rb +130 -130
  175. data/lib/rubydb/concurrency/concurrency.rb +19 -19
  176. data/lib/rubydb/concurrency/deadlock_detector.rb +148 -150
  177. data/lib/rubydb/concurrency/latch.rb +101 -101
  178. data/lib/rubydb/concurrency/lock_graph.rb +163 -165
  179. data/lib/rubydb/concurrency/mutex.rb +181 -183
  180. data/lib/rubydb/concurrency/rw_lock.rb +180 -180
  181. data/lib/rubydb/concurrency/scheduler.rb +248 -250
  182. data/lib/rubydb/concurrency/worker_pool.rb +145 -143
  183. data/lib/rubydb/configuration/config.rb +170 -170
  184. data/lib/rubydb/configuration/defaults.rb +179 -179
  185. data/lib/rubydb/configuration/environment.rb +152 -152
  186. data/lib/rubydb/configuration/parser.rb +185 -185
  187. data/lib/rubydb/configuration/validation.rb +221 -221
  188. data/lib/rubydb/constants.rb +74 -74
  189. data/lib/rubydb/constraints/check.rb +181 -181
  190. data/lib/rubydb/constraints/constraint.rb +101 -101
  191. data/lib/rubydb/constraints/foreign_key.rb +130 -130
  192. data/lib/rubydb/constraints/not_null.rb +64 -64
  193. data/lib/rubydb/constraints/primary_key.rb +99 -99
  194. data/lib/rubydb/constraints/unique.rb +106 -108
  195. data/lib/rubydb/constraints/validator.rb +349 -350
  196. data/lib/rubydb/errors/authentication_error.rb +10 -10
  197. data/lib/rubydb/errors/authorization_error.rb +23 -23
  198. data/lib/rubydb/errors/client_error.rb +10 -10
  199. data/lib/rubydb/errors/configuration_error.rb +10 -10
  200. data/lib/rubydb/errors/connection_error.rb +10 -10
  201. data/lib/rubydb/errors/constraint_error.rb +23 -23
  202. data/lib/rubydb/errors/corruption_error.rb +10 -10
  203. data/lib/rubydb/errors/database_error.rb +10 -10
  204. data/lib/rubydb/errors/error.rb +20 -20
  205. data/lib/rubydb/errors/execution_error.rb +10 -10
  206. data/lib/rubydb/errors/parser_error.rb +10 -10
  207. data/lib/rubydb/errors/recovery_error.rb +10 -10
  208. data/lib/rubydb/errors/replication_error.rb +10 -10
  209. data/lib/rubydb/errors/server_error.rb +6 -6
  210. data/lib/rubydb/errors/storage_error.rb +10 -10
  211. data/lib/rubydb/errors/transaction_error.rb +10 -10
  212. data/lib/rubydb/execution/aggregate_executor.rb +134 -138
  213. data/lib/rubydb/execution/delete_executor.rb +110 -112
  214. data/lib/rubydb/execution/distinct_executor.rb +131 -135
  215. data/lib/rubydb/execution/executor.rb +1182 -1188
  216. data/lib/rubydb/execution/expression.rb +191 -193
  217. data/lib/rubydb/execution/index_scan.rb +142 -142
  218. data/lib/rubydb/execution/insert_executor.rb +215 -217
  219. data/lib/rubydb/execution/join_executor.rb +243 -249
  220. data/lib/rubydb/execution/limit_executor.rb +83 -85
  221. data/lib/rubydb/execution/optimizer.rb +227 -215
  222. data/lib/rubydb/execution/plan.rb +355 -353
  223. data/lib/rubydb/execution/planner.rb +542 -536
  224. data/lib/rubydb/execution/predicate.rb +235 -235
  225. data/lib/rubydb/execution/scan.rb +49 -49
  226. data/lib/rubydb/execution/sequential_scan.rb +63 -63
  227. data/lib/rubydb/execution/sort_executor.rb +180 -185
  228. data/lib/rubydb/execution/update_executor.rb +160 -162
  229. data/lib/rubydb/functions/aggregate.rb +70 -70
  230. data/lib/rubydb/functions/date_functions.rb +274 -278
  231. data/lib/rubydb/functions/function.rb +85 -85
  232. data/lib/rubydb/functions/json_functions.rb +231 -215
  233. data/lib/rubydb/functions/numeric_functions.rb +346 -346
  234. data/lib/rubydb/functions/scalar.rb +52 -52
  235. data/lib/rubydb/functions/string_functions.rb +383 -383
  236. data/lib/rubydb/functions/system_functions.rb +258 -246
  237. data/lib/rubydb/history/as_of.rb +238 -238
  238. data/lib/rubydb/history/change.rb +105 -105
  239. data/lib/rubydb/history/history.rb +131 -131
  240. data/lib/rubydb/history/history_manager.rb +228 -229
  241. data/lib/rubydb/history/temporal_query.rb +202 -202
  242. data/lib/rubydb/history/timeline.rb +144 -144
  243. data/lib/rubydb/indexes/btree.rb +186 -186
  244. data/lib/rubydb/indexes/btree_cursor.rb +258 -258
  245. data/lib/rubydb/indexes/btree_node.rb +384 -385
  246. data/lib/rubydb/indexes/hash_index.rb +150 -150
  247. data/lib/rubydb/indexes/index.rb +71 -71
  248. data/lib/rubydb/indexes/index_manager.rb +408 -406
  249. data/lib/rubydb/indexes/index_scan.rb +466 -470
  250. data/lib/rubydb/migrations/migration.rb +253 -254
  251. data/lib/rubydb/migrations/migration_lock.rb +146 -146
  252. data/lib/rubydb/migrations/migration_manager.rb +187 -176
  253. data/lib/rubydb/migrations/migration_version.rb +71 -71
  254. data/lib/rubydb/migrations/schema_diff.rb +211 -211
  255. data/lib/rubydb/migrations/schema_version.rb +64 -64
  256. data/lib/rubydb/monitoring/events.rb +155 -160
  257. data/lib/rubydb/monitoring/health.rb +216 -222
  258. data/lib/rubydb/monitoring/logger.rb +188 -193
  259. data/lib/rubydb/monitoring/metrics.rb +363 -359
  260. data/lib/rubydb/monitoring/performance.rb +176 -176
  261. data/lib/rubydb/monitoring/statistics.rb +168 -170
  262. data/lib/rubydb/mvcc/garbage_collector.rb +199 -199
  263. data/lib/rubydb/mvcc/mvcc.rb +16 -16
  264. data/lib/rubydb/mvcc/snapshot.rb +146 -147
  265. data/lib/rubydb/mvcc/vacuum.rb +180 -180
  266. data/lib/rubydb/mvcc/version.rb +106 -106
  267. data/lib/rubydb/mvcc/version_store.rb +396 -398
  268. data/lib/rubydb/mvcc/visibility.rb +107 -109
  269. data/lib/rubydb/protocol/capabilities.rb +125 -125
  270. data/lib/rubydb/protocol/decoder.rb +142 -145
  271. data/lib/rubydb/protocol/encoder.rb +131 -136
  272. data/lib/rubydb/protocol/handshake.rb +306 -305
  273. data/lib/rubydb/protocol/message.rb +121 -121
  274. data/lib/rubydb/protocol/parameter_binder.rb +101 -0
  275. data/lib/rubydb/protocol/protocol.rb +276 -277
  276. data/lib/rubydb/protocol/version.rb +54 -54
  277. data/lib/rubydb/rails/adapter.rb +245 -239
  278. data/lib/rubydb/rails/connection.rb +312 -314
  279. data/lib/rubydb/rails/database_statements.rb +122 -122
  280. data/lib/rubydb/rails/migration.rb +131 -131
  281. data/lib/rubydb/rails/quoting.rb +109 -109
  282. data/lib/rubydb/rails/result.rb +117 -117
  283. data/lib/rubydb/rails/schema_statements.rb +339 -339
  284. data/lib/rubydb/rails/transaction.rb +105 -105
  285. data/lib/rubydb/rails/type.rb +126 -126
  286. data/lib/rubydb/recovery/checkpoint.rb +261 -257
  287. data/lib/rubydb/recovery/consistency.rb +457 -467
  288. data/lib/rubydb/recovery/corruption_detector.rb +5 -5
  289. data/lib/rubydb/recovery/crash_recovery.rb +381 -387
  290. data/lib/rubydb/recovery/recovery_manager.rb +204 -206
  291. data/lib/rubydb/recovery/redo.rb +235 -237
  292. data/lib/rubydb/recovery/undo.rb +204 -206
  293. data/lib/rubydb/replication/failover.rb +5 -5
  294. data/lib/rubydb/replication/fencing.rb +63 -63
  295. data/lib/rubydb/replication/primary.rb +461 -450
  296. data/lib/rubydb/replication/replica.rb +382 -384
  297. data/lib/rubydb/replication/replication_log.rb +194 -200
  298. data/lib/rubydb/replication/replication_manager.rb +307 -308
  299. data/lib/rubydb/replication/replication_slot.rb +293 -295
  300. data/lib/rubydb/replication/replication_stream.rb +198 -201
  301. data/lib/rubydb/rubydb.rb +564 -560
  302. data/lib/rubydb/security/access_control.rb +252 -254
  303. data/lib/rubydb/security/audit_log.rb +209 -213
  304. data/lib/rubydb/security/authentication.rb +302 -302
  305. data/lib/rubydb/security/authorization.rb +282 -282
  306. data/lib/rubydb/security/credentials.rb +192 -196
  307. data/lib/rubydb/security/password.rb +205 -215
  308. data/lib/rubydb/security/permissions.rb +74 -74
  309. data/lib/rubydb/security/role.rb +99 -101
  310. data/lib/rubydb/security/user.rb +86 -86
  311. data/lib/rubydb/server/connection.rb +383 -366
  312. data/lib/rubydb/server/connection_pool.rb +193 -193
  313. data/lib/rubydb/server/lifecycle.rb +227 -228
  314. data/lib/rubydb/server/listener.rb +139 -136
  315. data/lib/rubydb/server/request_handler.rb +277 -276
  316. data/lib/rubydb/server/server.rb +363 -364
  317. data/lib/rubydb/server/session.rb +371 -369
  318. data/lib/rubydb/server/worker.rb +206 -210
  319. data/lib/rubydb/server/worker_pool.rb +168 -168
  320. data/lib/rubydb/sql/ast/alter_table.rb +169 -169
  321. data/lib/rubydb/sql/ast/begin_transaction.rb +47 -47
  322. data/lib/rubydb/sql/ast/commit.rb +37 -37
  323. data/lib/rubydb/sql/ast/constraint.rb +92 -83
  324. data/lib/rubydb/sql/ast/create_database.rb +41 -41
  325. data/lib/rubydb/sql/ast/create_index.rb +61 -61
  326. data/lib/rubydb/sql/ast/create_schema.rb +52 -52
  327. data/lib/rubydb/sql/ast/create_table.rb +187 -187
  328. data/lib/rubydb/sql/ast/delete.rb +54 -54
  329. data/lib/rubydb/sql/ast/drop_database.rb +41 -41
  330. data/lib/rubydb/sql/ast/drop_index.rb +41 -41
  331. data/lib/rubydb/sql/ast/drop_schema.rb +49 -49
  332. data/lib/rubydb/sql/ast/drop_table.rb +49 -49
  333. data/lib/rubydb/sql/ast/explain.rb +64 -64
  334. data/lib/rubydb/sql/ast/expression.rb +617 -604
  335. data/lib/rubydb/sql/ast/insert.rb +66 -66
  336. data/lib/rubydb/sql/ast/node.rb +42 -42
  337. data/lib/rubydb/sql/ast/rollback.rb +63 -63
  338. data/lib/rubydb/sql/ast/savepoint.rb +59 -59
  339. data/lib/rubydb/sql/ast/select.rb +88 -88
  340. data/lib/rubydb/sql/ast/set_operation.rb +22 -20
  341. data/lib/rubydb/sql/ast/trigger.rb +35 -29
  342. data/lib/rubydb/sql/ast/update.rb +88 -88
  343. data/lib/rubydb/sql/ast/vacuum.rb +19 -19
  344. data/lib/rubydb/sql/ast/view.rb +38 -32
  345. data/lib/rubydb/sql/ast/with.rb +32 -32
  346. data/lib/rubydb/sql/grammar.rb +86 -86
  347. data/lib/rubydb/sql/keywords.rb +156 -156
  348. data/lib/rubydb/sql/lexer.rb +209 -214
  349. data/lib/rubydb/sql/operators.rb +100 -100
  350. data/lib/rubydb/sql/parser.rb +1167 -1170
  351. data/lib/rubydb/sql/planner/analyzer.rb +283 -302
  352. data/lib/rubydb/sql/planner/binder.rb +537 -550
  353. data/lib/rubydb/sql/planner/type_checker.rb +427 -431
  354. data/lib/rubydb/sql/token.rb +210 -210
  355. data/lib/rubydb/storage/buffer_frame.rb +44 -44
  356. data/lib/rubydb/storage/buffer_pool.rb +155 -155
  357. data/lib/rubydb/storage/database_lock.rb +74 -74
  358. data/lib/rubydb/storage/deserializer.rb +332 -342
  359. data/lib/rubydb/storage/engine.rb +2347 -2330
  360. data/lib/rubydb/storage/file_manager.rb +191 -187
  361. data/lib/rubydb/storage/free_space_map.rb +79 -81
  362. data/lib/rubydb/storage/page.rb +92 -94
  363. data/lib/rubydb/storage/page_allocator.rb +852 -855
  364. data/lib/rubydb/storage/page_header.rb +63 -67
  365. data/lib/rubydb/storage/page_manager.rb +127 -131
  366. data/lib/rubydb/storage/record.rb +58 -58
  367. data/lib/rubydb/storage/row.rb +78 -78
  368. data/lib/rubydb/storage/serializer.rb +51 -51
  369. data/lib/rubydb/storage/storage_layout.rb +151 -151
  370. data/lib/rubydb/storage/storage_manager.rb +114 -114
  371. data/lib/rubydb/storage/tuple.rb +458 -461
  372. data/lib/rubydb/storage/visibility_map.rb +964 -973
  373. data/lib/rubydb/transactions/commit_manager.rb +219 -220
  374. data/lib/rubydb/transactions/isolation.rb +98 -98
  375. data/lib/rubydb/transactions/lock.rb +76 -76
  376. data/lib/rubydb/transactions/lock_manager.rb +359 -362
  377. data/lib/rubydb/transactions/savepoint.rb +142 -143
  378. data/lib/rubydb/transactions/transaction.rb +214 -215
  379. data/lib/rubydb/transactions/transaction_id.rb +84 -84
  380. data/lib/rubydb/transactions/transaction_log.rb +256 -257
  381. data/lib/rubydb/transactions/transaction_manager.rb +434 -435
  382. data/lib/rubydb/types/bigint.rb +36 -36
  383. data/lib/rubydb/types/blob.rb +37 -37
  384. data/lib/rubydb/types/boolean.rb +34 -34
  385. data/lib/rubydb/types/date.rb +39 -39
  386. data/lib/rubydb/types/decimal.rb +48 -48
  387. data/lib/rubydb/types/float.rb +34 -34
  388. data/lib/rubydb/types/integer.rb +36 -36
  389. data/lib/rubydb/types/json.rb +41 -41
  390. data/lib/rubydb/types/null.rb +34 -34
  391. data/lib/rubydb/types/smallint.rb +36 -36
  392. data/lib/rubydb/types/text.rb +37 -37
  393. data/lib/rubydb/types/time.rb +46 -46
  394. data/lib/rubydb/types/timestamp.rb +39 -39
  395. data/lib/rubydb/types/type.rb +119 -119
  396. data/lib/rubydb/types/uuid.rb +47 -47
  397. data/lib/rubydb/types/varchar.rb +37 -37
  398. data/lib/rubydb/version.rb +32 -32
  399. data/lib/rubydb/wal/archive.rb +190 -193
  400. data/lib/rubydb/wal/checkpoint.rb +181 -183
  401. data/lib/rubydb/wal/lsn.rb +94 -94
  402. data/lib/rubydb/wal/reader.rb +259 -260
  403. data/lib/rubydb/wal/record.rb +105 -105
  404. data/lib/rubydb/wal/segment.rb +193 -193
  405. data/lib/rubydb/wal/wal.rb +480 -452
  406. data/lib/rubydb/wal/writer.rb +236 -236
  407. data/lib/rubydb.rb +7 -7
  408. data/packaging/docker/docker-compose.failover.yml +43 -43
  409. data/packaging/homebrew/rubydb.rb +19 -19
  410. data/rubydb.gemspec +60 -57
  411. data/scripts/benchmark +7 -7
  412. data/scripts/durability_drill +37 -37
  413. data/scripts/fuzz +63 -63
  414. data/scripts/release +45 -40
  415. data/scripts/release_check +43 -43
  416. data/scripts/replication_failover_drill +268 -250
  417. data/scripts/replication_network_failover_drill +287 -255
  418. data/scripts/restore_drill +45 -45
  419. data/scripts/security +45 -0
  420. metadata +54 -1
@@ -1,129 +1,129 @@
1
- # frozen_string_literal: true
2
-
3
- module RubyDB
4
- module Execution
5
- # Plan - Query execution plan
6
- class Plan
7
- attr_reader :type, :table_name, :columns, :projections, :predicate,
8
- :order_by, :group_by, :aggregates, :limit, :offset,
9
- :distinct, :having, :scan_type, :index, :estimated_cost,
10
- :estimated_rows, :joins, :source_reference
11
-
12
- def initialize(type, table_name = nil, columns = [])
13
- @type = type
14
- @table_name = table_name
15
- @columns = columns
16
- @projections = nil
17
- @predicate = nil
18
- @order_by = []
19
- @group_by = []
20
- @aggregates = []
21
- @limit = nil
22
- @offset = nil
23
- @distinct = false
24
- @having = nil
25
- @scan_type = :sequential
26
- @index = nil
27
- @estimated_cost = 0
28
- @estimated_rows = 0
29
- @joins = []
30
- @source_reference = nil
31
- end
32
-
33
- def set_projections(projections)
34
- @projections = projections
35
- self
36
- end
37
-
38
- def set_predicate(predicate)
39
- @predicate = predicate
40
- self
41
- end
42
-
43
- def set_order_by(order_by)
44
- @order_by = order_by
45
- self
46
- end
47
-
48
- def set_group_by(group_by, aggregates = [])
49
- @group_by = group_by
50
- @aggregates = aggregates
51
- self
52
- end
53
-
54
- def set_having(having)
55
- @having = having
56
- self
57
- end
58
-
59
- def set_limit(limit, offset = nil)
60
- @limit = limit
61
- @offset = offset if offset
62
- self
63
- end
64
-
65
- def set_distinct(distinct = true)
66
- @distinct = distinct
67
- self
68
- end
69
-
70
- def set_joins(joins)
71
- @joins = joins
72
- self
73
- end
74
-
75
- def set_source_reference(reference)
76
- @source_reference = reference
77
- self
78
- end
79
-
80
- def set_scan_type(scan_type, index = nil)
81
- @scan_type = scan_type
82
- @index = index
83
- self
84
- end
85
-
86
- def set_cost(estimated_cost, estimated_rows = nil)
87
- @estimated_cost = estimated_cost
88
- @estimated_rows = estimated_rows if estimated_rows
89
- self
90
- end
91
-
92
- def to_s
93
- "Plan(#{@type}) on #{@table_name}"
94
- end
95
-
96
- def inspect
97
- to_s
98
- end
99
-
100
- # Plan types
101
- class Select < Plan
102
- def initialize(table_name, columns = [])
103
- super(:select, table_name, columns)
104
- end
105
- end
106
-
107
- class SetOperation < Plan
108
- attr_reader :left_plan, :right_plan, :operator, :all
109
- def initialize(left_plan, right_plan, operator, all: false)
110
- super(:set_operation)
111
- @left_plan, @right_plan, @operator, @all = left_plan, right_plan, operator, all
112
- end
113
- end
114
-
115
- class With < Plan
116
- attr_reader :ctes, :query_plan, :recursive
117
-
118
- def initialize(ctes, query_plan, recursive: false)
119
- super(:with)
120
- @ctes = ctes
121
- @query_plan = query_plan
122
- @recursive = recursive
123
- end
124
- end
125
-
126
- class Insert < Plan
1
+ # frozen_string_literal: true
2
+
3
+ module RubyDB
4
+ module Execution
5
+ # Plan - Query execution plan
6
+ class Plan
7
+ attr_reader :type, :table_name, :columns, :projections, :predicate,
8
+ :order_by, :group_by, :aggregates, :limit, :offset,
9
+ :distinct, :having, :scan_type, :index, :estimated_cost,
10
+ :estimated_rows, :joins, :source_reference
11
+
12
+ def initialize(type, table_name = nil, columns = [])
13
+ @type = type
14
+ @table_name = table_name
15
+ @columns = columns
16
+ @projections = nil
17
+ @predicate = nil
18
+ @order_by = []
19
+ @group_by = []
20
+ @aggregates = []
21
+ @limit = nil
22
+ @offset = nil
23
+ @distinct = false
24
+ @having = nil
25
+ @scan_type = :sequential
26
+ @index = nil
27
+ @estimated_cost = 0
28
+ @estimated_rows = 0
29
+ @joins = []
30
+ @source_reference = nil
31
+ end
32
+
33
+ def set_projections(projections)
34
+ @projections = projections
35
+ self
36
+ end
37
+
38
+ def set_predicate(predicate)
39
+ @predicate = predicate
40
+ self
41
+ end
42
+
43
+ def set_order_by(order_by)
44
+ @order_by = order_by
45
+ self
46
+ end
47
+
48
+ def set_group_by(group_by, aggregates = [])
49
+ @group_by = group_by
50
+ @aggregates = aggregates
51
+ self
52
+ end
53
+
54
+ def set_having(having)
55
+ @having = having
56
+ self
57
+ end
58
+
59
+ def set_limit(limit, offset = nil)
60
+ @limit = limit
61
+ @offset = offset if offset
62
+ self
63
+ end
64
+
65
+ def set_distinct(distinct = true)
66
+ @distinct = distinct
67
+ self
68
+ end
69
+
70
+ def set_joins(joins)
71
+ @joins = joins
72
+ self
73
+ end
74
+
75
+ def set_source_reference(reference)
76
+ @source_reference = reference
77
+ self
78
+ end
79
+
80
+ def set_scan_type(scan_type, index = nil)
81
+ @scan_type = scan_type
82
+ @index = index
83
+ self
84
+ end
85
+
86
+ def set_cost(estimated_cost, estimated_rows = nil)
87
+ @estimated_cost = estimated_cost
88
+ @estimated_rows = estimated_rows if estimated_rows
89
+ self
90
+ end
91
+
92
+ def to_s
93
+ "Plan(#{@type}) on #{@table_name}"
94
+ end
95
+
96
+ def inspect
97
+ to_s
98
+ end
99
+
100
+ # Plan types
101
+ class Select < Plan
102
+ def initialize(table_name, columns = [])
103
+ super(:select, table_name, columns)
104
+ end
105
+ end
106
+
107
+ class SetOperation < Plan
108
+ attr_reader :left_plan, :right_plan, :operator, :all
109
+ def initialize(left_plan, right_plan, operator, all: false)
110
+ super(:set_operation)
111
+ @left_plan, @right_plan, @operator, @all = left_plan, right_plan, operator, all
112
+ end
113
+ end
114
+
115
+ class With < Plan
116
+ attr_reader :ctes, :query_plan, :recursive
117
+
118
+ def initialize(ctes, query_plan, recursive: false)
119
+ super(:with)
120
+ @ctes = ctes
121
+ @query_plan = query_plan
122
+ @recursive = recursive
123
+ end
124
+ end
125
+
126
+ class Insert < Plan
127
127
  attr_reader :values, :rows, :on_conflict, :default_values
128
128
 
129
129
  def initialize(table_name, columns = [], values = [], rows: nil, on_conflict: nil, default_values: false)
@@ -133,230 +133,232 @@ module RubyDB
133
133
  @on_conflict = on_conflict
134
134
  @default_values = default_values
135
135
  end
136
- end
137
-
138
- class Update < Plan
139
- attr_reader :assignments
140
-
141
- def initialize(table_name, assignments = [])
142
- super(:update, table_name)
143
- @assignments = assignments
144
- end
145
- end
146
-
147
- class Delete < Plan
148
- def initialize(table_name)
149
- super(:delete, table_name)
150
- end
151
- end
152
-
153
- class CreateTable < Plan
154
- attr_reader :options
155
-
156
- def initialize(table_name, columns = [], options = {})
157
- super(:create_table, table_name, columns)
158
- @options = options
159
- end
160
- end
161
-
162
- class DropTable < Plan
163
- attr_reader :options
164
-
165
- def initialize(table_name, options = {})
166
- super(:drop_table, table_name)
167
- @options = options
168
- end
169
- end
170
-
171
- class CreateDatabase < Plan
172
- attr_reader :options
173
- def initialize(name, options = {})
174
- super(:create_database)
175
- @database_name = name
176
- @options = options
177
- end
178
- def database_name = @database_name
179
- end
180
-
181
- class DropDatabase < Plan
182
- attr_reader :options
183
- def initialize(name, options = {})
184
- super(:drop_database)
185
- @database_name = name
186
- @options = options
187
- end
188
- def database_name = @database_name
189
- end
190
-
191
- class CreateSchema < Plan
192
- attr_reader :schema_name, :options
193
- def initialize(name, options = {})
194
- super(:create_schema)
195
- @schema_name = name
196
- @options = options
197
- end
198
- end
199
-
200
- class DropSchema < Plan
201
- attr_reader :schema_name, :options
202
- def initialize(name, options = {})
203
- super(:drop_schema)
204
- @schema_name = name
205
- @options = options
206
- end
207
- end
208
-
209
- class CreateView < Plan
210
- attr_reader :view_name, :query, :options
211
- def initialize(name, query, options = {})
212
- super(:create_view)
213
- @view_name = name
214
- @query = query
215
- @options = options
216
- end
217
- end
218
-
219
- class DropView < Plan
220
- attr_reader :view_name, :options
221
- def initialize(name, options = {})
222
- super(:drop_view)
223
- @view_name = name
224
- @options = options
225
- end
226
- end
227
-
228
- class CreateTrigger < Plan
229
- attr_reader :trigger_name, :timing, :event, :target_table, :function_name
230
- def initialize(name, timing, event, table, function_name)
231
- super(:create_trigger)
232
- @trigger_name, @timing, @event, @target_table, @function_name = name, timing, event, table, function_name
233
- end
234
- end
235
-
236
- class DropTrigger < Plan
237
- attr_reader :trigger_name, :options
238
- def initialize(name, options = {})
239
- super(:drop_trigger)
240
- @trigger_name, @options = name, options
241
- end
242
- end
243
-
244
- class Vacuum < Plan
245
- def initialize
246
- super(:vacuum)
247
- end
248
- end
249
-
250
- class AlterTableAddColumn < Plan
251
- attr_reader :column_name, :column_type, :options
252
-
253
- def initialize(table_name, column_name, column_type, options = {})
254
- super(:alter_table_add_column, table_name)
255
- @column_name = column_name
256
- @column_type = column_type
257
- @options = options
258
- end
259
- end
260
-
261
- class AlterTableDropColumn < Plan
262
- attr_reader :column_name
263
-
264
- def initialize(table_name, column_name)
265
- super(:alter_table_drop_column, table_name)
266
- @column_name = column_name
267
- end
268
- end
269
-
270
- class AlterTableAddConstraint < Plan
271
- attr_reader :constraint
272
- def initialize(table_name, constraint)
273
- super(:alter_table_add_constraint, table_name)
274
- @constraint = constraint
275
- end
276
- end
277
-
278
- class AlterTableDropConstraint < Plan
279
- attr_reader :constraint_name
280
- def initialize(table_name, constraint_name)
281
- super(:alter_table_drop_constraint, table_name)
282
- @constraint_name = constraint_name
283
- end
284
- end
285
-
286
- class CreateIndex < Plan
287
- attr_reader :index_name, :options
288
-
289
- def initialize(index_name, table_name, columns = [], options = {})
290
- super(:create_index, table_name, columns)
291
- @index_name = index_name
292
- @options = options
293
- end
294
- end
295
-
296
- class DropIndex < Plan
297
- attr_reader :index_name, :options
298
-
299
- def initialize(index_name, options = {})
300
- super(:drop_index)
301
- @index_name = index_name
302
- @options = options
303
- end
304
- end
305
-
306
- class BeginTransaction < Plan
307
- attr_reader :isolation_level
308
-
309
- def initialize(isolation_level = :read_committed)
310
- super(:begin_transaction)
311
- @isolation_level = isolation_level
312
- end
313
- end
314
-
315
- class Commit < Plan
316
- def initialize
317
- super(:commit)
318
- end
319
- end
320
-
321
- class Rollback < Plan
322
- def initialize
323
- super(:rollback)
324
- end
325
- end
326
-
327
- class Savepoint < Plan
328
- attr_reader :name
329
- def initialize(name)
330
- super(:savepoint)
331
- @name = name
332
- end
333
- end
334
-
335
- class RollbackToSavepoint < Plan
336
- attr_reader :name
337
- def initialize(name)
338
- super(:rollback_to_savepoint)
339
- @name = name
340
- end
341
- end
342
-
343
- class ReleaseSavepoint < Plan
344
- attr_reader :name
345
- def initialize(name)
346
- super(:release_savepoint)
347
- @name = name
348
- end
349
- end
350
-
351
- class Explain < Plan
352
- attr_reader :statement, :analyze
353
-
354
- def initialize(statement, analyze = false)
355
- super(:explain)
356
- @statement = statement
357
- @analyze = analyze
358
- end
359
- end
360
- end
361
- end
362
- end
136
+ end
137
+
138
+ class Update < Plan
139
+ attr_reader :assignments
140
+
141
+ def initialize(table_name, assignments = [])
142
+ super(:update, table_name)
143
+ @assignments = assignments
144
+ end
145
+ end
146
+
147
+ class Delete < Plan
148
+ def initialize(table_name)
149
+ super(:delete, table_name)
150
+ end
151
+ end
152
+
153
+ class CreateTable < Plan
154
+ attr_reader :options
155
+
156
+ def initialize(table_name, columns = [], options = {})
157
+ super(:create_table, table_name, columns)
158
+ @options = options
159
+ end
160
+ end
161
+
162
+ class DropTable < Plan
163
+ attr_reader :options
164
+
165
+ def initialize(table_name, options = {})
166
+ super(:drop_table, table_name)
167
+ @options = options
168
+ end
169
+ end
170
+
171
+ class CreateDatabase < Plan
172
+ attr_reader :options
173
+ def initialize(name, options = {})
174
+ super(:create_database)
175
+ @database_name = name
176
+ @options = options
177
+ end
178
+
179
+ attr_reader :database_name
180
+ end
181
+
182
+ class DropDatabase < Plan
183
+ attr_reader :options
184
+ def initialize(name, options = {})
185
+ super(:drop_database)
186
+ @database_name = name
187
+ @options = options
188
+ end
189
+
190
+ attr_reader :database_name
191
+ end
192
+
193
+ class CreateSchema < Plan
194
+ attr_reader :schema_name, :options
195
+ def initialize(name, options = {})
196
+ super(:create_schema)
197
+ @schema_name = name
198
+ @options = options
199
+ end
200
+ end
201
+
202
+ class DropSchema < Plan
203
+ attr_reader :schema_name, :options
204
+ def initialize(name, options = {})
205
+ super(:drop_schema)
206
+ @schema_name = name
207
+ @options = options
208
+ end
209
+ end
210
+
211
+ class CreateView < Plan
212
+ attr_reader :view_name, :query, :options
213
+ def initialize(name, query, options = {})
214
+ super(:create_view)
215
+ @view_name = name
216
+ @query = query
217
+ @options = options
218
+ end
219
+ end
220
+
221
+ class DropView < Plan
222
+ attr_reader :view_name, :options
223
+ def initialize(name, options = {})
224
+ super(:drop_view)
225
+ @view_name = name
226
+ @options = options
227
+ end
228
+ end
229
+
230
+ class CreateTrigger < Plan
231
+ attr_reader :trigger_name, :timing, :event, :target_table, :function_name
232
+ def initialize(name, timing, event, table, function_name)
233
+ super(:create_trigger)
234
+ @trigger_name, @timing, @event, @target_table, @function_name = name, timing, event, table, function_name
235
+ end
236
+ end
237
+
238
+ class DropTrigger < Plan
239
+ attr_reader :trigger_name, :options
240
+ def initialize(name, options = {})
241
+ super(:drop_trigger)
242
+ @trigger_name, @options = name, options
243
+ end
244
+ end
245
+
246
+ class Vacuum < Plan
247
+ def initialize
248
+ super(:vacuum)
249
+ end
250
+ end
251
+
252
+ class AlterTableAddColumn < Plan
253
+ attr_reader :column_name, :column_type, :options
254
+
255
+ def initialize(table_name, column_name, column_type, options = {})
256
+ super(:alter_table_add_column, table_name)
257
+ @column_name = column_name
258
+ @column_type = column_type
259
+ @options = options
260
+ end
261
+ end
262
+
263
+ class AlterTableDropColumn < Plan
264
+ attr_reader :column_name
265
+
266
+ def initialize(table_name, column_name)
267
+ super(:alter_table_drop_column, table_name)
268
+ @column_name = column_name
269
+ end
270
+ end
271
+
272
+ class AlterTableAddConstraint < Plan
273
+ attr_reader :constraint
274
+ def initialize(table_name, constraint)
275
+ super(:alter_table_add_constraint, table_name)
276
+ @constraint = constraint
277
+ end
278
+ end
279
+
280
+ class AlterTableDropConstraint < Plan
281
+ attr_reader :constraint_name
282
+ def initialize(table_name, constraint_name)
283
+ super(:alter_table_drop_constraint, table_name)
284
+ @constraint_name = constraint_name
285
+ end
286
+ end
287
+
288
+ class CreateIndex < Plan
289
+ attr_reader :index_name, :options
290
+
291
+ def initialize(index_name, table_name, columns = [], options = {})
292
+ super(:create_index, table_name, columns)
293
+ @index_name = index_name
294
+ @options = options
295
+ end
296
+ end
297
+
298
+ class DropIndex < Plan
299
+ attr_reader :index_name, :options
300
+
301
+ def initialize(index_name, options = {})
302
+ super(:drop_index)
303
+ @index_name = index_name
304
+ @options = options
305
+ end
306
+ end
307
+
308
+ class BeginTransaction < Plan
309
+ attr_reader :isolation_level
310
+
311
+ def initialize(isolation_level = :read_committed)
312
+ super(:begin_transaction)
313
+ @isolation_level = isolation_level
314
+ end
315
+ end
316
+
317
+ class Commit < Plan
318
+ def initialize
319
+ super(:commit)
320
+ end
321
+ end
322
+
323
+ class Rollback < Plan
324
+ def initialize
325
+ super(:rollback)
326
+ end
327
+ end
328
+
329
+ class Savepoint < Plan
330
+ attr_reader :name
331
+ def initialize(name)
332
+ super(:savepoint)
333
+ @name = name
334
+ end
335
+ end
336
+
337
+ class RollbackToSavepoint < Plan
338
+ attr_reader :name
339
+ def initialize(name)
340
+ super(:rollback_to_savepoint)
341
+ @name = name
342
+ end
343
+ end
344
+
345
+ class ReleaseSavepoint < Plan
346
+ attr_reader :name
347
+ def initialize(name)
348
+ super(:release_savepoint)
349
+ @name = name
350
+ end
351
+ end
352
+
353
+ class Explain < Plan
354
+ attr_reader :statement, :analyze
355
+
356
+ def initialize(statement, analyze = false)
357
+ super(:explain)
358
+ @statement = statement
359
+ @analyze = analyze
360
+ end
361
+ end
362
+ end
363
+ end
364
+ end