99 Commits

Author SHA1 Message Date
claude@clouddev1 dff78412dd docs(website): hint cast — press F1 mid-command for realism
ci / gate (push) Successful in 3m20s
website / deploy (push) Successful in 1m44s
The previous take pressed F1 after a complete command, which no one does.
Now the cast starts `add column `, pauses, presses F1 (Ctrl-G→[F1]) to recall
the syntax, then finishes the command from the example — the real reason you
reach for a hint. The `hint`-on-an-error half is unchanged.
2026-06-15 22:19:29 +00:00
claude@clouddev1 028d32420d docs(website): hint feature docs + cast (content for c84a640)
ci / gate (push) Successful in 2m59s
website / deploy (push) Successful in 1m43s
Completes the preceding empty-rename commit: the getting-help "Hints"
section — F1 for a tier-3 teaching hint on the live input, `hint` to
explain the most recent error — with the real rendered block and a cast
showing both (the live-input hint via the demo-mode Ctrl-G→[F1] alias,
since autocast can't send F1, then `hint` on an error). the-assistive-editor
points at F1; CtrlG added to the cast generator's key map.
2026-06-15 21:56:20 +00:00
claude@clouddev1 c84a640259 docs(website): document the hint feature with a cast (ADR-0053)
getting-help gains a "Hints" section — F1 for a tier-3 teaching hint on the
live input, `hint` to explain the most recent error — with the real rendered
block and a cast showing both: the live-input hint (via the demo-mode
Ctrl-G→[F1] alias, since autocast can't send F1) and `hint` on an error.
the-assistive-editor points at F1. Page converted to .mdx to embed the cast;
CtrlG added to the cast generator's key map.
2026-06-15 21:49:29 +00:00
claude@clouddev1 407408ec29 Merge branch 'main' into website 2026-06-15 21:44:22 +00:00
claude@clouddev1 4016c3e5cd feat(demo): Ctrl-G as a demo-mode F1 alias for casts (ADR-0047 Amendment 1)
ci / gate (push) Successful in 3m3s
The contextual hint overlay (ADR-0053) opens on F1, but F1 is an escape
sequence the autocast recorder can't emit — so casts (and presenter /
teacher sessions) couldn't trigger the most teaching-relevant overlay.

In demo mode only, Ctrl-G now aliases F1: it runs the same hint logic and
badges AS [F1], so a recording is visually identical to a real F1 press.
Ctrl-G is the only fit — Ctrl+digit (e.g. Ctrl-1) isn't encodable in a
legacy terminal (arrives as a bare `1`), and the kitty protocol that would
encode it needs escape sequences autocast can't send (and the app doesn't
enable keyboard-enhancement flags). Demo-gated, so the shipped keymap
stays F1-only; outside demo mode Ctrl-G is inert.

- app.rs: hint_key guard gains the demo-gated Ctrl-G disjunct;
  demo_badge_label maps Ctrl-G -> [F1]; 3 Tier-1 tests + badge assertion.
- ADR-0047 Amendment 1 + README index; also removed two stray
  </content> / </invoke> lines accidentally committed in the ADR file.

docs: drop three more stale "deferred" entries from CLAUDE.md — readline
shortcuts (I1b, ADR-0049), tab completion (I3), and syntax highlighting
(I4) are all implemented; only multi-line input (I1) remains open.
2026-06-15 21:30:37 +00:00
claude@clouddev1 1feb803aab chore(website): re-record all casts against the current app
pnpm casts refresh so every cast reflects the merged app — the
context/state-aware keybinding strip, the readline keys, year/choice-set
seeding, and the DDL-confirmation changes. The .cast files are
regenerable artifacts.
2026-06-15 20:59:49 +00:00
claude@clouddev1 93a40970c3 docs(website): landing — Wordmark replaces the plain title heading
Hide the splash hero's redundant <h1> (kept in the DOM for SEO/a11y,
landing-scoped via a title-only hero) and render the Wordmark + tagline +
buttons in the body, so the brand lockup sits where the heading was and
the content rises above the fold (it was nearly hidden on an iPad).
Styles in global.css; doc-page headings are unaffected.
2026-06-15 20:59:49 +00:00
claude@clouddev1 96b9581089 docs(website-adr): record website CI as implemented (ADR-website-001 §4)
The Gitea Actions → Cloudflare Pages pipeline shipped; update §4 from
"No CI yet" to the implemented workflow, the `relplay` project, the
branch→environment mapping, and the required secrets.
2026-06-15 20:59:49 +00:00
claude@clouddev1 b60c0bb0ec ci: skip the crate gate for website-only changes
ci / gate (push) Successful in 3m0s
Add website/** and the website workflow to ci.yaml's paths-ignore, so a
push confined to the website subproject (built + published by
website.yaml) no longer runs clippy+test. A push that also touches crate
code still gates (paths-ignore skips only when all files match).
2026-06-15 20:24:46 +00:00
claude@clouddev1 c2baf6923b ci(website): Cloudflare Pages deploy via Gitea Actions
ci / gate (push) Successful in 3m5s
website / deploy (push) Successful in 1m47s
New .gitea/workflows/website.yaml: on a push to main or website that
touches website/**, build the Astro site with pnpm and deploy
website/dist to the `relplay` Cloudflare Pages project via wrangler —
--branch selects production (main) vs preview (website). Runs on the
bare ci-public runner (node present; pnpm via corepack). Pin pnpm with
package.json's packageManager for deterministic corepack installs.

Requires repo Actions secrets CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID.
2026-06-15 20:04:48 +00:00
claude@clouddev1 1660a6a17c docs: handoff 72 — H2 hint corpus verified (4 fixes + parse guard)
ci / gate (push) Successful in 2m59s
2026-06-15 19:03:13 +00:00
claude@clouddev1 ea38e7a151 docs(website): update seed (year + choice-sets) and readline keys for the merge
build-ci-image / build (push) Successful in 11m19s
ci / gate (push) Successful in 3m8s
Seed page reflects #33/#34: year-as-int columns, built-in value sets
(priority/severity/rating), advisory now status-only; output blocks
re-captured and the seed cast re-recorded. Assistive-editor documents
the #29 readline shortcuts (Ctrl-A/E/W/K/U, Esc) and #30 cross-mode
history recall; multi-line stays the only planned item.
2026-06-15 18:59:50 +00:00
claude@clouddev1 5a37437055 fix(hint): correct H2 corpus errors + add parse guard (handoff-71)
Semantic verification pass over the tier-3 `hint` corpus (ADR-0053).
Four content errors corrected in src/friendly/strings/en-US.yaml:

- cmd.create_table: the example `with pk id(serial), name(text),
  email(text)` declares a 3-column COMPOUND primary key, not a PK
  plus regular columns (every `with pk` column is a key member,
  ADR-0005). Rewritten to a single-column PK + `add column` for the
  rest; what/concept aligned.
- cmd.save: `save as my-shop` does not parse — `save as` takes no
  inline name, it opens a path-entry prompt. Example -> `save as`;
  what no longer implies inline naming; added a temp-vs-named concept.
- cmd.import: target `shop-copy` does not parse — the `as <target>`
  slot is a NewName ident that rejects hyphens. -> `shop_copy`.
- err.foreign_key.child_side: dropped the bogus `on delete set
  null/cascade` remedy — that governs the parent direction; a
  child-side violation is fixed by inserting the parent first
  (matches the tier-1 hint).

Adds every_cmd_hint_example_parses_in_its_mode — a catalog-driven
guard that parses every hint.cmd.* example in its taught mode,
backstopping syntactic drift (it caught the save and import errors).
Registers the new hint.cmd.save.concept key.

docs: drop two stale "deferred" entries from CLAUDE.md — project
storage (export/import, --resume, input history, migration scaffold)
and m:n convenience (C4) are all implemented (ADR-0015/0045); record
the verification pass on requirements.md H2.
2026-06-15 18:59:38 +00:00
claude@clouddev1 3fe62af886 Merge branch 'main' into website 2026-06-15 17:22:46 +00:00
claude@clouddev1 b4441507e2 docs: handoff 71 — hint content needs a semantic verification pass
User smoke-test found hint.cmd.create_table is semantically wrong: the
example `create table Customers with pk id(serial), name(text),
email(text)` reads as a 3-column table but actually declares a compound
PK (id, name, email) — everything after `with pk` is the PK column list
(ADR-0005). Root cause: Phase C examples were syntax-checked but some
were extrapolated, not verified to *do* what what/concept claims. Handoff
specifies a full per-block semantic pass (run each example / check the
ADR) + a ready-to-apply create_table fix.
2026-06-15 17:14:22 +00:00
claude@clouddev1 8ae0eedd44 Merge branch 'ci'
ci / gate (push) Successful in 3m7s
release / test (push) Successful in 2m43s
release / build (aarch64-pc-windows-gnullvm) (push) Successful in 4m17s
release / build (aarch64-unknown-linux-musl) (push) Successful in 4m15s
release / build (x86_64-pc-windows-gnu) (push) Successful in 4m48s
release / build (x86_64-unknown-linux-musl) (push) Successful in 4m10s
2026-06-15 16:57:18 +00:00
claude@clouddev1 5f28de8ac3 docs(ci): move CI handoff into docs/ci/handoff (avoid main collision)
main independently wrote its own docs/handoff/20260615-handoff-70.md the
same day, so my global-sequence handoff-70 was an add/add conflict waiting
to merge. Relocate it to docs/ci/handoff/20260615-handoff-ci-01.md (its own
namespace, like docs/ci/adr) + a README index. main's handoff-70 is
untouched; the merge becomes conflict-free.
2026-06-15 16:56:50 +00:00
claude@clouddev1 888be16090 docs: handoff 70 — ADR-0052 follow-up + H2 hint shipped (ADR-0053)
ADR-0052 vestigial-source unwind; H2 contextual hint (F1 keybinding +
`hint` command) fully implemented Phases A–D, closing A1 + H2. 4 issues
filed (#35–#38, incl. 3 hint/help deferrals). CI branch merged into main
mid-session (D1 release work now on main). 2499 pass / 1 ignored, clippy
clean.
2026-06-15 16:47:18 +00:00
claude@clouddev1 329adfc935 fix(hint): labelled tier-3 block format + snapshot (ADR-0053 /runda)
Final /runda found the rendered block was three bare unlabelled lines,
deviating from the approved exemplar format. Fix:
- emit_tier3_block now renders a `Hint` heading + aligned `What:` /
  `Example:` / `Concept:` lines (hint.block.* labels); concept stays muted
- lock the format with an insta snapshot (hint_block_insert)
- amend ADR-0053 D2/D4 + exemplars: drop the `Next:` line (tier-2 ambient
  already owns live position-awareness — user-confirmed), align exemplars
  to the shipped format

2499 pass / 1 ignored, clippy clean.
2026-06-15 16:45:47 +00:00
claude@clouddev1 447112b17f feat(hint): H2 Phase D — coverage gate, F1 strip, status flips (ADR-0053)
Completes H2:
- comprehensiveness coverage tests: every REGISTRY command form has a
  hint_id resolving to a hint.cmd.* block, and every runtime error class
  resolves to a hint.err.* block (enforces ADR-0053 D6)
- ADR-0051 keybinding strip advertises F1 in the editing (leads) and
  default states; +shortcut.hint label; 12 full-panel snapshots
  re-accepted (status-bar line only)
- flip ADR-0053 -> implemented, requirements H2 + A1 -> [x], README

2498 pass / 1 ignored, clippy clean.
2026-06-15 16:34:10 +00:00
claude@clouddev1 984bc30256 docs: record CI branch work — D1/D2 done, TT5 partial, handoff 70
requirements.md: D1 (all six cross-platform binaries) and D2 (no-runtime-
deps, per-platform) done; D3 noted (binaries shipped, package managers
pending); TT5 partial (gate + macOS test live; Windows build-only; Tier-4
unwired). CLAUDE.md: add the CI/release decision (-> docs/ci/adr) + update
the deferred list. Adds handoff 70 summarising the pipeline + follow-ups
(incl. the versioning gap).
2026-06-15 16:31:58 +00:00
claude@clouddev1 417cbc8df9 docs(hint): defer pre-submit-diagnostic route + diagnostic.* blocks (ADR-0053)
Phase C scope decision: Diagnostic carries no class key, so the F1
diagnostic route would need a class field threaded through every
diagnostic site (broad change) for marginal value — tier-2 already
surfaces diagnostics and many duplicate the runtime error classes. Defer
the route + the ~33 diagnostic.* tier-3 blocks to issue #38. v1 ships
command-form hints + 9 runtime error-class hints (comprehensive for
those). Updates ADR-0053 D2/D6/Status/OOS + README.
2026-06-15 16:28:54 +00:00
claude@clouddev1 b6b98ad30f feat(hint): H2 Phase C batch 5 — runtime error-class tier-3 hints (ADR-0053)
what/example(fix recipe)/concept for the 9 runtime error classes:
foreign_key parent_side (child_side was the exemplar), unique, not_null,
check, type_mismatch, not_found, already_exists, generic, invalid_value.
Keyed by friendly::error_hint_class; catalogue + keys.rs registered.
+1 spot test; 2496 pass / 1 ignored, clippy clean.
2026-06-15 16:16:49 +00:00
claude@clouddev1 97970f2a2c feat(hint): H2 Phase C batch 4 — advanced-mode SQL tier-3 hints (ADR-0053)
Distinct SQL-syntax hints for the 11 advanced-mode forms: sql create
table / alter table / create index / drop index / drop table / insert /
update / delete, select, with, explain. hint_ids wired on all 11 nodes.

Hardened hint_key_for_input_in_mode for shared entry words: a bare
multi-form entry word defers to tier-2; when the second token isn't a
form word (insert into / update … set), it falls back to the
mode-primary key — so advanced mode resolves to the SQL form and simple
mode to the DSL form. catalogue + keys.rs registered. +2 spot tests +
grammar mode-disambiguation asserts; 2495 pass / 1 ignored, clippy clean.
2026-06-15 16:14:23 +00:00
claude@clouddev1 9c4d520d5c feat(hint): H2 Phase C batch 3 — DML tier-3 hints (ADR-0053)
Per-form hints for querying/changing data: update, delete, show
data/table/tables/relationships/indexes, seed, explain, replay
(insert was the Phase-B exemplar). hint_ids wired on UPDATE/DELETE/
SHOW/SEED/EXPLAIN/REPLAY; catalogue + keys.rs registered. +2 spot
tests (incl. multi-form SHOW disambiguation); 2493 pass / 1 ignored,
clippy clean.
2026-06-15 16:08:57 +00:00
claude@clouddev1 47a08166a4 merging ci branch
build-ci-image / build (push) Successful in 10m58s
ci / gate (push) Successful in 3m8s
2026-06-15 16:07:10 +00:00
claude@clouddev1 6429b56443 feat(hint): H2 Phase C batch 2 — DDL tier-3 hints (ADR-0053)
Per-form hints for the schema-shaping commands: create table, create
m:n, add column/index/constraint, drop table/column/relationship/
index/constraint, rename column, change column (add_relationship was
the Phase-B exemplar). Examples verified against the canonical usage
templates. hint_ids wired on CREATE/CREATE_M2N/DROP/RENAME/CHANGE;
catalogue + keys.rs registered. +2 spot tests (incl. multi-form DROP
disambiguation); 2491 pass / 1 ignored, clippy clean.
2026-06-15 16:05:41 +00:00
claude@clouddev1 4bdfce6250 feat(hint): H2 Phase C batch 1 — app-command tier-3 hints (ADR-0053)
Per-form hints for the 14 app-lifecycle commands (quit/help/hint/
rebuild/save/new/load/export/import/mode/messages/undo/redo/copy),
reference-leaning what/example with concept where it teaches (rebuild,
mode, messages, undo, export, help). hint_ids wired, catalogue + keys.rs
registered. +1 spot test; 2489 pass / 1 ignored, clippy clean.
2026-06-15 16:01:39 +00:00
claude@clouddev1 138e766817 Merge branch 'main' into ci
ci / gate (push) Successful in 3m5s
Bring main's latest (ADRs 0049-0053 + their features) onto the CI branch so
the gate runs against current main before CI lands on main. Clean merge —
ci and main touched disjoint files.
2026-06-15 16:01:09 +00:00
claude@clouddev1 aeb92f56a7 docs(ci): record macOS implementation in ADR-ci-003 (D1 complete)
ci / gate (push) Successful in 3m23s
macOS is no longer deferred — built natively on a Tart (Apple-Silicon)
runner (real hardware → licensed SDK, no grey area). Amendment documents
release-macos.yaml (dispatch-only, needs main), the libiconv de-nix +
ad-hoc re-sign, the runner-label `:host` backend nuance, generation-based
cache pruning, and D2-on-macOS (system libs only). All six D1 targets now
produce artifacts. Updates the deferred list + index entry.
2026-06-15 15:56:38 +00:00
claude@clouddev1 4a5fd1b5c1 feat(hint): H2 Phase B — per-form keying + the three exemplars (ADR-0053)
The first exemplar (`add 1:n relationship`) showed per-node keying is
too coarse for multi-form commands, so revise the mechanism to per-form.

- CommandNode `hint_id: Option<&str>` -> `hint_ids: &[&str]` (mirrors
  usage_ids); hint_key_for_input_in_mode reuses a factored-out
  pick_form_key (shared digit/m:n/suffix form disambiguation with
  usage_key_for_input_in_mode)
- wire INSERT + ADD (all four forms) with hint_ids
- author the three approved exemplars: hint.cmd.insert,
  hint.cmd.add_relationship, hint.err.foreign_key.child_side
  (what/example/concept) + keys.rs registration
- revise ADR-0053 D3 to per-form; record clause-concept hints as a
  deferred extension (issue #37); update README + plan
- +5 tests; 2488 pass / 1 ignored, clippy clean
2026-06-15 12:18:41 +00:00
claude@clouddev1 050b36391e feat(hint): H2 Phase A — hint command + F1 keybinding skeleton (ADR-0053)
The mechanism for the contextual hint, with tier-2 fallback; the
tier-3 corpus lands in later phases.

- new CommandNode `hint_id` field (all None for now)
- AppCommand::Hint + HINT grammar node + REGISTRY + dispatch
- F1 read-only overlay in handle_key (buffer/cursor/memo untouched)
- note_hint* renderers; hint_id_for_input_in_mode (shared selection
  helper refactored out of usage_keys_for_input_in_mode)
- last_error_hint_key + friendly::error_hint_class classifier
- catalogue: help.app.hint / parse.usage.hint / hint.getting_started
- +12 tests; 2483 pass / 1 ignored, clippy clean
2026-06-15 10:36:51 +00:00
claude@clouddev1 9868442889 docs(plan): H2 contextual hint implementation plan (ADR-0053)
Phased build plan: mechanism skeleton with tier-2 fallback first
(hint_id field, AppCommand::Hint, F1 read-only overlay, last_error_hint_key,
note_hint* renderer), then catalogue + the three approved exemplars,
then comprehensive content in batches, then polish. Reuses the existing
command_for_entry_word / usage_keys_for_input_in_mode lookups for
command identification. Test spine includes the comprehensiveness
coverage test that gates "comprehensive for v1".
2026-06-14 22:18:59 +00:00
claude@clouddev1 309d2e0b3f ci: release-macos workflow (dispatch); retire macOS smoke-test
The macOS release leg: workflow_dispatch (tag input) on the Tart runner —
test → build both *-apple-darwin targets → rewrite nix libiconv to /usr/lib
+ ad-hoc re-sign → upload binary + .sha256 to the tagged release (idempotent
create-or-get) → prune the nix store by generation. Composed entirely of
parts the smoke-test proved green, so the smoke-test is removed.

Dispatch-only fits the intermittent runner and keeps the 4-target Linux/
Windows release independent. Becomes triggerable once CI is on the default
branch (workflow_dispatch is default-branch-only in Gitea).
2026-06-14 22:18:02 +00:00
claude@clouddev1 e16ad50aa7 docs(adr): ADR-0053 — contextual hint command + F1 keybinding (H2)
Settles the `hint` slot ADR-0003 left pending; closes the last open
piece of A1. Two surfaces (F1 → live-input hint; `hint` command →
last-error expansion), no topic arg, and a new tier-3 teaching corpus
keyed on a new CommandNode `hint_id` so advanced-SQL forms get distinct
mode-correct content. Comprehensive content for v1, authored
exemplars-first. Refines ADR-0003; references ADR-0019/0021/0022/0049/
0051. Files #36 for the parallel help-side gap.
2026-06-14 22:14:11 +00:00
claude@clouddev1 60dbb903cc ci: macOS smoke-test — run tests + nix-store generation pruning
macos-build-test / build (push) Successful in 2m59s
ci / gate (push) Successful in 3m6s
- Add `cargo test` before the darwin builds (gate is Linux-only; the macOS
  leg is test-then-build) — a full dry-run of release-macos bar the upload.
- Add an `if: always()` prune step. The runner wipes the workspace each run,
  so cargo target/ never accumulates (no sweep). The persistent cache is the
  nix store: record the current toolchain in a persistent profile, keep the
  2 newest generations (nix-env --delete-generations +2), reclaim the rest
  (nix-collect-garbage). Pairs with min-free/max-free in the runner nix.conf.
2026-06-14 22:07:48 +00:00
claude@clouddev1 9a126782f1 ci: de-nix macOS binary libiconv via install_name_tool + re-sign
macos-build-test / build (push) Successful in 2m11s
build-ci-image / build (push) Successful in 9m49s
ci / gate (push) Successful in 2m50s
libiconv is the only /nix/store dep the darwin stdenv bakes in (everything
else is system frameworks + libSystem/libobjc). The smoke-test now rewrites
that load path to /usr/lib/libiconv.2.dylib (ABI-compatible, present on
every Mac), re-signs ad-hoc (install_name_tool breaks the sig; arm64
requires a valid one), then verifies no /nix/store paths remain, the
signature is valid, and the native binary launches. Flake comment updated
to reflect the propagated-libiconv reality.
2026-06-14 21:43:01 +00:00
claude@clouddev1 4d004f5847 ci: drop nix libiconv from darwin build (portable macOS binary)
macos-build-test / build (push) Failing after 1m36s
build-ci-image / build (push) Successful in 9m45s
ci / gate (push) Successful in 2m59s
The smoke-test caught the aarch64 binary linking a /nix/store libiconv.dylib
— non-portable (won't exist on a user's Mac). The Apple SDK already provides
a system libiconv stub, so removing pkgs.libiconv makes the linker resolve
-liconv to /usr/lib instead. The smoke-test now fails if any /nix/store dylib
is linked.
2026-06-14 21:36:08 +00:00
claude@clouddev1 d5fb47bcc8 ci: macOS build smoke-test + flake darwin support
macos-build-test / build (push) Successful in 3m52s
build-ci-image / build (push) Successful in 10m3s
ci / gate (push) Successful in 2m52s
Add the two *-apple-darwin targets to rust-toolchain.toml and apple-sdk +
libiconv to the flake devShell (darwin only) so the nix toolchain links
AppKit; make cargo-zigbuild/zig Linux-only (macOS builds natively). Repoint
the throwaway macOS workflow to actually build both darwin targets through
the flake on the Tart runner — the first real check of the macOS leg, which
can't be verified locally. Delete once release-macos lands.
2026-06-14 21:28:41 +00:00
claude@clouddev1 0878c6df19 ci: target the macOS runner by label name macos (not macos:host)
macos-probe / probe (push) Successful in 57s
ci / gate (push) Successful in 2m46s
In act_runner a label is `<name>:<backend>`; `:host` is the execution-
backend schema (run on host, no container), not part of the label. The
runner registered as `macos:host` therefore has the label `macos`, which
is what runs-on must reference.
2026-06-14 21:21:13 +00:00
claude@clouddev1 52815f1a76 ci: trigger macos-probe on push (workflow_dispatch needs default branch)
ci / gate (push) Successful in 2m48s
macos-probe / probe (push) Has been cancelled
Gitea only exposes workflow_dispatch for workflows on the default branch
(main); our CI is on `ci`, so the manual-run button/API isn't available.
Add a push trigger (filtered to the probe file) so we can drive the macOS
runner test from the ci branch. workflow_dispatch kept for post-merge.
2026-06-14 21:18:25 +00:00
claude@clouddev1 2721bd8d04 ci: macOS (Tart) runner probe — throwaway diagnostic
ci / gate (push) Successful in 3m1s
Manual-dispatch probe on runs-on macos:host to confirm the runner picks up
jobs and report arch / macOS version / Xcode SDK / toolchains (nix, rustup,
cargo) / git+node, before wiring the macOS release leg. Delete once done.
2026-06-14 21:11:28 +00:00
claude@clouddev1 e8fa859ab9 refactor(db): unwind vestigial worker source plumbing (ADR-0052 follow-up)
ADR-0052 moved success journaling out of the worker to the dispatch
layer, leaving the `source` that handlers threaded purely for the
worker's old history.log write dead. Remove it:

- drop `_source` from finalize_persistence and do_rebuild_from_text
- inline + delete the three read-only *_request wrappers
- drop the now-unused `source` param from the ~30 forwarding worker
  handlers (leaf + composite), compiler-guided
- remove the `source` field from the DescribeTable/QueryData/RunSelect
  requests and their DatabaseHandle methods (call sites updated)

The only worker `source` left is the snapshot/undo label
(snapshot_then / stage_pre_mutation / begin_batch). Purely mechanical,
no behaviour change. 2471 pass / 0 fail / 1 ignored, clippy clean.
2026-06-14 13:47:49 +00:00
claude@clouddev1 5869eec4f4 docs(ci): ADR-ci-003 — cross-platform release builds (D1 matrix)
Record the multi-platform build strategy as its own decision: cargo-zigbuild
for the four non-macOS targets, the static/standalone posture per platform,
the Windows synchronization stub, the test->build matrix workflow, and the
macOS deferral with its licensing rationale (the public CI image can't carry
the SDK). Shrinks the ci-001 amendment to a pointer; updates the index.

Runtime-verified by the user: Linux x86_64 + Windows aarch64 run correctly.
2026-06-13 19:11:29 +00:00
claude@clouddev1 298475b326 ci: D1 release matrix over the four non-macOS targets
build-ci-image / build (push) Successful in 9m56s
ci / gate (push) Successful in 2m47s
release / test (push) Successful in 2m18s
release / build (aarch64-pc-windows-gnullvm) (push) Successful in 3m31s
release / build (aarch64-unknown-linux-musl) (push) Successful in 3m52s
release / build (x86_64-pc-windows-gnu) (push) Successful in 4m14s
release / build (x86_64-unknown-linux-musl) (push) Successful in 3m25s
release.yaml becomes test (once, host) -> build (matrix) over the four
cargo-zigbuild targets; each matrix job uploads its binary + .sha256 to
the shared release (idempotent create-or-get). Records the expansion in
ADR-ci-001 (2026-06-13 amendment); macOS stays deferred.
2026-06-13 12:14:49 +00:00
claude@clouddev1 04ebd83f08 build: D1 cross-compile via cargo-zigbuild (4 non-macOS targets)
Replace the single-target musl cc with cargo-zigbuild + zig in the flake
devShell — one universal cross cc/linker (incl. rusqlite's bundled SQLite
C) for all four non-macOS D1 targets, added to rust-toolchain.toml:
  x86_64/aarch64-unknown-linux-musl              (static, D2)
  x86_64-pc-windows-gnu, aarch64-pc-windows-gnullvm  (standalone .exe)

Windows links -lsynchronization (std WaitOnAddress), which rust-overlay's
toolchain and zig's mingw don't ship; the symbols are forwarded by
kernel32, so an empty stub libsynchronization.a (ci/winstub/, wired via
.cargo/config.toml for the windows targets only) satisfies the linker.
Verified: all four build; linux static; windows valid PE32+.
2026-06-13 12:14:49 +00:00
claude@clouddev1 18d08642d7 ci: skip the gate for docs-only changes
ci / gate (push) Successful in 2m31s
Add paths-ignore (docs/**, **/*.md) to the gate's push + pull_request
triggers so markdown/docs-only changes don't run a full clippy+test that
can't change the outcome. Mixed code+docs pushes still gate (not all
files are ignored); flake/toolchain changes are deliberately not ignored.
Also refresh a stale ADR-0049 -> ADR-ci-002 comment reference.
2026-06-12 22:42:50 +00:00
claude@clouddev1 da8bfebc36 docs(ci): establish docs/ci/adr namespace (ci-001 pipeline, ci-002 flake)
ci / gate (push) Successful in 2m33s
Records the CI/release pipeline as ADR-ci-001 and relocates the nix-flake
ADR from main's ADR-0049 to ADR-ci-002 (content unchanged, history note
added). Both live in docs/ci/adr/ with a README index — a dated,
ci-segmented namespace disjoint from main's integer ADR sequence, the
same split the website subproject uses to avoid cross-branch number
collisions. Drops the ADR-0049 entry from docs/adr/README.

ci-001 covers the runner model, the baked nix CI image, the clippy+test
gate, the static-musl release on tag, trigger hygiene, auth, and scope.
2026-06-12 22:38:34 +00:00
claude@clouddev1 89b9392c25 ci: release job — test before publish, pin bash, fix diagnostic
release / release (push) Successful in 3m59s
build-ci-image / build (push) Successful in 7m27s
ci / gate (push) Successful in 2m27s
- Run cargo test before the build so a tag never publishes untested code.
- Pin shell: bash on the scripted steps; the runner defaults to dash,
  which rejected `set -o pipefail` and failed run 22's package step.
- Swap `file` (absent in the slim image) for `ls -l`.
2026-06-12 22:11:24 +00:00
claude@clouddev1 bba24120f1 ci: scope gate + image-build to branch pushes (skip tags)
Tag pushes ignore paths: filters, so a release tag spuriously rebuilt
the unchanged CI image and re-ran the gate on a commit the branch push
already gated. Add branches: ['**'] to both push triggers — tag pushes
no longer fire them (release.yaml owns tags). Pushing commits + a tag
together still gates the commits via the branch push.
2026-06-12 22:11:24 +00:00
claude@clouddev1 88145225cc ci: release workflow — static binary to Gitea releases on tag
build-ci-image / build (push) Has been cancelled
ci / gate (push) Successful in 2m32s
release / release (push) Failing after 3m2s
On a v* tag, builds the x86_64-unknown-linux-musl binary in the CI image
and publishes it (+ .sha256) to a Gitea release via the API and the
auto GITEA_TOKEN. x86_64 Linux only for now; rest of the D1 matrix and
D3 packaging layer on later. Correctness comes from the branch gate.
2026-06-12 21:43:23 +00:00
claude@clouddev1 8e3208528e build: static musl release build capability
rust-toolchain.toml gains the x86_64-unknown-linux-musl target; the
flake devShell gains a musl cc (pkgsCross.musl64) + CC/linker env so a
`cargo build --target …-musl` compiles rusqlite's bundled SQLite C and
links fully static (D2: single static binary, no runtime deps). Cargo
release profile strips symbols (13MB -> 10MB). Verified locally: the
musl binary is static-pie, statically linked, stripped, runs standalone.
2026-06-12 21:43:23 +00:00
claude@clouddev1 9d8161218a ci: gate workflow + CI-image build/push, drop probe
build-ci-image / build (push) Successful in 6m18s
ci / gate (push) Successful in 3m19s
- build-ci-image.yaml: builds .gitea/ci-image/Dockerfile via DinD and
  pushes git.lazyeval.net/oli/rdbms-playground-ci:latest (REGISTRY_*
  secrets); triggers on image-input changes + manual dispatch.
- ci.yaml: the gate — runs inside that image, clippy -D warnings +
  cargo test, on push/PR. fmt intentionally not gated (ADR-0049).

Removes ci-probe.yaml; it answered the runner questions (jobs run in
containers, host nix unreachable, custom container: works).
2026-06-12 21:08:04 +00:00
claude@clouddev1 dc63ed66f1 ci: nix CI toolchain image (node-slim base + warmed flake)
Job-container image the gate runs in. node:22-bookworm-slim satisfies
the act_runner contract (sleep/bash/node) far more cheaply than the
catthehacker images; single-user nix installed on top (pre-create /nix
+ empty build-users-group so it installs as root in a container) with
the flake's devShell pre-warmed — CI enters a ready 1.95.0 toolchain in
~1.4s. Verified by local build. ~5.5GB (rust toolchain closure); dep/
target caching is a noted follow-up.
2026-06-12 21:08:04 +00:00
claude@clouddev1 c7ac0c9877 ci: add throwaway runner-probe workflow
ci-probe / host (push) Failing after 54s
ci-probe / nix-container (push) Failing after 1m12s
Diagnostic to determine how the ci-public runner executes jobs and
where the nix toolchain is reachable (host vs default container vs a
custom container:), so the real gate is built on facts. Delete once
the gate lands.
2026-06-12 20:35:39 +00:00
claude@clouddev1 9189740028 build(nix): reproducible dev + build env via a flake (ADR-0049)
Root flake with two outputs: devShells.default (pinned 1.95.0
toolchain via rust-toolchain.toml + rust-overlay, plus cargo-sweep)
and packages.default (rustPlatform.buildRustPackage from the committed
Cargo.lock; doCheck=false). flake.lock pins nixpkgs nixos-26.05 /
rust-overlay / flake-utils. .envrc (use flake) for direnv parity.

Single source of toolchain for dev and the upcoming CI, so they can't
drift. Verified through the flake: nix build yields a working binary,
clippy clean, 2424 tests pass / 0 fail / 1 intentional ignored doctest.
First step toward requirements.md TT5 + D1/D2/D3.
2026-06-12 20:35:39 +00:00
claude@clouddev1 77c55fa669 docs(website): document the seed command, with cast (ADR-0048)
New Reference page "Generating sample data" (captured output + a
two-table seed cast showing generation, FK sampling context, and a
`set` override); cross-links from inserting-and-editing-data and
columns; seed added to the rdbms highlight grammar;
querying/sql-queries renumbered. Cast stance in STYLE.md revised to
"justify the absence". Refs #33, #34.
2026-06-12 14:41:37 +00:00
claude@clouddev1 4691d7950a Merge branch 'main' into website 2026-06-12 13:22:52 +00:00
claude@clouddev1 069f9277d1 fix(website): landing card links + keep inline code from breaking mid-token
- Add a teal 'more' link pinned to each landing feature card's
  bottom-right, pointing at the relevant doc page (modes, the SQL echo,
  undo & history, query plans, the assistive editor).
- Stop short inline code (flags like --all-rows) from breaking after a
  hyphen: white-space:nowrap on inline code only; block code in <pre>
  is unaffected and still wraps/scrolls.
2026-06-11 19:24:21 +00:00
claude@clouddev1 09b64cbfb7 feat(website): Open Graph social card
Add a 1200x630 social card (dark bg, monospace, teal database-table
motif, the relplay/RDBMS reveal) shown when pages are shared. Source
SVG in src/assets/og-card.svg, rasterised to public/og-card.png with
sharp. Wire site-wide og:image + twitter summary_large_image tags via
Starlight head, with the absolute relplay.org URL.
2026-06-11 18:59:02 +00:00
claude@clouddev1 abd3739168 feat(website): brand layer — teal palette, table logo, wordmark, footer
Anchor the site to the product's identity (Phase B branding):
- Accent palette mapped to the app's in-TUI teal (--sl-color-accent-*,
  light + dark); trim the splash hero's oversized desktop bottom padding.
- Header logo: a database-table glyph with a teal primary-key cell
  (light/dark variants); favicon redrawn to match.
- Landing wordmark 'RELational PLAYground': teal picks out REL+PLAY
  ('relplay', the domain) and R/D/B/M/S (spelling out RDBMS). Sizes
  locked in em off one master scale so the lockup zooms as a rigid unit.
- Footer override: default footer + an understated company (Lazy
  Evaluation Ltd) and source/issues line.

No engine names or 'DSL' in user-facing copy.
2026-06-11 18:50:07 +00:00
claude@clouddev1 a72d53de51 docs(website-adr): hosting target Vercel -> Cloudflare via Gitea Actions
Record the deployment decision (2026-06-11): static build deploys to
Cloudflare (Workers static assets or Pages; no Astro adapter needed),
driven by a planned Gitea Actions pipeline. Update the ADR-website-001
index entry to match.
2026-06-11 15:37:11 +00:00
claude@clouddev1 6777216e37 feat(website): set production site URL (relplay.org); record Phase B decisions
Set Starlight `site` to https://relplay.org (apex) — enables the
sitemap, canonical URLs, and Open Graph URL resolution; clears the
sitemap build warning. Record the resolved STYLE.md decisions:
single-version launch, fixed-dark cast theme (casts bake RGB colours,
so light/dark would need dual-theme recordings), and the site origin.
2026-06-11 15:36:29 +00:00
claude@clouddev1 13c9c1bcd9 feat(website): add payoff captions to joins/relationship-diagram/sql-echo
Use the ADR-0047 Ctrl+]-delimited demo caption to narrate the payoff
moment of three casts with a neutral one-liner (no key names): the join
result, the relationship diagram, and the m:n junction expansion. Add a
`caption` step kind to the cast generator. Captions show at the climax
during playback and clear as the cast quits.
2026-06-11 13:54:42 +00:00
claude@clouddev1 946dd88db6 feat(website): pace modes/undo-redo/joins casts (split submits, surface state)
Split the short pivotal commands from their submit so they read before
the screen changes (`mode advanced` in modes/joins; `undo`/`redo` before
their confirm modals), and surface the source tables in joins with
`show data` before the join, since the schema sidebar is hidden at 90 cols.
2026-06-11 13:49:40 +00:00
claude@clouddev1 ad43cce945 fix(website): connect box-art in plaintext output blocks
Tighten line-height (1.75 -> 1.2) on plaintext code blocks only, so the
box-drawing in rendered output (tables, query results, plan trees)
connects vertically as it does in the app. Command blocks keep the
looser spacing.
2026-06-11 13:35:29 +00:00
claude@clouddev1 7099bd3cde docs(website): expand the SQL-echo section; prune over-promised notes
Rewrite "Seeing the SQL behind a command" with the learning framing,
a grounded ALTER TABLE example, and the sql-echo cast. Drop the
"multiple result tabs" promise (won't-do on main) and the planned
`hint`-command note (superseded by the hint panel).
2026-06-11 13:28:37 +00:00
claude@clouddev1 5908891d6b feat(website): sql-echo cast — the DSL→SQL teaching echo demo
Advanced-mode cast running simple commands (create table, add column),
culminating in `create m:n relationship` expanding to a full junction
table, each tagged `Executing SQL:`. Recorded at height 34 so the long
m:n echo + junction structure stay fully on screen. Verified against
real app output.
2026-06-11 13:28:37 +00:00
claude@clouddev1 6778c338d4 docs(website): document m:n, --demo, schema sidebar, responsive input
Document the features the main merge shipped: `create m:n relationship`
(relationships ref + build-the-library note), the `--demo` teaching
flag (command-line-options), the Ctrl-O schema sidebar (output-pane,
now .mdx to embed the new cast), and horizontal/two-row input
(assistive-editor).
2026-06-11 12:26:31 +00:00
claude@clouddev1 823b413ca3 feat(website): schema-sidebar cast + Ctrl-O/Esc cast keys
Add a `schema-sidebar` cast that reveals the ADR-0046 sidebar with
Ctrl-O (the only way to show it at 90 cols) and steps through the
Tables and Relationships panels. Teach the generator the CtrlO/Esc
control codes; quote control codes so `^[`/`^]` stay valid YAML.
2026-06-11 12:26:25 +00:00
claude@clouddev1 a0dd202f67 feat(website): pace the projects cast + show table state; record cast guidelines
Projects cast review fixes:
- Pace the confirms: `save as` name and `new` now type, pause, then Enter as
  separate steps, so the viewer can read them before they execute.
- Insert `show tables` at each phase (before save / after `new` / after load),
  since the schema sidebar is hidden at 90 cols (ADR-0046) — the sequence now
  reads "books -> no tables -> books" so the round-trip is followable.

STYLE.md: new "Cast pacing & clarity" guidelines (beat-before-submit; surface
state where the sidebar would). Handoff item 2: chase these up across the
existing casts.
2026-06-11 10:56:46 +00:00
claude@clouddev1 595386e370 docs: note caption-banner review for existing casts in the handoff
Expand next-work item 2: review whether neutral step-caption banners (the demo
overlay) would improve the existing casts — narrating phases or calling out the
relationship diagram / teaching echo — cast-by-cast, with the no-naming-keys
constraint.
2026-06-11 10:43:38 +00:00
claude@clouddev1 51a29e5069 docs: website-branch session handoff (website-2)
Captures everything since website-1: the ADR-namespace move, all Reference +
Guides + the new SQL queries page, the cast pipeline + 7 casts (incl. the new
projects cast via #24 vi-nav), --demo on all casts (#22), and the main merge
(m:n/ADR-0045, UI sidebar+responsive input/ADR-0046, demo overlays/ADR-0047,
logging, FK fixes).

Flags the next-session work: document the merge's new features (m:n command,
--demo flag, ADR-0046 UI) which are not yet in the docs; the no-advertising
constraint (vi keys / Ctrl+] secret); cast tooling limits (no arrow keys);
the capture-harness recipe; Phase B; and open STYLE decisions.
2026-06-11 10:19:22 +00:00
claude@clouddev1 e782a280cc feat(website): projects cast (vi-nav load picker) + --demo on all casts
- New projects cast: create → save as library → new (fresh) → load → navigate
  the picker to the saved project (j, now possible via #24 vi-nav) → Enter
  loads it, the table is restored. Runs under an isolated --data-dir so the
  picker lists only this cast's projects.
- Turn on the demonstration overlay (--demo, #22 / ADR-0047) for ALL casts,
  for a consistent viewer experience: special keys show a badge — e.g.
  [ENTER], and [TAB] at the assistive-editor's completion moment, finally
  making that keystroke visible. Plain j/k navigation stays unbadged, so the
  picker navigation is not surfaced.
- Generator: per-cast `dataDir` (isolated data root) + default-on `--demo`
  (opt out with demo:false). All 7 casts regenerated.

Convert projects.md → .mdx and embed. Build clean (26 pages). Visual playback
of all casts pending a tunnel check.
2026-06-11 10:17:04 +00:00
claude@clouddev1 927e6b2d50 Merge branch 'main' into website (m:n, logging, UI nav, demo overlays, vi-nav)
Brings a large batch of app work onto the website branch so the docs (and
casts) can reflect it:

- #24 vi-style j/k/g/G navigation in the load picker (ADR-0047 era) — unblocks
  a scriptable projects cast (autocast can send j/k; not arrows)
- #22 demonstration overlay layer (ADR-0047): `--demo` mode, keystroke badges,
  and step-caption info banners — usable from casts to highlight key moments
- C4 m:n convenience command (ADR-0045): `add m:n relationship … via <junction>`
- ADR-0046 UI: width-derived schema sidebar + Ctrl-O nav mode, responsive
  two-row input + horizontal scroll, geometry-fixed hint panel
- X1 comprehensive logging sweep across worker/parser/app/persistence/runtime
- FK fixes: compound-FK violation message names every column pair; inline FK
  referencing a compound PK points at the table-level form

Merged clean — no conflicts (the docs/website/ ADR namespace split kept the new
main ADRs 0045–0047 from colliding). Tests on the merged tree: 2290 passed,
0 failed (1 ignored doctest, inherited from main).
2026-06-11 10:06:18 +00:00
claude@clouddev1 52860c3267 feat(website): casts for first-project/modes/undo-redo; quit invisibly via Ctrl-C
Three more casts on "doing" pages:
- first-project reuses the quickstart cast (the create→insert→show tour)
- modes (new): a simple command, then `mode advanced` where the same command
  also prints "Executing SQL: …" (the teaching echo — "learn the SQL underneath")
- undo-redo (new): insert two rows, `undo` (Y-confirm modal) backs one out,
  `redo` restores it

Also fix the cast endings (review feedback): scripts ended by typing a `quit`
command, which — once the trim drops the shell exit — left a dangling "quit" in
frame with no payoff. End every cast with Ctrl-C instead (the app's quit key,
KeyCode::Char('c')+CTRL): it types nothing, so the cast ends cleanly on the
last content frame. Generator gains a `CtrlC` key; all six casts regenerated.

Convert the three pages to .mdx and embed. Build clean (26 pages); 6 casts.
2026-06-10 16:36:07 +00:00
claude@clouddev1 ce153bde4c docs(website): add SQL queries reference page (advanced query surface)
New dedicated Reference page for the advanced-mode SQL query features
under-covered by "Querying & inspecting": DISTINCT, GROUP BY/HAVING, set
operations (UNION/INTERSECT/EXCEPT), subqueries (IN + correlated NOT EXISTS),
CTEs (WITH), and expressions (CASE/CAST/functions) — each with a worked example
on the library schema and real captured output. Adds an explicit "supported
subset" boundary note (views, triggers, transactions, window functions,
multi-statement batches are not available) rather than linking to general SQL,
which would advertise unsupported features. Grounded in ADR-0030 §3/§13 and the
SQL grammar tests.

Cross-link added from Querying & inspecting. Build clean (26 pages);
box-drawing output verified; forbidden terms clean.
2026-06-10 15:31:05 +00:00
claude@clouddev1 302329d5b2 docs(website): record the cast-placement policy in STYLE.md
"A cast wherever the app does something": broad on Getting-started /
Using-the-playground / Guides + the landing; selective on Reference (motion
beats the still, static output kept regardless); skip pure-lookup/conceptual.
Casts are selective (a representative slice, not every command); autoplay only
the landing; all re-record via `pnpm casts`.
2026-06-10 14:32:48 +00:00
claude@clouddev1 65a48fa5ae feat(website): joins cast on the querying-with-joins guide
Fourth cast: build a minimal two-table schema with rows, switch to advanced
mode (`mode advanced`), and run a join pairing each book with its author —
shows the mode switch + SQL + multi-table result, motion that complements the
guide's static examples. Convert the guide to .mdx and embed above the intro.

Recorded via `pnpm casts`; build clean (25 pages).
2026-06-10 14:26:27 +00:00
claude@clouddev1 bb7887ea82 feat(website): relationship-diagram cast on the relationships page
Third earmarked cast: declare a 1:n relationship, then `show relationship`
draws the two-table connector diagram — showcases the V1 relationship
visualization with motion a still block can't. Convert the relationships
reference page to .mdx and embed it above the syntax (the static diagrams
below remain the exact reference).

Recorded via `pnpm casts`; build clean (25 pages).
2026-06-10 14:13:14 +00:00
claude@clouddev1 a8f84c9d17 feat(website): refine casts — trim shell, autoplay+loop landing, cap size
Address cast review feedback:

- Trim every cast to the in-app region (generate.mjs): the recording now
  starts with the app already running and ends on the last in-app frame —
  drops the `$ rdbms-playground` launch and the return-to-shell frame (the
  latter was the stray cursor-under-$ artifact). Opt out per cast with
  `keepShell: true` for demos that document the CLI launch.
- Landing quickstart cast: autoPlay + loop, with a 2.5s hold on the final
  frame so it pauses before restarting.
- Cap the demo at max-width 46rem and centre it, so the player (fit:'width')
  no longer scales its font up to the full splash column.

Casts re-recorded via `pnpm casts`. Build clean (25 pages).

Tab-keypress visibility deferred to an in-app overlay primitive (filed as
issue #22 — also serves the planned guided-lesson system); the cast notes
Tab in its caption for now.
2026-06-10 13:56:39 +00:00
claude@clouddev1 1f82fb2c79 chore(website): upgrade astro 6.4.5 + starlight 0.40.0 (clears markdown deprecation)
Astro 6.4.5 deprecated markdown.remarkPlugins/rehypePlugins/remarkRehype in
favour of the new unified() API. The warning came from @astrojs/starlight
0.39.3's own integration code, not our config; Starlight 0.40.0 adopts the new
API, so it's gone.

- astro 6.4.4 -> 6.4.5; @astrojs/starlight 0.39.3 -> 0.40.0
  (brings astro-expressive-code 0.43.1, @astrojs/markdown-remark 7.2.0)
- Starlight 0.40.0 adds an optional @astrojs/markdown-satteri peer (an opt-in
  high-performance markdown engine); it's an optional peer so pnpm doesn't
  install it, and we have no need for it — we stay on the default
  markdown-remark/unified pipeline

Verified: deprecation gone; pnpm build clean (25 pages); rendering signals
unchanged vs baseline (highlighting, > prompt + copy-button :has() CSS, asides,
embedded casts); pnpm audit clean.
2026-06-10 13:17:49 +00:00
claude@clouddev1 44f91724b6 feat(website): assistive-editor cast content (completes c904dbb)
The previous commit captured only the .md→.mdx rename — a botched `git add`
(a stale .md pathspec aborted the whole add) dropped the actual content. This
adds it:

- casts.mjs: the assistive-editor cast definition (Tab completion → the [ERR]
  validity indicator catching a misspelled table → friendly error → corrected
  command). Behavior verified by a throwaway spike before scripting.
- public/casts/assistive-editor.cast (generated via `pnpm casts`)
- embed the cast under the intro on the assistive-editor page

Verified: pnpm build clean (25 pages); cast bundled, served, and referenced.
Visual playback check pending (verify via dev server/tunnel).
2026-06-10 13:05:04 +00:00
claude@clouddev1 c904dbb68b feat(website): assistive-editor cast (completion + [ERR] indicator)
Add a second demo, earmarked as prime cast material: Tab completes a table
name, then the [ERR] validity indicator catches a misspelled table before
submit, the friendly error confirms it, and the corrected command runs.
Behavior verified by a throwaway spike before scripting.

- casts.mjs: assistive-editor cast definition
- public/casts/assistive-editor.cast (generated)
- convert the-assistive-editor.md -> .mdx and embed the cast under the intro

Verified: pnpm build clean (25 pages); cast bundled, served, and referenced
on the page. Visual playback check pending (verify via dev server/tunnel).
2026-06-10 13:04:31 +00:00
claude@clouddev1 fbf449f9e0 feat(website): asciinema cast pipeline + landing quickstart demo
Settle the cast toolchain (STYLE.md #9) and build the demo pipeline end to
end. Driver: autocast, chosen by spike — its !Interactive feeds keys to the
running TUI and captures the redraw, the right model for a full-screen
crossterm app. asciinema-automation was rejected (assumes shell echo/\n Enter;
produced a garbled cast against the TUI).

- add asciinema-player; Cast.astro (player island) + Demo.astro (the WASM-swap
  seam, ADR-website-001 §3)
- casts-src/: human-readable command-lists (casts.mjs) + generate.mjs, exposed
  as `pnpm casts`; expands steps to autocast YAML and records to public/casts/.
  Command-lists are the durable source; .cast files are regenerable (final
  re-record sweep due once the app is locked).
- quickstart.cast (create -> add columns -> insert -> show data) embedded on
  the landing page above the feature cards.

Verified: pnpm build clean (25 pages); player + cast bundled and served;
landing HTML references the cast. Visual playback check pending (no headless
browser here — verify via dev server over the tunnel).
2026-06-10 12:59:50 +00:00
claude@clouddev1 c0cc92a741 docs(website): rewrite Build the library + add Querying with joins guide
Build the library: polish and extend from a 2-table draft into the full
guided build — all four tables, the authors→books 1:n and the books↔members
m:n through the loans bridge (bridge-table concept taught in context), the
isbn unique constraint, and captured show-relationships / show-data output.
Remove the draft marker; it is now publication-quality. Uses the same sample
rows as the Reference pages so output matches across the site.

Querying with joins (new): joins built up from two tables → the three-table
bridge join → a filtered join → a group-by aggregate, all in advanced mode
with real captured output.

Verified: pnpm build clean (25 pages); no forbidden terms; internal links
resolve. Advanced-mode `mode advanced`/`mode simple` and the unique
constraint checked against source.
2026-06-10 12:11:39 +00:00
claude@clouddev1 10655e46de docs(website): fill the six Reference stubs with worked examples + output
Expand columns, relationships, indexes, constraints, inserting-and-editing-
data, and querying-and-inspecting from syntax-only stubs into full pages,
each with worked examples on the library schema and real captured app output
(structure boxes, relationship diagrams, data tables, show-lists, query
plans, cascade summaries). All output captured verbatim from the app — never
hand-drawn. Both simple- and advanced-mode forms shown where both apply;
advanced syntax verified against tests/source.

STYLE.md: record the output-block convention (plain unlabelled fence,
captured from a throwaway harness, not hand-drawn).

Verified: pnpm build clean (24 pages); no forbidden terms; internal links
and heading anchors resolve.
2026-06-10 11:50:18 +00:00
claude@clouddev1 619c200ea1 Merge branch 'main' into website (V1 relationship visualization)
Brings main's relationship-visualization feature (ADR-0044 in the main
namespace) and Gitea-migration cleanup onto the website branch, so the
docs can be written against the new diagram output:

- show relationship <name> / show table <T> render two-table connector
  diagrams (child-FK-left, parent-right, n…1 cardinality)
- compound-FK bus routing + pairing line
- ~2000 lines across src/{app,db,event,output_render,runtime,ui}.rs,
  new insta snapshots, tests/it/{show_list,compound_fk}.rs

Merged clean — no conflicts. The prior commit moved the website ADR out
of docs/adr/ into its own namespace, so main's ADR-0044
(relationship-visualization) lands with no collision.

Tests on the merged tree: 2207 passed, 0 failed, 0 skipped
(1 ignored doctest, inherited from main).
2026-06-10 11:06:14 +00:00
claude@clouddev1 dfb5f0b1b1 docs: move website ADR + plan into a dedicated docs/website/ namespace
The website subproject drew ADR numbers from the same global integer pool
as main, so every merge risked a collision — this already happened twice
(drafted 0042, bumped to 0044, both landing on numbers main had taken; main
has now used 0044 for relationship visualization). Give the website its own
ADR namespace so the two never compete again.

- docs/adr/0044-public-website-...md
    -> docs/website/adr/20260604-adr-website-001.md  (id: ADR-website-001)
- docs/plans/20260604-adr-0044-website.md
    -> docs/website/plans/20260604-website-implementation-plan.md
- new docs/website/adr/README.md index (dated <date>-adr-website-<NNN> seq)
- docs/adr/README.md: drop the 0044 entry, add a namespace pointer in the
  intro (keeps the list tail == merge-base, so main's 0044 merges cleanly)
- ADR-0000: record the subproject-ADR-namespace convention
- update references in STYLE.md, astro.config.mjs, the plan body

Handoff files left untouched as point-in-time history.
2026-06-10 11:04:55 +00:00
claude@clouddev1 39e97ac3f9 docs: website-branch session handoff (website-1)
First handoff for the website work, on a branch-scoped name sequence
(…-website-handoff-N.md) to avoid colliding with main's handoff-NN files.
Captures stack/layout, the five-section structure, binding conventions
(no DSL / no engine name / fence + prompt + copy rules), the canonical
library schema, a verified-syntax cheat-sheet, the dev-server IPv4 gotcha,
next-work priorities (fill the 6 Reference stubs, iterate guides, Phase B
landing, deferred casts), and process pins.
2026-06-10 10:41:45 +00:00
claude@clouddev1 936d9254c0 feat: add "Using the playground" section + Reference skeleton
Restructure the docs into five top-level sections, splitting the
application you drive from the database language you build with.

- New "Using the playground" section: command-line options; the assistive
  editor (completion, highlighting, [ERR]/[WRN] indicator, hints, in-line
  editing); the output pane (scrolling); projects (save/load/new/rebuild);
  undo/redo & history; export & import; clipboard; getting help. Grounded in
  the in-app help/usage and ADR-0003/0022/0027.
- Reference: seed the remaining topic pages (Columns, Relationships,
  Indexes, Constraints, Inserting & editing data, Querying & inspecting)
  with real syntax synopses; worked examples to follow.
- Surface the assistive editor on the landing page and in Getting started;
  restore cross-links now that targets exist.

Plan + STYLE updated to the five-section structure. 24 pages, build green,
links resolve, content clean; planned features carry "planned" callouts.
2026-06-10 10:40:07 +00:00
claude@clouddev1 44390e765d feat: simple-mode code-block highlighting, prompt, and copy rules
Add a custom Shiki grammar for the simple-mode command language
(src/grammars/rdbms.mjs), registered with Expressive Code. Two language ids
share it: rdbms (real commands) and rdbms-syntax (abstract templates).
Simple-mode blocks now highlight; advanced examples keep sql.

Separation + copy ergonomics via CSS (global.css): a decorative, copy-safe
"> " prompt on rdbms command lines (not in the copy buffer), and the copy
button hidden on multi-command rdbms blocks and on rdbms-syntax templates
(the app input is single-line, so a multi-command paste is not runnable);
single-command, sql, and sh blocks keep copy.

Content: convert 22 simple-mode fences to rdbms; lead the simplest examples
(first project, Tables reference) with bare "with pk" (the beginner default
that creates a ready-made id key), pointing to the named form. Record the
fence + prompt conventions in STYLE.md.
2026-06-09 22:30:44 +00:00
claude@clouddev1 995c0ba8eb docs: reconcile website doc inventory with merged main scope
The merge from main added user-facing surface the pre-merge inventory had
listed as planned. Mark them documented-as-shipped: show tables /
relationships / indexes + show relationship/index <name> (V5/V5a),
help [<command>] + help types (H3), compound-primary-key foreign-key
references (T3, ADR-0043), and friendlier parse-error messaging (H1a).
Refresh the test count to 2193 and note requirements.md now uses a [/]
partial marker (trust the code, not the marker).
2026-06-09 22:30:44 +00:00
claude@clouddev1 c72c624daa chore: bind website dev/preview server to IPv4 loopback (127.0.0.1)
Astro/Vite's default localhost bind resolves to IPv6 ::1 on this host,
which silently breaks `ssh -L 4321:127.0.0.1:4321` tunnels (they target
IPv4). Pin server.host to 127.0.0.1 so dev/preview is reachable over an
IPv4 loopback forward. Loopback-only — no network exposure.
2026-06-09 21:44:43 +00:00
claude@clouddev1 9e774b2dfa docs: ADR numbering discipline — assign numbers at merge-to-main
Codifies the fix for the ADR-0042 cross-branch collision (resolved this
merge by renumbering the website ADR to 0044): ADR numbers are assigned
when a branch merges to main, not at creation. On a branch, draft under
a placeholder (ADR-XXXX title / draft-<slug>.md filename); main's
docs/adr/README.md is the single source of truth for the next free
number.

- ADR-0000: new "Numbering discipline" section.
- CLAUDE.md: pointer to it from the documentation-discipline note.
2026-06-09 20:30:36 +00:00
claude@clouddev1 40de389bcb Merge branch 'main' into website (Gitea migration + ADR renumber)
Brings website up to date with main (18 commits): H1a parse-error
pedagogy, V5/H3/V5a show+help commands, ADR-0043 compound-PK FK,
handoffs 58-59, and the GitHub->Gitea doc scrub (Cargo.toml repository,
CLAUDE.md, ADR-0001 amendment, requirements).

Conflict: docs/adr/README.md. main and website had each created an
ADR-0042 (main: H1a parse-error pedagogy; website: public website &
docs site). Renumbered the website ADR to 0044 (next free after main's
0042/0043) and updated all references (ADR file, plan file, STYLE.md,
astro.config.mjs, README index). Website build verified green.
2026-06-09 20:28:27 +00:00
claude@clouddev1 0fcb7b1105 docs: website docs structure + first content pages
Phase D foundation. Configures the pragmatic four-section sidebar
(Getting started / Guides / Reference / Concepts) and replaces the
template example pages with grounded content built on the shared
"library" example database (authors/books/members/loans):

- Getting started: installation, first project, simple vs advanced,
  the example library.
- Reference: Types (all ten + serial/shortid + advanced aliases),
  Tables (create/drop, compound PK, advanced CREATE TABLE).
- Concepts: projects & storage (readable files, derived database,
  autosave, temp projects).
- Guides: Build the library (draft, to be refined for teaching).

Command syntax grounded in en-US.yaml usage/help, command.rs, and
types.rs (verified against tests). Records the settled doc decisions
in STYLE.md. Build green (10 pages, Pagefind); content clean of
"DSL"/engine-name.
2026-06-06 07:34:57 +00:00
claude@clouddev1 cea99e8b70 chore: scaffold website (Astro 6 + Starlight + Tailwind v4)
Phase A of docs/plans/20260604-adr-0042-website.md. Scaffolds the site
under website/ from the Starlight template; adds Tailwind v4 (via
@tailwindcss/vite) bridged to Starlight with @astrojs/starlight-tailwind
(src/styles/global.css + customCss). Production build is green: static
output, Pagefind search index, sharp image optimization.

Template placeholders (title, example pages, sidebar) are left for
Phase B/D. Reconciles the ADR/plan/index wording from "Astro 5" to
"Astro 6" to match the scaffolded toolchain.
2026-06-05 15:00:12 +00:00
claude@clouddev1 1fad29c0f9 docs: ADR-0042 — public website + documentation site plan
Planning artifacts for the first public website, recorded before any
code is written.

- ADR-0042: the decisions — Astro 5 + Starlight + Tailwind v4 (over
  SvelteKit); asciinema .cast demos reusable in docs (scripted-input
  driver, not history.log replay); in-page WASM playground deferred
  behind a stable demo seam, with the portable-core vs native-edge
  boundary recorded for a future ADR; portable static hosting (Vercel
  target); monorepo (website/); website is the canonical docs home;
  full-feature-set docs with "planned" callouts; user-facing copy uses
  no engine name and no "DSL"; install via prebuilt binaries + package
  managers.
- docs/plans/20260604-adr-0042-website.md: implementation plan with the
  grounded documentation inventory and phases A–E.
- website/STYLE.md: living documentation style guide + open-decisions log.
- docs/adr/README.md: index updated for ADR-0042 (numerical order).
2026-06-05 08:13:36 +00:00
146 changed files with 17561 additions and 493 deletions
+17
View File
@@ -0,0 +1,17 @@
# Windows cross-link fix for the D1 release matrix (cargo-zigbuild).
#
# Rust's std links `-lsynchronization` on Windows (WaitOnAddress-based thread
# parking). Rust normally satisfies this from the `self-contained` mingw libs
# of its `rust-mingw` component — which rust-overlay does NOT ship — and Zig's
# bundled mingw (used by `cargo zigbuild`) doesn't provide `libsynchronization.a`
# either. The actual symbols are *forwarded by kernel32* (already linked), so an
# empty stub import lib is enough to satisfy the linker. See `ci/winstub/`.
#
# These sections apply ONLY when building for the Windows targets, so host
# builds (the gate's `cargo test`/`clippy`) and the Linux release targets are
# unaffected.
[target.x86_64-pc-windows-gnu]
rustflags = ["-L", "native=ci/winstub"]
[target.aarch64-pc-windows-gnullvm]
rustflags = ["-L", "native=ci/winstub"]
+1
View File
@@ -0,0 +1 @@
use flake
+65
View File
@@ -0,0 +1,65 @@
# CI toolchain image for rdbms-playground.
#
# Purpose: a SMALL job-container image that
# (a) satisfies the Gitea act_runner job-container contract — /bin/sleep (the
# keep-alive entrypoint), bash (run: steps), node (JS actions such as
# actions/checkout); a bare nixos/nix image has none of these and won't
# even start (verified by the ci-probe run: "/bin/sleep: no such file"); and
# (b) carries the project's pinned nix toolchain with the flake's devShell
# pre-warmed, so CI runs `nix develop -c cargo ...` against a warm store.
#
# Base: node:22-bookworm-slim. Debian slim already provides bash + coreutils
# (sleep); the node tag adds the actions runtime. Far smaller than the
# catthehacker runner images (which bundle a whole GitHub-runner emulation we
# don't need).
FROM node:22-bookworm-slim
# nix install + flake eval needs these. git because flakes prefer a VCS context
# and tools shell out to it. Drop apt lists to keep the layer small.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
curl xz-utils ca-certificates git \
&& rm -rf /var/lib/apt/lists/*
# Single-user nix (--no-daemon): store at /nix owned by root, no daemon/systemd
# needed — the correct mode for a container. The official installer refuses root
# and shells out to `sudo` purely to create /nix; pre-creating it ourselves (we
# ARE root) sidesteps both. Enable flakes globally so every nix invocation (and
# the runner's steps) get nix-command + flakes without flags.
# nix.conf is written FIRST so the installer's own `nix-env` profile step reads
# it: `build-users-group =` (empty) makes single-user nix build as the calling
# user (root) instead of demanding the nixbld group/users a daemon install would
# create; flakes are enabled globally in the same file.
RUN mkdir -m 0755 /nix && chown root:root /nix \
&& mkdir -p /etc/nix \
&& printf 'build-users-group =\nexperimental-features = nix-command flakes\n' > /etc/nix/nix.conf \
&& curl --proto '=https' --tlsv1.2 -sSf -L https://nixos.org/nix/install -o /tmp/nix-install.sh \
&& sh /tmp/nix-install.sh --no-daemon \
&& rm /tmp/nix-install.sh
ENV PATH=/root/.nix-profile/bin:/nix/var/nix/profiles/default/bin:$PATH
# We set PATH directly instead of sourcing the profile, so also point nix at the
# Debian CA bundle (already installed) for substituter HTTPS — otherwise the
# profile-provided NIX_SSL_CERT_FILE is missing and store downloads fail.
ENV NIX_SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
# Warm the flake's devShell into the store: realizes nixpkgs + the pinned Rust
# toolchain (rustc/cargo/clippy/rustfmt) + cargo-sweep. Only the inputs that
# determine the shell are copied, so this expensive layer is cached and only
# re-runs when the flake or the toolchain pin changes — not on every source edit.
# (devShell eval is lazy: packages.default — and thus Cargo.toml/Cargo.lock — is
# never forced here, so it needn't be present.)
WORKDIR /warm
COPY flake.nix flake.lock rust-toolchain.toml ./
RUN nix develop -c rustc --version \
&& nix develop -c cargo --version \
&& nix develop -c cargo clippy --version \
&& nix develop -c cargo fmt --version \
&& nix develop -c cargo sweep --version
WORKDIR /
RUN rm -rf /warm
# FOLLOW-UP optimisation (intentionally NOT done here, see CI notes): cargo
# dependency + target caching. Each CI run still compiles the ~296-crate graph
# from scratch and pulls crate sources from crates.io. A later pass can bake
# `cargo fetch` (offline crate sources) and/or a warmed target dir, or wire
# sccache, to cut run time. Correctness/first-green first; speed next.
+51
View File
@@ -0,0 +1,51 @@
# Builds the nix CI toolchain image (.gitea/ci-image/Dockerfile) and pushes it
# to the Gitea registry. The gate (ci.yaml) runs *inside* this image, so this
# workflow is the gate's prerequisite. It only needs to run when the image's
# inputs change — the Dockerfile, the flake, or the toolchain pin — plus on
# manual dispatch.
#
# DinD pattern: plain docker:27-dind (one of the tested ci-test samples). No
# registry proxy here — the runner's containers have direct internet egress
# (the ci-probe run cloned github.com and pulled docker.io with no proxy), and
# this image's RUN steps fetch from apt + nixos.org, which the proxy isn't
# guaranteed to forward. The dind-cached:local + REGISTRY_PROXY_HOST variant is
# a later speed optimisation for base-image pull caching, not needed for green.
name: build-ci-image
on:
push:
# Branch pushes only. Tag pushes ignore `paths:` filters and would rebuild
# the (unchanged) image on every release tag — `branches: ['**']` excludes
# tags, so this runs only when a branch push actually changes an image input.
branches: ['**']
paths:
- '.gitea/ci-image/Dockerfile'
- 'flake.nix'
- 'flake.lock'
- 'rust-toolchain.toml'
- '.gitea/workflows/build-ci-image.yaml'
workflow_dispatch:
jobs:
build:
runs-on: ci-public
services:
docker:
image: docker:27-dind
options: --privileged
env:
DOCKER_TLS_CERTDIR: ""
env:
DOCKER_HOST: tcp://docker:2375
IMAGE: git.lazyeval.net/oli/rdbms-playground-ci
steps:
- uses: actions/checkout@v4
- name: wait for docker
run: until docker version >/dev/null 2>&1; do sleep 1; done
- name: registry login
run: |
echo "${{ secrets.REGISTRY_TOKEN }}" \
| docker login git.lazyeval.net -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
- name: build
run: docker build -f .gitea/ci-image/Dockerfile -t "$IMAGE:latest" .
- name: push
run: docker push "$IMAGE:latest"
+45
View File
@@ -0,0 +1,45 @@
# The CI gate. Runs inside the prebuilt nix toolchain image (built + pushed by
# build-ci-image.yaml), so the pinned 1.95.0 toolchain is already warm — steps
# just enter the flake devShell and run cargo.
#
# Gate = clippy + test. fmt is deliberately NOT gated yet (ADR-ci-002: the tree
# isn't clean under stock rustfmt; revisit on main). The release job (static
# binary for D2) and the platform matrix layer on later, step by step.
name: ci
on:
push:
# Branch pushes only — a tag push hits the same commit the branch push
# already gated, so `branches: ['**']` drops the redundant tag-triggered
# run (the release workflow owns tags). Pushing commits + a tag together
# still gates the commits via the branch push.
branches: ['**']
# Skip the gate for changes that can't affect clippy/test — docs, markdown,
# and the website subproject (it has its own workflow, website.yaml, that
# builds + publishes it). A push touching crate code *and* these still runs
# (paths-ignore only skips when *all* changed files match).
# Note: flake/toolchain changes are NOT ignored — they can shift the
# toolchain and thus lint/test outcomes.
paths-ignore:
- 'docs/**'
- '**/*.md'
- 'website/**'
- '.gitea/workflows/website.yaml'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
- 'website/**'
- '.gitea/workflows/website.yaml'
jobs:
gate:
runs-on: ci-public
# Public package → anonymous pull, no credentials needed.
container:
image: git.lazyeval.net/oli/rdbms-playground-ci:latest
steps:
- uses: actions/checkout@v4
- name: clippy (warnings denied)
run: nix develop -c cargo clippy --all-targets -- -D warnings
- name: test
run: nix develop -c cargo test --no-fail-fast
+95
View File
@@ -0,0 +1,95 @@
# macOS release leg — the two *-apple-darwin binaries, built natively on the
# Tart (Apple-Silicon) runner and attached to an existing Gitea release.
#
# Manual dispatch only: the Mac runner is intermittent, so this is triggered by
# hand (with the Mac up) for a given release tag. The 4-target Linux/Windows
# release (release.yaml) runs on the tag itself and never waits on the Mac, so a
# release always has those four; the macOS two are added by dispatching this.
#
# NOTE: Gitea exposes workflow_dispatch only for workflows on the DEFAULT branch,
# so this becomes triggerable once the CI work is merged to `main`.
name: release-macos
on:
workflow_dispatch:
inputs:
tag:
description: 'Release tag to build the macOS binaries for and attach to (e.g. v0.1.0)'
required: true
jobs:
release-macos:
runs-on: macos
env:
NIX_CONFIG: "experimental-features = nix-command flakes"
TAG: ${{ inputs.tag }}
# Auto-provided by Gitea Actions; has repo write (release) scope.
TOKEN: ${{ secrets.GITEA_TOKEN }}
API: ${{ github.server_url }}/api/v1
REPO: ${{ github.repository }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.tag }}
- name: test
run: nix develop -c cargo test --no-fail-fast
- name: build, de-nix, sign, package + publish
run: |
set -e
mkdir -p dist
for t in aarch64-apple-darwin x86_64-apple-darwin; do
echo "==================== $t ===================="
nix develop -c cargo build --release --target "$t"
f="target/$t/release/rdbms-playground"
# Rewrite the nix-store libiconv load path to the system one, then
# re-sign ad-hoc (install_name_tool invalidates the signature; arm64
# requires a valid one). Guard against any remaining /nix/store dep.
for l in $(otool -L "$f" | awk '/\/nix\/store.*libiconv.*dylib/ {print $1}'); do
install_name_tool -change "$l" /usr/lib/libiconv.2.dylib "$f"
done
codesign --force --sign - "$f"
if otool -L "$f" | grep -q /nix/store; then
echo "ERROR: $t binary links a /nix/store dylib"; exit 1
fi
out="rdbms-playground-$TAG-$t"
cp "$f" "dist/$out"
( cd dist && shasum -a 256 "$out" > "$out.sha256" ) # macOS: shasum, not sha256sum
done
ls -l dist
# Idempotent create-or-get the release (release.yaml likely created it
# already from the tag), then upload the two macOS binaries + checksums.
created=$(curl -sS -X POST "$API/repos/$REPO/releases" \
-H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":\"Automated release for $TAG.\"}")
id=$(printf '%s' "$created" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const o=JSON.parse(s);process.stdout.write(String(o.id||""))}catch(e){}})')
if [ -z "$id" ]; then
id=$(curl -sS "$API/repos/$REPO/releases/tags/$TAG" \
-H "Authorization: token $TOKEN" \
| node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{process.stdout.write(String(JSON.parse(s).id))})')
fi
echo "release id: $id"
for fa in dist/*; do
name=$(basename "$fa")
echo "uploading $name"
curl -sS -X POST "$API/repos/$REPO/releases/$id/assets?name=$name" \
-H "Authorization: token $TOKEN" -F "attachment=@$fa" > /dev/null
done
echo "published macOS assets for $TAG"
- name: prune nix store — keep the last 2 toolchain generations
# The runner wipes the workspace each run, so cargo target/ never
# accumulates. Bound the persistent nix store by generation: record the
# current devShell as a generation of a persistent profile (in $HOME),
# keep the 2 newest, reclaim what older ones referenced.
if: always()
run: |
echo "--- disk before ---"; df -h / | tail -1
P="$HOME/.cache/rdbms-ci/toolchain"
nix develop --profile "$P" -c true || true
nix-env -p "$P" --delete-generations +2 || true
nix-collect-garbage || true
echo "--- disk after ---"; df -h / | tail -1
+92
View File
@@ -0,0 +1,92 @@
# Release: on a version tag, build the cross-platform binaries and publish them
# to a Gitea release with checksums. Runs in the prebuilt CI image, so the
# pinned toolchain + the release targets + cargo-zigbuild/zig are already warm.
#
# Matrix (D1, cross-built from Linux x86_64 via cargo-zigbuild):
# x86_64-unknown-linux-musl aarch64-unknown-linux-musl (static, D2)
# x86_64-pc-windows-gnu aarch64-pc-windows-gnullvm (standalone .exe)
# macOS is deferred — its arboard/AppKit link needs Apple's SDK (see ADR-ci-001).
# D3 package-manager manifests layer on later.
#
# Tests run once (host) before the matrix, so a tag can never publish untested
# code, even one pointing at a commit that was never gated on a branch.
name: release
on:
push:
tags:
- 'v*'
jobs:
test:
runs-on: ci-public
container:
image: git.lazyeval.net/oli/rdbms-playground-ci:latest
steps:
- uses: actions/checkout@v4
- name: test
run: nix develop -c cargo test --no-fail-fast
build:
needs: test
runs-on: ci-public
container:
image: git.lazyeval.net/oli/rdbms-playground-ci:latest
strategy:
fail-fast: false
matrix:
target:
- x86_64-unknown-linux-musl
- aarch64-unknown-linux-musl
- x86_64-pc-windows-gnu
- aarch64-pc-windows-gnullvm
steps:
- uses: actions/checkout@v4
- name: build
run: nix develop -c cargo zigbuild --release --target ${{ matrix.target }}
- name: package + publish
# Pin bash: the runner defaults scripted steps to dash, which rejects
# `set -o pipefail`. bash is in the CI image.
shell: bash
env:
TARGET: ${{ matrix.target }}
# GITEA_TOKEN is auto-provided with repo write (release) scope.
TOKEN: ${{ secrets.GITEA_TOKEN }}
API: ${{ github.server_url }}/api/v1
REPO: ${{ github.repository }}
TAG: ${{ github.ref_name }}
run: |
set -euo pipefail
# Windows targets produce a .exe; the rest a bare binary.
case "$TARGET" in *windows*) EXT=.exe ;; *) EXT= ;; esac
BIN="target/$TARGET/release/rdbms-playground$EXT"
OUT="rdbms-playground-$TAG-$TARGET$EXT"
mkdir -p dist
cp "$BIN" "dist/$OUT"
( cd dist && sha256sum "$OUT" > "$OUT.sha256" )
ls -l dist
# Create the release for this tag; if a sibling matrix job already
# created it, look it up instead (idempotent + race-tolerant).
created=$(curl -sS -X POST "$API/repos/$REPO/releases" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":\"Automated release for $TAG.\"}")
id=$(printf '%s' "$created" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const o=JSON.parse(s);process.stdout.write(String(o.id||""))}catch(e){}})')
if [ -z "$id" ]; then
id=$(curl -sS "$API/repos/$REPO/releases/tags/$TAG" \
-H "Authorization: token $TOKEN" \
| node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{process.stdout.write(String(JSON.parse(s).id))})')
fi
echo "release id: $id"
for f in dist/*; do
name=$(basename "$f")
echo "uploading $name"
curl -sS -X POST "$API/repos/$REPO/releases/$id/assets?name=$name" \
-H "Authorization: token $TOKEN" \
-F "attachment=@$f" > /dev/null
done
echo "published $TARGET assets for $TAG"
+66
View File
@@ -0,0 +1,66 @@
# Build the docs/marketing website and deploy it to Cloudflare Pages.
#
# One Pages project, two branches (no second project, no sub-folders — Pages
# maps a branch to a *subdomain alias*, not a path):
# main → production (the project's production branch → relplay.org)
# website → preview (alias `website.<project>.pages.dev`; a custom
# `staging.relplay.org` can be attached to it)
# wrangler treats `--branch=<production-branch>` as a production deploy and any
# other branch as a preview, so a single workflow covers both — the Pages
# project's production branch MUST be set to `main`.
#
# Pure-Node build: the `.cast` recordings are committed, so no cargo/Rust is
# needed here. Runs on the bare `ci-public` runner (node already present; pnpm
# via corepack, pinned by package.json's `packageManager`). No job container —
# unlike the Rust gate, this needs none.
#
# Required Actions secrets (set once in the repo/org settings):
# CLOUDFLARE_API_TOKEN — token with "Cloudflare Pages: Edit" on the account
# CLOUDFLARE_ACCOUNT_ID — the account id that owns the Pages project
name: website
on:
push:
branches: [main, website]
# Only when the site (or this workflow) actually changes — crate-only
# pushes don't redeploy the site.
paths:
- 'website/**'
- '.gitea/workflows/website.yaml'
workflow_dispatch:
jobs:
deploy:
runs-on: ci-public
defaults:
run:
working-directory: website
steps:
- uses: actions/checkout@v4
- name: preflight — toolchain present
run: |
node --version
corepack --version
- name: enable pnpm (pinned by packageManager)
run: corepack enable
- name: install
run: pnpm install --frozen-lockfile
- name: build
run: pnpm build
- name: deploy to Cloudflare Pages
shell: bash
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
BRANCH: ${{ github.ref_name }}
run: |
set -euo pipefail
# `dist` is relative to website/ (the working-directory). The branch
# name decides production (main) vs preview (anything else).
npx --yes wrangler@4 pages deploy dist \
--project-name=relplay \
--branch="$BRANCH"
+6
View File
@@ -2,6 +2,12 @@
/target /target
**/*.rs.bk **/*.rs.bk
# Nix
# `nix build` output symlinks (`result`, `result-<name>`), direnv's cached env
/result
/result-*
.direnv/
# Snapshot test review files # Snapshot test review files
*.snap.new *.snap.new
*.pending-snap *.pending-snap
+32 -17
View File
@@ -37,9 +37,9 @@ Current decisions at a glance (each backed by an ADR):
simple to advanced (ADR-0003). No other sigils. simple to advanced (ADR-0003). No other sigils.
- **Project format:** `project.yaml` + `data/<table>.csv` + - **Project format:** `project.yaml` + `data/<table>.csv` +
`history.log`; `playground.db` is a derived artifact (ADR-0004, `history.log`; `playground.db` is a derived artifact (ADR-0004,
amended by ADR-0015). Implemented through Iteration 4 + amended by ADR-0015). Fully implemented (ADR-0015 Iterations
cleanup; export/import (Iter 5) and migration framework / 16): export/import, `--resume`, persistent input history, and
--resume / persistent input history (Iter 6) pending. the migration framework scaffold are all done.
- **Project storage runtime:** every command persists through to - **Project storage runtime:** every command persists through to
db + yaml + csv + history.log in one execution context, gated db + yaml + csv + history.log in one execution context, gated
by the combined db persistence logic; commit-db-last ordering by the combined db persistence logic; commit-db-last ordering
@@ -108,6 +108,23 @@ Current decisions at a glance (each backed by an ADR):
SQL `select` / `with` / `insert` / `update` / `delete` SQL `select` / `with` / `insert` / `update` / `delete`
(ADR-0039). `EXPLAIN QUERY PLAN` never executes, so (ADR-0039). `EXPLAIN QUERY PLAN` never executes, so
explaining a destructive command is safe. explaining a destructive command is safe.
- **Continuous integration & release** (built on the `ci` branch,
2026-06-15; decisions in `docs/ci/adr/` — **ADR-ci-001/002/003**,
a namespace kept separate from the main ADR sequence to avoid
cross-branch number collisions, like the website's): a self-hosted
**Gitea Actions** pipeline built on a **nix flake** (pinned Rust
`1.95.0` — one source of toolchain for dev *and* CI) plus a
prebuilt CI image. **Gate** (`ci.yaml`): `clippy -D warnings` +
`cargo test` on every branch push / PR. **Release** on a `v*` tag
(`release.yaml`): the four non-macOS **D1** targets cross-built
with `cargo-zigbuild` (Linux musl static + standalone Windows
`.exe`); the two macOS targets via the **dispatched**
`release-macos.yaml` on a Tart Apple-Silicon runner (de-nix the
`libiconv` load path + ad-hoc re-sign). All published to a Gitea
release with `.sha256`s. **`fmt` is intentionally not gated yet**
(the tree isn't stock-`rustfmt`-clean). `workflow_dispatch` is
Gitea-default-branch-only, so `release-macos` is dispatchable once
this lands on `main`.
## Repository layout ## Repository layout
@@ -165,7 +182,10 @@ Key invariants in the code:
ADR. In-flight discussion stays in conversation or issues ADR. In-flight discussion stays in conversation or issues
until it settles. The ADR-0000 index-upkeep rule applies: until it settles. The ADR-0000 index-upkeep rule applies:
every ADR change updates `docs/adr/README.md` in the same every ADR change updates `docs/adr/README.md` in the same
edit. edit. ADR **numbers** are assigned at merge-to-`main` (draft
under a placeholder `ADR-XXXX` / `draft-<slug>.md` on a
branch) to avoid cross-branch collisions — see ADR-0000
"Numbering discipline".
- **Issue tracking.** Bugs and enhancements are filed as Gitea - **Issue tracking.** Bugs and enhancements are filed as Gitea
issues (see *Issue tracking — Gitea via `tea`* below). issues (see *Issue tracking — Gitea via `tea`* below).
`docs/requirements.md` and the ADRs remain the source of truth `docs/requirements.md` and the ADRs remain the source of truth
@@ -318,16 +338,8 @@ all of `target/`, forcing a full from-scratch rebuild).
These are explicitly tracked (mostly in `requirements.md`) but These are explicitly tracked (mostly in `requirements.md`) but
not yet implemented: not yet implemented:
- **Project storage** (track 2): largely implemented through
Iteration 4 + cleanup pass + safety hardening (Iterations
14 of ADR-0015). Pending pieces: `export` / `import` (Iter
5), `--resume` + persistent input history hydration +
migration framework scaffold (Iter 6).
- **Modify relationship** (C3a): drop+add covers the use case - **Modify relationship** (C3a): drop+add covers the use case
today. today.
- **m:n convenience** (C4): auto-generates a junction table
with appropriate FKs — depends on relationships being solid
(they are).
- **Strong syntax-help in parse errors** (H1a): point users at - **Strong syntax-help in parse errors** (H1a): point users at
missing keywords/clauses rather than the unexpected missing keywords/clauses rather than the unexpected
character. *(H1 — the friendly **database**-error layer — is character. *(H1 — the friendly **database**-error layer — is
@@ -338,14 +350,17 @@ not yet implemented:
- **Session log + Markdown export** (V4): the bigger UX - **Session log + Markdown export** (V4): the bigger UX
project — scrollable session journal, smart structure project — scrollable session journal, smart structure
rendering, save-as-markdown. rendering, save-as-markdown.
- **Readline shortcuts** (I1b): Ctrl-A/Ctrl-E, Ctrl-W/Ctrl-K/
Ctrl-U.
- **Multi-line input** (I1): Enter inserts newline, - **Multi-line input** (I1): Enter inserts newline,
Ctrl-Enter submits. Ctrl-Enter submits.
- **Tab completion** (I3), **syntax highlighting** (I4).
- **ER diagram export** (V3). - **ER diagram export** (V3).
- **CI** (TT5): test infrastructure exists; CI workflow not - **Full TT5** (CI): the pipeline is live (see the CI decision
yet configured. above / `docs/ci/adr/`), but "all tiers on all OSes" isn't
complete — **Windows is build-only** (cross-compiled, not
executed: no Windows runner) and **Tier 4** (PTY, TT4) isn't
wired in CI.
- **D3 packaging**: prebuilt binaries + checksums ship to Gitea
releases, but the Homebrew / Scoop / winget / `cargo binstall`
manifests are not done.
## Handoff notes ## Handoff notes
+6
View File
@@ -68,6 +68,12 @@ tempfile = "3.27.0"
incremental = false incremental = false
debug = "line-tables-only" debug = "line-tables-only"
# Release builds back the distributed binaries (D2: single static binary).
# strip = "symbols" drops the symbol table at link time so the shipped artifact
# is lean (≈13 MB → 10 MB for the musl build) without a separate strip step.
[profile.release]
strip = "symbols"
[lints.rust] [lints.rust]
unsafe_code = "forbid" unsafe_code = "forbid"
unreachable_pub = "warn" unreachable_pub = "warn"
+30
View File
@@ -0,0 +1,30 @@
# `ci/winstub/` — empty Windows import-lib stub
`libsynchronization.a` here is an **empty `ar` archive** (8 bytes: `!<arch>\n`),
referenced by `.cargo/config.toml` via `-L native=ci/winstub` for the Windows
release targets.
## Why
The D1 release matrix cross-compiles Windows binaries from Linux with
`cargo zigbuild` (see `docs/ci/adr/`). Rust's `std` links `-lsynchronization`
for its `WaitOnAddress`-based thread parking. That import library is normally
provided by Rust's `rust-mingw` "self-contained" component — which `rust-overlay`
does not ship — and Zig's bundled mingw doesn't carry it either, so the link
fails with:
```
error: unable to find dynamic system library 'synchronization'
```
The functions it would import (`WaitOnAddress`, `WakeByAddressSingle`,
`WakeByAddressAll`) are **forwarded by `kernel32.dll`**, which is already linked,
so they resolve at link and run time without a real `synchronization` import
library. An **empty** stub is therefore sufficient: it satisfies the `-l`
lookup and contributes no symbols.
## Regenerating
```
zig ar rcs ci/winstub/libsynchronization.a
```
+1
View File
@@ -0,0 +1 @@
!<arch>
@@ -38,6 +38,44 @@ The index lists ADRs in numerical order. Each entry shows the
number, title, and — where relevant — status annotations such as number, title, and — where relevant — status annotations such as
"Superseded by ADR-NNNN" or "Deprecated". "Superseded by ADR-NNNN" or "Deprecated".
## Numbering discipline
ADR numbers are a single global sequence, so two branches can each grab
"the next number" independently and collide on merge. (This happened when
the `website` branch's ADR-0042 met `main`'s ADR-0042, resolved by
renumbering the former to ADR-0044.) To prevent it:
**Assign an ADR's number at merge-to-`main`, not at creation.** While the
work lives on a non-`main` branch, draft the ADR under a placeholder — an
`ADR-XXXX` title and a `draft-<slug>.md` filename — and reference it that
way from any plan or notes. Give it the next free number only when the
branch merges to `main`, renaming the file and updating its references in
the same step.
A number is "taken" only once it appears in `main`'s `docs/adr/README.md`,
which is the single source of truth for the next free number — never
compute "next" from a feature branch. A branch that genuinely needs a real
number up front may instead reserve one by landing a stub index entry on
`main` first, but placeholder-until-merge is the default.
### Subproject ADR namespaces
A long-lived subproject developed on its own branch can escape the shared
integer pool entirely by keeping its decision records in a **separate
namespace**, rather than fighting collisions on every merge. The **website**
(`docs/website/adr/`) is the first: its ADRs use a dated sequence —
`<date>-adr-website-<NNN>.md`, referenced in prose as `ADR-website-NNN`
and are indexed by their own `docs/website/adr/README.md`. Because the
date-plus-subproject prefix is disjoint from `main`'s integer sequence, a
website ADR and a `main` ADR can never claim "the same number" again. (This
namespace was created on 2026-06-10 after the website's ADR collided with
`main`'s on consecutive numbers — drafted 0042, bumped to 0044, both times
landing on a number `main` had taken; the move retired it from the pool as
**ADR-website-001**.) The main `docs/adr/` index carries a pointer to each
such namespace. Use this for a new subproject only when it is genuinely
self-contained and branch-isolated; one-off cross-cutting decisions stay in
the global sequence.
## Out-of-scope discipline ## Out-of-scope discipline
ADRs (and the plans they spawn) lean heavily on "out of scope" language. ADRs (and the plans they spawn) lean heavily on "out of scope" language.
+38 -2
View File
@@ -414,5 +414,41 @@ time-boxed-`recv` path. We therefore test the **pure pieces**
exhaustively (label fn, capture state machine, nearest-deadline helper) exhaustively (label fn, capture state machine, nearest-deadline helper)
and assert plumbing via Tier-3, rather than over-claiming an integration and assert plumbing via Tier-3, rather than over-claiming an integration
test of the `tokio` timeout itself. test of the `tokio` timeout itself.
</content>
</invoke> ## Amendment 1 — `Ctrl-G` demo-mode alias for F1 (2026-06-15)
**Context.** The contextual `hint` overlay (ADR-0053 / H2) is opened with
**F1**. But F1 reaches the app only as an escape sequence (`\eOP` /
`\e[11~`), and the `autocast` recorder used for our screencasts **cannot
emit escape sequences** — so a cast can never trigger F1, and the single
most teaching-relevant overlay is unreachable in recordings. The same
wall already bit step-captions (which is why `Ctrl+]`, a single control
byte, was chosen over `Ctrl+!`).
**Decision.** In **demo mode only**, **`Ctrl-G`** is an alias for F1. It
runs the exact F1 hint logic (live-input → form hint; empty input →
recent-error / getting-started) and is **badged as `[F1]`** (not
`[CTRL-G]`) so a recorded cast is visually identical to a genuine F1
press. `Ctrl-G` is the only viable choice: it is a single legacy control
byte autocast can send, whereas `Ctrl`+digit (e.g. the mnemonic `Ctrl-1`)
is **not encodable in a legacy terminal at all** — digits have no control
byte, so `Ctrl-1` arrives as a bare `1`; the kitty protocol *would* encode
it but only as an escape sequence (the very thing autocast can't send),
and this app deliberately does not enable keyboard-enhancement flags.
**Why demo-gated.** The shipped keymap stays F1-only — a real user never
trips the alias, and demo mode is also the mode teachers/presenters run,
so the alias is available exactly where it's wanted. Outside demo mode
`Ctrl-G` falls through to the inert catch-all (the `Char(c)` insert arm
excludes CONTROL, so no `g` is typed).
**Scope.** `hint_key` guard in `App::handle_key` gains the demo-gated
`Ctrl-G` disjunct; `demo_badge_label` maps `Ctrl-G → [F1]` (consulted
only in demo mode). Test-first: three `app.rs` Tier-1 tests (alias fires
on input + on empty input; inert when demo off) + the badge-map
assertion. The keybinding strip (ADR-0051) is **not** changed — F1 stays
the advertised key; `Ctrl-G` is a recorder aid, and the badge already
reads `[F1]`.
*(Editorial: this amendment also removed two stray `</content>` /
`</invoke>` lines accidentally committed at the end of this file.)*
@@ -189,9 +189,18 @@ over keeping journaling coupled in the worker (which would have needed the
no-op-skip / read-only sites no longer journal; success is journalled at no-op-skip / read-only sites no longer journal; success is journalled at
the dispatch layer (`spawn_dsl_dispatch` / `run_replay` / app-command the dispatch layer (`spawn_dsl_dispatch` / `run_replay` / app-command
sites). The ring stays `Vec<String>`; `seed_history` / `ProjectSwitched` sites). The ring stays `Vec<String>`; `seed_history` / `ProjectSwitched`
are untouched. The vestigial worker `source` plumbing (the `_source` are untouched. The vestigial worker `source` plumbing has since been
param on `finalize_persistence` / `do_rebuild_from_text` and the thin **fully unwound** (2026-06-14 follow-up): `_source` removed from
read-only `*_request` wrappers) is left in place — a clean follow-up. `finalize_persistence` / `do_rebuild_from_text`; the three read-only
`*_request` wrappers inlined and deleted; and — because the cascade ran
deeper than first estimated — the now-dead `source` param dropped from
the ~30 worker handlers (leaf + composite) that only forwarded it, plus
the `source` field removed from the `DescribeTable` / `QueryData` /
`RunSelect` requests and the matching `DatabaseHandle` method parameters
(the ~164 call-site churn was mostly tests). The only `source` left in
the worker is the snapshot/undo label (`snapshot_then` /
`stage_pre_mutation` / `begin_batch`), passed at the match-arm level.
Purely mechanical, compiler-guided, no behaviour change.
- **App commands recall bare.** Because they are dispatched outside the - **App commands recall bare.** Because they are dispatched outside the
`ExecuteDsl`/spawn path, app commands journal **simple** (`advanced = `ExecuteDsl`/spawn path, app commands journal **simple** (`advanced =
false`) at their own sites, and `submit` excludes them from the ring's false`) at their own sites, and `submit` excludes them from the ring's
@@ -0,0 +1,428 @@
# ADR-0053: Contextual `hint` — F1 live-input keybinding + `hint` command, with a tier-3 teaching corpus (H2)
## Status
Accepted — **implemented 2026-06-15** (plan:
`docs/plans/20260614-adr-0053-contextual-hint-H2.md`; the F1 keybinding +
`hint` command, the `hint_ids` per-form keying + `hint_key_for_input_in_mode`,
`last_error_hint_key` + `friendly::error_hint_class`, the `note_hint*`
renderers, and the `hint.cmd.*`/`hint.err.*` corpus for every command form
+ the 9 runtime error classes, with the comprehensiveness coverage test
and the ADR-0051 strip advertising F1). Closes **A1** + requirements
**H2**. Deferred: the pre-submit-diagnostic route + `diagnostic.*` blocks
(#38), clause-concept hints (#37). Revised after a `/runda` review
(2026-06-14): corrected the verbosity-default fact; re-keyed tier-3
content off `help_id`; split the pre-submit-diagnostic and runtime-error
paths; added a comprehensiveness coverage test. Revised again during
Phase B implementation (2026-06-15): the first exemplar showed per-*node*
keying is too coarse for multi-form commands (`add`/`drop`/`show`/
`create`), so D3 now keys tier-3 content **per form** via a
`hint_ids: &[&str]` array mirroring `usage_ids` — and **clause-concept
hints** are recorded as a deferred extension (issue #37). During Phase C
the **pre-submit-diagnostic route + the ~33 `diagnostic.*` blocks** were
**deferred** (issue #38) — `Diagnostic` doesn't carry its class key, so
the route needs a broad change for marginal value (D6). v1 therefore
ships command-form hints + the 9 runtime error-class hints. The parallel
question of whether the in-app `help` command should likewise distinguish
advanced-SQL forms is tracked **separately** as Gitea issue #36.
Decided in conversation 2026-06-14. Closes the last open piece of **A1**
(the canonical app-command set, ADR-0003): every app command is
implemented except `hint`, which ADR-0003's command table listed as
*"Request a hint for the current input (ADR pending)."* This ADR is that
pending decision. Tracked as **H2** in `docs/requirements.md`.
References ADR-0003 (app-command set + the `:` escape), ADR-0019 (the
friendly error layer / H1), ADR-0021 (per-command usage templates / H1a),
ADR-0022 (ambient typing assistance — colour + hint panel + completion),
ADR-0027 (input validity indicator), ADR-0046 (sidebar navigation +
responsive input hint), ADR-0049 (input-field readline keymap), and
ADR-0051 (context/state-aware keybinding strip).
## Context
`hint` is the only unbuilt app command. The naive reading — "show a hint" —
hides a real subtlety, and a real cost.
**The subtlety: a submitted `hint` command cannot see live input.** App
commands are submitted with Enter, which empties the input buffer. By the
time `hint` dispatches, the partial command it was meant to help with is
gone. So "a hint for the current input" cannot be served by a submitted
command alone — it needs a *keybinding* that acts on the live buffer
without submitting. ADR-0003 said "current input"; `requirements.md`
broadened it to "current input **or the most recent error**." Both are
wanted; they map to two different trigger surfaces.
**The cost: the value of `hint` is content, not plumbing.** The app
already carries two tiers of contextual text:
- **Tier 1** — terse, always-on: syntax colour (ADR-0022); the error
*headline* alone (ADR-0019, when `messages_verbosity: Short`).
- **Tier 2** — short contextual lines: the ambient typing prose /
`expected` set, shown live while typing (ADR-0022, catalogue
`hint.ambient_*` / `hint.value_slot_*`); and the error `hint:` field —
which, because `Verbosity::Verbose` is the **default**
(`src/friendly/translate.rs:46`), is shown **by default** beneath every
error headline (`messages short` is the opt-*out*, not `messages
verbose` the opt-in).
So the verbose error hint is **already on screen by default**. If `hint`
merely re-showed it, it would duplicate what the user can already see (and
the ambient panel). To justify itself, `hint` must add a **tier 3**: a
genuinely deeper, *teaching*-grade explanation — what the command/error
means, a worked example, and the underlying relational concept. That
corpus does not exist yet, and
authoring it (to the standard of a teaching tool, where "pedagogy wins
ties") is the bulk of the work.
The mechanism is small and reuses everything already present: the command
REGISTRY (`src/dsl/grammar/mod.rs`), the `AppCommand` enum
(`src/dsl/command.rs`), key dispatch (`App::handle_key`,
`src/app.rs:1155`), the `note_help`/`note_help_topic` renderers
(`src/app.rs:2982`/`3021`), the parser/walker expected-set
(`ParseError.expected`, `WalkResult.tail_expected`), the friendly
catalogue + `t!` macro + `keys.rs` validation, and the output styling
vocabulary (`OutputStyleClass::Hint`).
## Decision
### D1 — Two surfaces, no topic argument
`hint` is delivered through **two complementary surfaces**:
1. **F1 keybinding → live input.** Pressing **F1** while typing renders a
tier-3 hint for the command currently in the buffer, into the output
panel, **without submitting or altering the buffer**. This is the
primary, most-valuable path (it serves the literal "current input").
2. **`hint` command → most recent error.** Submitting `hint` renders the
tier-3 expansion of the most recent error. This is why the command
exists despite the empty-buffer problem: the thing it helps with is
the *last thing you tried*, not the now-empty buffer.
`hint` takes **no topic argument**. Explicit per-command reference is
already `help <topic>` (H3); `hint` is purely *contextual*, which keeps
the two cleanly distinct (`hint` = "help me with what I'm doing right
now"; `help insert` = "show me the insert reference").
F1 is a **read-only overlay**: it never alters the input buffer, the
cursor, or the live completion memo (ADR-0022) — it only emits a block
into the output journal. (It must therefore be handled in `handle_key`
*before* the "any other key clears the memo" fall-through.)
### D2 — Trigger matrix
| Trigger | Buffer / state | Result |
|---|---|---|
| **F1** | non-empty input | tier-3 hint for the command being typed. (No "expected next" line — the always-on tier-2 ambient panel already shows it live; tier-2 owns position-awareness.) |
| **F1** | empty input, a recent error exists | tier-3 expansion of that error |
| **F1** | empty input, no recent error | a short "getting started" pointer (press F1 while typing a command; `help` for the full list) |
| **`hint`** (submitted) | a recent error exists | tier-3 expansion of that error (primary use) |
| **`hint`** (submitted) | no recent error | the same "getting started" pointer |
F1 is inert behind a modal and while a sidebar panel holds navigation
focus (consistent with the existing `handle_key` gates, ADR-0046); it is
active in the input context in both Simple and Advanced mode.
**Error routes.** **Runtime errors** (the 9 `translate_error` classes)
occur *after* submit; the **`hint` command / empty-input F1** path reads
them via the stored `last_error_hint_key` (D5) and renders their
`hint.err.<class>` block. (A second route for **pre-submit diagnostics**
on the F1 live-input path was specified but is **deferred** — D6 / issue
#38; with a diagnostic present, F1 shows the command block and tier-2
shows the diagnostic.) **`:`-prefix handling:**
on the simple-mode one-shot escape (`: SELECT …`), command
identification for the F1 path strips the leading `:` first, so the
advanced form is matched.
### D3 — The tier-3 content model
Tier-3 blocks live in the friendly catalogue under the existing `hint:`
top-level namespace (where tier-2 ambient strings already live), in two
new sub-namespaces:
- **`hint.cmd.<hint_id>`** — one per command **form**, keyed by a **new
`hint_ids: &'static [&'static str]`** field on `CommandNode`
(`src/dsl/grammar/mod.rs:512`), **mirroring the existing `usage_ids`**.
The F1 live-input path resolves the current input to its form's hint key
via `hint_key_for_input_in_mode`, which reuses the same form-word
disambiguation as `usage_key_for_input_in_mode`.
**Why an array mirroring `usage_ids`, not a per-node `hint_id`**
*(`/runda`/implementation revision, 2026-06-15)*: a single per-node key
is too coarse. Several entry words are **one node spanning many forms**
`add` (column/relationship/index/constraint), `drop` (table/column/
relationship/index), `show` (data/table/tables/relationships/indexes),
`create` (table/index). A live-input hint for `add 1:n relationship` is
only useful if it is *specific to relationships*, so the content must be
**per form**, not per node. The project already solved exactly this for
usage templates (`usage_ids` is a per-form array, disambiguated by the
form word), so `hint_ids` mirrors it. Single-form nodes carry one entry;
multi-form nodes carry one per form. This also covers the advanced-SQL
forms whose `usage_ids` are empty (`SQL_INSERT/UPDATE/DELETE`,
`EXPLAIN_SQL`) — they get their own `hint_ids` directly, independent of
usage, with mode-correct SQL examples. (The `help`-list collapse of
advanced-SQL forms is a separate gap — issue #36.)
**Deferred extension — clause-concept hints** (issue #37): per-form is
the right granularity for tier-3 *teaching* (position-awareness within a
form is owned by tier-2 ambient + the live `Next:` line, D4). But some
**concepts live inside a clause**, not a form — `… on delete ⟨cascade|
set null|restrict⟩` (referential actions), the `create table` constraint
slots (`primary`/`unique`/`check`/`foreign`), `with pk`, `1:n`/`m:n`
cardinality. A learner parked in such a clause may want teaching deeper
than tier-2's candidate list but narrower than the whole-form block. v1
does **not** build this (it would multiply content for points whose value
we can't yet measure, and we don't expect to accumulate usage statistics
to drive it empirically — it will be tackled as a deliberate follow-up
job). The keying does not lock it out: a later `hint.concept.<topic>`
namespace can be surfaced when the cursor sits in a recognized clause,
layered on top of the per-form block.
- **`hint.err.<class>`** — one per error/diagnostic class, keyed by the
friendly error/diagnostic key (e.g. `hint.err.foreign_key.child_side`,
`hint.err.type_mismatch`, `hint.err.insert_arity_mismatch`). Used by
both error routes (D2).
Each tier-3 block is a **structured entry with three labelled parts**, so
the voice stays consistent and the renderer can style them uniformly:
```yaml
hint.cmd.dsl.insert:
what: "Add one or more rows to a table."
example: "insert into Customers values ('Ann', 'ann@x.io')"
concept: "A row is one record; each value lines up with a column, in
order. Columns typed `serial`/`shortid` fill themselves — leave them out."
```
- **`what`** — one or two plain sentences: what this command does / what
this error means.
- **`example`** — a single concrete, copyable line (rendered neutral, not
muted, so it stands out as runnable).
- **`concept`** — the underlying relational idea, in teaching voice; the
part that makes this tier-3 rather than tier-2.
`concept` is optional where there is genuinely no concept beyond the
mechanics (e.g. `quit`); `what` + `example` are always present.
### D4 — Rendering
Both surfaces render through the `App::note_hint*` family (sibling of
`note_help`/`note_help_topic`, `src/app.rs`) via `emit_tier3_block`,
emitting into the `output` buffer as `OutputKind::System`: a **`Hint`
heading** followed by aligned **`What:` / `Example:` / `Concept:`** lines
(labels + heading from `hint.block.*`). The `concept` line is muted
(`OutputStyleClass::Hint`); the rest are plain. The block is
**persistent** (scrolls in the journal), unlike the transient ambient
panel — pressing F1 is an explicit request to *keep* the deeper guidance
on screen. Its rendered shape is locked by an `insta` snapshot
(`hint_block_insert`). The bottom keybinding strip (ADR-0051) advertises
F1 in the editing (leading) and default states.
### D5 — "Most recent (runtime) error" state
The **runtime-error route** (submitted `hint`, and empty-input F1) needs
to map the last runtime error back to its `hint.err.<class>` key. Runtime
errors today live only as rendered text in the `output` buffer. We add a
single small piece of `App` state — **`last_error_hint_key:
Option<String>`** — set at the `translate_error` call sites
(`runtime.rs:2615`, `app.rs:2424`) when a friendly error is rendered,
cleared when a later command succeeds. Absent → the "getting started"
pointer.
The **pre-submit-diagnostic route** (the F1 live-input path reading the
under-cursor diagnostic) is **deferred** — see the scope note in D6.
### D6 — Content scope for v1
v1 ships tier-3 content for the **command forms and runtime error
classes** — comprehensive for those (the graceful tier-2 fallback below
is a safety net, not the plan):
- **~37 command forms** — every distinct node in `REGISTRY` gets its own
`hint.cmd.<hint_id>` block (app + DSL + DDL + advanced-mode SQL forms),
each with a **mode-correct example** (the advanced-SQL forms show SQL
syntax, their simple siblings show DSL — no sharing).
- **9 runtime error classes** — `unique`, `foreign_key` (child/parent
side), `not_null`, `check`, `type_mismatch`, `not_found`,
`already_exists`, `generic`, `invalid_value` — each gets a
`hint.err.*` block.
**Deferred — the ~33 `diagnostic.*` pre-submit classes and the F1
diagnostic route** *(Phase C scope decision, 2026-06-15; issue #38)*. The
original "comprehensive" scope included them, but implementation revealed
`Diagnostic` (`walker/outcome.rs`) carries only its rendered `message`,
not its class key — so a live diagnostic can't be mapped to
`hint.err.<class>` without adding a `class` field threaded through every
diagnostic-creation site (a broad change). Weighed against the value, it
isn't worth it for v1: pre-submit diagnostics are already surfaced by
tier-2 (ambient message + validity indicator, ADR-0027); F1 still shows
the useful command block when a diagnostic is present; and many
diagnostic classes duplicate runtime classes already covered
(`type_mismatch`, `unknown_table``not_found`, arity↔`invalid_value`).
Deferred to issue #38, additively (the keying doesn't lock it out).
The full enumerated checklist is the implementation plan's tracking
artifact (see *Content inventory*, below).
**Fallback (safety net):** if a tier-3 key is ever missing at runtime,
the surface degrades to tier 2 — the ambient prose for the command path,
or the verbose error `hint:` for the error path — never to a blank or an
error. The `keys.rs` build-time validation keeps the corpus honest, so a
missing key is caught in tests, not in front of a student.
### D7 — Authoring process: exemplars-first
Because the corpus is large and its *voice* is a pedagogical decision the
maintainer owns, content is produced in two stages:
1. This ADR carries **23 worked exemplars** (below) as the canonical
style reference. The `/runda` review of this ADR is where the voice and
depth are approved.
2. Once approved, the remaining blocks are authored to that template in
**reviewable batches** (grouped by area: DDL, DML, app commands,
error classes), not one monolithic drop.
### Exemplars (the style reference; shipped as the rendered format)
**Command (F1 live-input), `insert`** (the rendered shape, locked by the
`hint_block_insert` snapshot — a `Hint` heading + aligned labels, no
`Next:` line since tier-2 owns position-awareness):
```
Hint
What: Add one or more rows to a table.
Example: insert into Customers values ('Ann', 'ann@example.io')
Concept: A row is one record; each value lines up with a column, in
order. Columns typed serial/shortid fill themselves — leave
them out.
```
**Error (`hint` command), foreign-key child-side violation:**
```
Hint
What: The value you gave for the child column doesn't match any
parent row, so the foreign key has nothing to point at.
Example: First insert the parent (insert into Customers …), then the
child that references it.
Concept: A foreign key is a promise that every child points at a real
parent, so the parent must exist first. To allow orphans on
delete instead, set the relationship's `on delete` to
`set null` or `cascade`.
```
**Command (F1 live-input), `add 1:n relationship`:**
```
Hint
What: Link two tables so a parent row can own many child rows.
Example: add 1:n relationship from Customers.id to Orders.customer_id
Concept: The "1:n" means one parent, many children. The child column
holds the foreign key; `--create-fk` adds it for you if it
doesn't exist yet.
```
## Forks (all user-chosen, 2026-06-14)
- **Trigger model:** both a keybinding (live input) and a submitted
command (last error), rather than command-only or keybinding-only — the
live-input path is the most useful, but the command completes the A1
slot and serves the error case.
- **Keybinding = F1:** the universal help convention; the key is
genuinely free (no `KeyCode::F(1)` binding exists today — the `"F1"`
strings in `input_render.rs`/tests are scenario labels, not the key, and
ADR-0022 uses no `F1` requirement label). No collision with the ADR-0049
readline keys, `Ctrl-O` (ADR-0046), `Esc`-clear, or the reserved
`Ctrl-C` cancel (I5). Rejected: `?` (a typeable character — fiddly
position-dependent handling) and a Ctrl/Alt chord (less discoverable, no
advantage).
- **No topic argument:** contextual only; `help <topic>` already owns
explicit reference lookup.
- **Comprehensive content for v1:** the full inventory, not a starter
subset.
- **Exemplars-first authoring:** lock the voice on a few blocks, then
mass-author to template.
## Consequences
- **A1 closes.** With `hint` registered and built, all 15 canonical
app-level commands exist in both modes.
- **A third contextual tier exists.** Students get on-demand, teaching-
grade guidance that is deeper than the always-on colour, the headline,
the ambient one-liner, and the verbose error hint — without cluttering
those terse defaults.
- **One new keybinding (F1)** joins the keymap and the ADR-0051 strip.
- **A new `hint_ids: &[&str]` field on `CommandNode`** (mirroring
`usage_ids`) + a `hint_key_for_input_in_mode` lookup (reusing the
`usage_key_for_input_in_mode` form-disambiguation), one new field of
`App` state (`last_error_hint_key`), and one new renderer family
(`note_hint*`); the `AppCommand` enum gains `Hint`, the grammar a `HINT`
node, the REGISTRY one entry.
- **A durable content corpus** (~37 command blocks + 10 runtime
error-class blocks) enters the catalogue under `hint.cmd.*` /
`hint.err.*`, validated by `keys.rs`. This is ongoing surface area: new
commands/error classes should ship with their tier-3 hint (a checklist
item for future feature ADRs). (Diagnostic-class blocks deferred — #38.)
- **Testing:** Tier-1 unit tests for the trigger matrix (F1 with
empty/non-empty input; `hint` with/without a recent error;
`last_error_hint_key` set on the `translate_error` sites and cleared on
success; the mode-aware form resolution; the `:` strip), the
command-identification logic, and the tier-2 fallback; Tier-2 `insta`
snapshots for a representative rendered hint block; Tier-3 integration
tests for the end-to-end flows (type a partial command → F1 → block
appears, **buffer and completion memo untouched**; run a failing
command → `hint` → error expansion). **A comprehensiveness coverage
test** (enforces D6): iterate the REGISTRY and assert every node with a
`hint_ids` entry resolves to a `hint.cmd.*` block, and every runtime
error class resolves to a `hint.err.*` block — `keys.rs` only checks
that *referenced* keys resolve, not that every command/error *has* one,
so this test is what makes the scope enforceable rather than
aspirational. (Diagnostic classes are out of this scope — D6 / #38.)
## Out of scope
- **Per-topic `hint <topic>`** — OOS (rejected): `help <topic>` already
serves explicit lookup; a topic arg would overlap it and double the
content-authoring surface.
- **Re-showing tier-3 inline as the always-on ambient hint** — OOS
(rejected): the ambient panel stays terse by design (ADR-0022); tier-3
is on-demand. Promoting it would defeat the tiering.
- **Localised tier-3 content beyond `en-US`** — OOS (deferred): the
catalogue is structured for i18n (ADR-0019), but additional locales
follow the project's English-only-for-v1 stance (requirements X2).
- **`hint` for a *successful* command's deeper teaching** (e.g. "you just
created a table — here's what an index would add") — OOS (deferred): a
plausible future tier-3 use, but v1 scopes the command path to errors
and the F1 path to in-progress input.
- **Clause-concept hints** (`… on delete ⟨action⟩`, constraint slots,
`with pk`, cardinality) — OOS (deferred, issue #37): a
`hint.concept.<topic>` layer surfaced when the cursor sits in a
recognized clause, deeper than tier-2's candidate list but narrower than
the per-form block. Per-form keying (D3) does not lock it out. To be
tackled as a deliberate follow-up job, not gated on usage statistics.
- **Pre-submit-diagnostic route + `diagnostic.*` tier-3 blocks** — OOS
(deferred, issue #38): needs a class field on `Diagnostic` threaded
through every creation site (broad change) for marginal value, since
tier-2 already surfaces diagnostics and many duplicate runtime classes
(D6).
## Content inventory (implementation tracking)
The implementation plan enumerates and checks off every block:
- **`hint.cmd.<hint_id>`** — one per distinct `REGISTRY` node (~37), each
with its own `hint_id` and a mode-correct example: app (`save`, `save
as`, `load`, `new`, `rebuild`, `export`, `import`, `replay`, `undo`,
`redo`, `mode`, `messages`, `copy`, `help`, `hint`, `quit`); DDL
(`create table`, `create m:n`, `add column`/`relationship`/`index`,
`drop`, `rename`, `change column`); DML (`insert`, `update`, `delete`,
`show`, `seed`, `explain`, `select`/`with`). The **7 advanced-mode SQL
forms** (`SQL CREATE TABLE`, `ALTER TABLE`, `CREATE/DROP INDEX`, `DROP
TABLE`, `SQL INSERT/UPDATE/DELETE`, `EXPLAIN SQL`, raw `SELECT`/`WITH`)
each get their **own** block with SQL syntax — they do **not** reuse
their simple sibling's (this is the `/runda` correction; the parallel
`help`-side gap is issue #36).
- **`hint.err.*`** — one per runtime error class (`unique`,
`foreign_key.{child,parent}_side`, `not_null`, `check`,
`type_mismatch`, `not_found`, `already_exists`, `generic`,
`invalid_value`). The `diagnostic.*` pre-submit classes are **deferred**
(D6 / issue #38).
+10 -2
View File
File diff suppressed because one or more lines are too long
+195
View File
@@ -0,0 +1,195 @@
# ADR-ci-001: CI + release pipeline on Gitea Actions
## Status
**Accepted (2026-06-12); implemented the same day on the `ci` branch.** Every
fork below was settled with the user as the pipeline was built, and each stage
was verified live before acceptance:
- a throwaway probe workflow established how the runner executes jobs;
- the CI image was built and checked locally (runner contract, warm devShell);
- the gate ran green (**clippy clean; 2424 tests pass / 0 fail / 1 intentional
ignored doctest**);
- the release was exercised end-to-end — tag `v0.0.0-citest2` published a Gitea
release carrying the static binary (~10 MB) and its `.sha256`.
This ADR records the **CI/release pipeline**. The **dev/build environment it
runs on** — the nix flake (devShell + reproducible build, pinned Rust 1.95.0)
— is **ADR-ci-002** (relocated here from main's ADR-0049); this ADR builds on
it rather than restating it.
> **Namespacing.** Kept in `docs/ci/adr/` (id `ADR-ci-001`), disjoint from
> `main`'s integer ADR sequence, mirroring the website subproject's
> `docs/website/adr/`. This avoids the cross-branch number collisions that
> previously forced website ADRs to be renumbered (see that namespace's
> history note and ADR-0000 "Numbering discipline").
## Amendment — 2026-06-13: D1 matrix (non-macOS)
§3 (Release) below describes the original **single-target** (x86_64 Linux) job.
The release is now a **`test``build` matrix** over the four non-macOS D1
targets (Linux + Windows × x86_64/aarch64), cross-built with `cargo-zigbuild`.
The full decision — tooling, targets, the Windows `synchronization` stub, the
matrix shape, and the macOS deferral with its licensing rationale — is recorded
in its own record: **[ADR-ci-003](20260613-adr-ci-003.md)**.
## Context
The project is near feature-complete and needs CI (`requirements.md` **TT5**;
the **CI** item in the deferred list) and a release path for its distributed
binaries (**D1**/**D2**/**D3**). The self-hosted Gitea instance
(`git.lazyeval.net`) has its Actions runner freshly set up — a first-time
in-anger use — with a DinD-capable setup and a reusable `docker-build`
template, exercised by a handful of sample workflows.
The starting constraints, and what the probe found:
- The runner label is **`ci-public`**. A throwaway probe
(`ci-probe.yaml`, since removed) established that **jobs run *inside* a
container** — `ghcr.io/catthehacker/ubuntu:act-22.04` by default, as **root**
— and therefore the runner *host's* nix is **not** on the steps' PATH
(`nix NOT on PATH`, `no /nix`). A custom job `container:` *can* be pulled
(it pulled `nixos/nix:latest`), but the runner keeps job containers alive
with `entrypoint: /bin/sleep` and runs JS actions (e.g. `actions/checkout`)
with `node`, so the container must provide **`sleep` + `bash` + `node`** —
a bare `nixos/nix` image has none and fails to start.
- The reusable template only does `docker build`; it neither runs a Rust gate
nor pushes images nor uploads release assets — so a Rust pipeline can't just
call it.
- The whole motivation (per the user) is for CI to use the project's **nix
flake** for its tools rather than relying on whatever the build machine has
— i.e. **one toolchain definition shared by dev and CI**.
## Decision
### 1. Toolchain delivery — a baked nix CI image
CI gets its toolchain from a **purpose-built job-container image**, not from
host nix and not by installing nix per-job:
- **Base `node:22-bookworm-slim`.** Debian slim already provides `bash` +
coreutils (`sleep`); the `node` tag adds the actions runtime. This satisfies
the act_runner job-container contract at a fraction of the size of the
catthehacker runner images (chosen on the user's prompt to avoid those
multi-GB images), and far more reliably than a bare `nixos/nix` (which can't
start). `.gitea/ci-image/Dockerfile`.
- **Single-user nix on top**, flakes enabled, with the **flake's devShell
pre-warmed** (`nix develop` realizes nixpkgs + the pinned Rust toolchain +
`cargo-sweep` + the musl cc into the store). CI then runs `nix develop -c …`
against a warm store — the *same* pinned toolchain as dev (ADR-ci-002),
reaching a ready toolchain in ~1.4 s.
- **Built + pushed by `build-ci-image.yaml`** via the DinD service to the
Gitea container registry as `git.lazyeval.net/<owner>/rdbms-playground-ci`,
a **public** package (anonymous pull, no gate-side credentials). It runs only
when an image input changes (Dockerfile / `flake.nix` / `flake.lock` /
`rust-toolchain.toml`) or on manual dispatch.
### 2. Gate — `ci.yaml`
On branch pushes and PRs, a single job runs **inside the CI image**:
`nix develop -c cargo clippy --all-targets -- -D warnings` then
`nix develop -c cargo test --no-fail-fast`.
**`fmt` is deliberately not gated.** The tree isn't clean under stock
`rustfmt` (~100 files would change; no `rustfmt.toml` is committed) and
reformatting would churn blame across the in-flight website branch and ongoing
`main` work — so, by user decision, the gate is **clippy + test** and fmt is
revisited on `main` (also recorded in ADR-ci-002).
### 3. Release — `release.yaml`
On a `v*` tag, one job in the CI image:
1. **tests** (`cargo test`) — so a tag can never publish untested code, even
one pointing at a never-gated commit (user choice over relying solely on the
branch gate);
2. **builds the static binary** for **`x86_64-unknown-linux-musl`** (D2:
single static binary, no runtime deps). The glibc/nix-store build is
non-portable; the musl target with `crt-static` is fully static. rusqlite's
`bundled` SQLite C is compiled by a **musl `cc`** (`pkgsCross.musl64`) wired
into the flake devShell via `CC_<target>` + `CARGO_TARGET_<TARGET>_LINKER`;
`[profile.release] strip = "symbols"` trims it (~13 MB → ~10 MB);
3. **publishes** the binary + a `.sha256` to a Gitea release via the API and
the auto-provided **`GITEA_TOKEN`** — no third-party action (just `curl` +
`node`, both in the image).
### 4. Triggers — branch vs tag hygiene
- Gate and image-build are scoped to **branch** pushes (`branches: ['**']`).
Tag pushes ignore `paths:` filters and would otherwise spuriously rebuild the
unchanged image and re-gate an already-gated commit; the branch filter
excludes tags. **`release.yaml` owns tags** (`tags: ['v*']`).
- Pushing commits + a tag together still gates the commits (via the branch
ref) and releases (via the tag ref) — no lost coverage, no duplicate runs.
### 5. Auth
- **Image push:** a dedicated PAT with `write:package`, supplied as the
`REGISTRY_USERNAME` / `REGISTRY_TOKEN` Actions secrets (the package owner
must match the token's user — an `oli`-namespace push with a different user
is refused with `reqPackageAccess`).
- **Release publish:** the auto `GITEA_TOKEN` (repo/release scope).
### 6. Scope this iteration — Linux x86_64, step by step
The user's target is the full **D1** matrix, approached incrementally. This
iteration ships **Linux x86_64 only**; the rest is deferred (below).
## Consequences
- **One toolchain, dev and CI.** They build through the same flake and cannot
drift. New image rebuilds only when the flake/toolchain/Dockerfile change.
- **D2 is met on Linux.** The release artifact is a genuinely static,
stripped musl binary that runs with no runtime dependencies.
- **DinD is per-job (no layer cache across runs),** so every `build-ci-image`
run rebuilds from scratch (~6 min). Acceptable at its trigger frequency;
base-pull caching via the `dind-cached` proxy variant is a possible later
optimisation.
- **The CI image is ~5.5 GB+** (the Rust toolchain closure, now also musl).
Pulled once per runner and cached; slimming (multi-stage, prune) is optional.
- **Every gate run recompiles the full dependency graph** (warm *toolchain*,
cold *deps*; clippy and test don't share artifacts), ~2 min total. Fine for
now; dependency/`target` caching is a deferred speed item.
- **`GITEA_TOKEN` must retain release scope;** if an instance policy narrows
it, the release publish falls back to a repo-scoped PAT secret.
## Alternatives considered
- **Run on the runner host's nix.** Rejected — the probe showed steps run in a
container where host nix is unreachable.
- **Install nix per-job in the default image.** Works but cold every run
(slow) and throwaway once the image exists; rejected in favour of the baked
image.
- **`catthehacker` or bare `nixos/nix` as the base.** catthehacker is a
multi-GB runner emulation we don't need; bare `nixos/nix` lacks
`sleep`/`bash`/`node` and won't start. `node:22-bookworm-slim` is the small,
contract-satisfying middle (user's suggestion).
- **A standard `rust:1.95` CI image instead of the flake.** Simpler in CI but a
*second* toolchain definition (drift) — counter to the unify-with-dev goal.
- **A third-party Gitea release action.** Avoided; the API + auto token keep
the release self-contained and debuggable.
## Deferred / out of scope (tracked, step by step)
- **D1 matrix:** **macOS only** now (x86_64 + aarch64). The four non-macOS
targets shipped via cargo-zigbuild (see the 2026-06-13 amendment); macOS needs
Apple's SDK (osxcross + private SDK, or a Mac runner).
- **D3 packaging:** Homebrew / Scoop / winget / `cargo-binstall` manifests
(and binstall-friendly asset naming/archives).
- **Tier 4 (PTY E2E):** still unwired (`requirements.md` **TT4**); the gate runs
tiers 13 only, so **TT5** ("CI runs all tiers on Linux/macOS/Windows") is
partially met — Linux, tiers 13.
- **CI speed:** dependency/`target` caching (cargo-chef into the image, or
`actions/cache`), and image slimming / `dind-cached` base-pull caching.
- **Website deploy:** the static site → Cloudflare via Gitea Actions (a
separate, simpler workflow on the website branch).
- **fmt gate:** revisit on `main` once a `rustfmt` style is chosen.
## Relationship to other decisions
- **Builds on ADR-ci-002** (nix flake dev + build env). This ADR adds the
musl-target/cc to that flake and consumes it from CI.
- **Advances `requirements.md`:** **TT5** (CI runs the tiers — Linux, 13),
**D2** (static binary — Linux, done), **D1**/**D3** (partial/deferred).
- **Mirrors the website subproject's** separate ADR namespace and its
static→Cloudflare-via-Gitea-Actions deployment posture (ADR-website-001).
+135
View File
@@ -0,0 +1,135 @@
# ADR-ci-002: Nix flake for a reproducible dev + build environment
## Status
**Accepted (2026-06-12).** Implemented the same day on the `ci` branch:
`flake.nix`, `flake.lock`, `rust-toolchain.toml`, `.envrc`. Verified
end-to-end before acceptance — `nix develop` provides the pinned
toolchain; `nix build .#default` produces a working binary; `cargo
clippy --all-targets -- -D warnings` is clean and `cargo test` is
**2424 passed / 0 failed / 1 ignored** (the ignored item is the
intentional ```` ```ignore ```` doctest at `src/friendly/mod.rs:21`),
all run *through the flake*. This ADR is the dev/build-environment
foundation; the CI **pipeline** that consumes it (runner model, image,
gate, release) is **ADR-ci-001**.
> **History.** Created as **ADR-0049** in `main`'s integer ADR namespace
> (`docs/adr/`); moved here to **ADR-ci-002** on 2026-06-12 to keep the
> CI/dev-env decisions out of `main`'s sequence and end the cross-branch
> number collision (`main` independently reaches for the next integer too —
> the same problem the website subproject hit). Content is otherwise
> unchanged. See ADR-0000 "Numbering discipline".
## Context
The project is near feature-complete and CI is finally being set up
(`requirements.md` **TT5**, **CI** in the deferred list). CI must not
depend on whatever Rust/toolchain happens to be installed on the build
machine — that is neither reproducible nor honest about what the build
needs.
The sibling project **datamage** already solved this with a Nix flake
(its ADR 0046): the flake is the single, version-pinned declaration of
the toolchain, and both the dev shell and CI go through it so they
cannot drift. We adopt the same pattern here. Ours is dramatically
simpler than datamage's — this is a pure-Rust TUI with no Tauri /
WebKitGTK / Node / WASM surface — so the flake carries almost no system
dependencies.
Two build facts drove the (tiny) dependency set, confirmed from
`Cargo.lock`:
- **`libsqlite3-sys` is built with `bundled`** → SQLite is compiled
from vendored C, which needs a C compiler. `nixpkgs`' `stdenv`
provides one automatically; nothing is declared for it.
- **`arboard`'s clipboard backend is `x11rb`** — a pure-Rust socket
XCB client that links *no* C X11 libraries. So no X11/`pkg-config`
system inputs are needed to build or test. A live X server is only
required at *runtime* to actually copy; headless sessions fall back
to OSC 52.
## Decision
Adopt a **Nix flake** at the repository root as the canonical
declaration of the dev *and* build environment.
- **`flake.nix`** exposes two outputs (user-chosen 2026-06-12 over a
dev-shell-only variant):
- **`devShells.default`** — the pinned Rust toolchain (from
`rust-toolchain.toml` via `rust-overlay`) plus `cargo-sweep` for
the `target/` build-hygiene discipline (CLAUDE.md / the datamage
ADR 0050 equivalent).
- **`packages.default`** (= `packages.rdbms-playground`) — a
`rustPlatform.buildRustPackage` that produces the binary
reproducibly from the pinned toolchain and the committed
`Cargo.lock` (`cargoLock.lockFile``importCargoLock`, which
fetches each dependency by its lockfile checksum: offline,
deterministic, no `cargoHash` to churn). `nix build` yields the
artifact CI's gate/release can consume.
- **`rust-toolchain.toml`** pins an **exact stable release**
(`1.95.0`), not the floating `stable` channel, so `nix flake update`
cannot surprise-bump Rust into new clippy lints that would fail the
`-D warnings` gate (same reasoning as datamage ADR 0046). Components:
`rustfmt` + `clippy`. No coverage/WASM tooling and no
cross-compilation targets yet — those are added when the release
matrix needs them, not before.
- **`flake.lock`** pins every input (`nixpkgs` `nixos-26.05`,
`rust-overlay`, `flake-utils`) to a commit, making the env
bit-reproducible.
- **`.envrc`** contains `use flake` for direnv auto-activation, kept
for parity with datamage even though direnv is not installed on the
current dev VM (entry is via `nix develop`).
- **`packages.default` sets `doCheck = false`.** The test suite is
*not* run during `nix build` — the Nix build sandbox has no `HOME`
and no X server, which fights the project-directory / clipboard
paths the tests touch. Tests run as their own CI stage via
`nix develop -c cargo test`, keeping "build the artifact" and "run
the suite" cleanly separate.
- **The package version is read from `Cargo.toml`** via
`builtins.fromTOML`, so it never drifts from the crate metadata.
## Consequences
- **One toolchain definition.** Dev and CI share the exact pinned
toolchain; they cannot drift. New contributors run `nix develop`
(or get auto-activation via direnv) and have the same Rust as CI.
- **D2 (static binary) is unaffected and still pending.** The
`nix build` artifact links the Nix-store glibc *dynamically* — it is
a reproducible build/test artifact, **not** the single static
release binary D2 calls for. Release binaries will target a static
toolchain (e.g. `x86_64-unknown-linux-musl`) in the forthcoming CI
release work; that is a release-step concern, not a dev-shell one.
- **`fmt` is deliberately *not* gated yet.** The tree is not clean
under stock `rustfmt` (~100 files would change; no `rustfmt.toml` is
committed and the code was shaped by something other than default
`rustfmt`). Reformatting churns blame across every file and would
conflict with the in-flight website branch and ongoing `main` work,
so — user decision 2026-06-12 — the `fmt` gate is left out for now
and revisited on `main`. The CI gate is `clippy` + `test`.
- **Engine-name posture (CLAUDE.md) is respected.** The flake's
comments may name SQLite/`rusqlite` where technically necessary
(build-input rationale); no user-facing string is affected.
## Alternatives considered
- **Dev-shell only (no build package).** Matches datamage exactly; CI
would `cargo build` inside `nix develop -c`. Rejected (user choice):
a `nix build` package gives a reproducible release artifact straight
from the pinned toolchain, which the release job wants.
- **A standard `rust:1.95` image in CI, flake for dev only.** Simpler
in CI (no nix-in-CI caching to solve), but it is a *second* place
that defines the toolchain — exactly the drift this ADR exists to
prevent. Rejected for the unified-env goal; the nix-in-CI caching
cost is solved in the CI pipeline work instead.
- **`rustup` on the build machine.** The status quo CI would replace —
non-reproducible, machine-dependent, the thing we are eliminating.
## Relationship to other decisions
- Mirrors **datamage ADR 0046** (nix flake dev env) and its build
hygiene companion. This is the rdbms-playground analogue, scoped to
a pure-Rust project.
- Feeds **ADR-ci-001** (the CI + release pipeline), which consumes this
flake for `requirements.md` **TT5** (CI runs the tiers) and the
**D1/D2/D3** distribution items (the release uses a static musl target
built through this flake).
+195
View File
@@ -0,0 +1,195 @@
# ADR-ci-003: Cross-platform release builds (the D1 matrix)
## Status
**Accepted (2026-06-13); implemented the same day on the `ci` branch.** Every
fork was settled with the user. Verified end-to-end:
- all four targets cross-build locally from Linux x86_64;
- the Linux binaries are statically linked (D2); the Windows artifacts are
valid PE32+ (x86-64 / Aarch64);
- a real release-matrix run (tag `v.0.0.0-citest3`) published **8 assets** — the
four binaries + a `.sha256` each.
**Runtime-verified (2026-06-13, by the user):** the **Linux x86_64** and
**Windows aarch64** binaries launch and run correctly — one of each OS family
and both architectures. The remaining two (**Linux aarch64**, **Windows
x86_64**) are link-clean and valid format but not yet runtime smoke-tested.
This ADR records the **cross-platform build strategy**; it sits on top of
**ADR-ci-002** (the nix flake, which now carries the cross toolchain) and
**ADR-ci-001** (the pipeline, whose release job this fills in).
## Amendment — 2026-06-14: macOS implemented (closes D1)
macOS is no longer deferred. The two `*-apple-darwin` targets now build on a
**Tart (Apple-Silicon) macOS runner** registered to Gitea — building on **real
Apple hardware** makes the SDK fully licensed, so the whole osxcross / SDK
grey-area + public-image-redistribution problem (§5 below) simply **does not
arise**. With all six D1 targets producing artifacts, **D1 is complete.**
Details, all verified on the runner via a throwaway smoke-test before wiring the
release leg:
- **`release-macos.yaml`** — `workflow_dispatch` with a `tag` input,
`runs-on: macos`. The runner registered as `macos:host`, but `:host` is
act_runner's execution-backend schema (run on host, no container), **not** part
of the label, so the label is `macos`. Steps: `cargo test` (macOS gets the only
automated test coverage outside the Linux gate — user choice) → build both
darwin targets natively through the flake (`apple-sdk` added to the devShell so
the toolchain links AppKit) → **upload to the same release** via the idempotent
create-or-get.
- **De-nix + re-sign.** The darwin stdenv bakes a `/nix/store` `libiconv` load
path into the binary (the *only* non-system dependency; everything else is
AppKit/Foundation/CoreGraphics/IOKit + `libSystem`/`libobjc`). The release step
rewrites it to `/usr/lib/libiconv.2.dylib` with `install_name_tool` and
**re-signs ad-hoc** (`codesign -f -s -`) — `install_name_tool` invalidates the
signature and Apple Silicon refuses an unsigned binary. A guard fails the build
if any `/nix/store` path remains. Result: portable, signed binaries (the native
one was confirmed to launch).
- **Dispatch-only, intermittent runner.** The Mac isn't always on, so macOS is a
separate dispatched workflow (not a job in `release.yaml`) — a release always
carries the four Linux/Windows assets regardless of the Mac, and the two macOS
assets are added by dispatching `release-macos` for that tag. **Caveat:** Gitea
exposes `workflow_dispatch` only for workflows on the **default branch**, so
`release-macos` becomes triggerable once the CI work is merged to `main`.
- **Cache hygiene (host-execution runner).** The runner wipes the workspace each
run, so cargo `target/` never accumulates; the persistent cache is the nix
store, bounded by **generation** — record the current devShell in a persistent
profile, keep the 2 newest generations (`nix-env --delete-generations +2`),
reclaim the rest. (The first sweep reclaimed a ~3.8 GB one-time backlog of
build scaffolding — source + build-only deps, not re-installed toolchains.)
- **D2 on macOS.** macOS binaries cannot be fully static (`libSystem` is always
dynamic); "no runtime deps" there means *system libraries only*, which the
de-nix step guarantees.
## Context
`requirements.md` **D1** asks for binaries on **Linux, macOS, Windows × x86_64
and aarch64** (six targets); **D2** asks for a **single static binary, no
runtime deps**. The CI runner executes jobs in a **Linux x86_64** container
(ADR-ci-001), so every target is **cross-compiled from Linux**.
What's feasible is decided almost entirely by one dependency — **`arboard`**
(the clipboard backend for the `copy` command). Its per-platform backends in
`Cargo.lock`:
| Target family | arboard backend | Needs a platform SDK to cross-link? |
|---|---|---|
| Linux x86_64 / aarch64 | `x11rb` (pure Rust) | No |
| Windows x86_64 / aarch64 | `clipboard-win` + `windows-sys` (import libs bundled) | No |
| **macOS x86_64 / aarch64** | **`objc2-app-kit` → links AppKit** | **Yes — Apple's SDK** |
So **four targets cross-compile with no SDK**; **macOS is the hard wall**
AppKit can only be linked against Apple's SDK.
## Decision
### 1. Tooling — `cargo-zigbuild`
Cross-compile with **`cargo-zigbuild`** (Zig's bundled clang + libc as a single
universal cross `cc`/linker), added to the flake devShell alongside `zig`. One
tool serves every non-macOS target, **including the `cc`-crate compile of
rusqlite's bundled SQLite C**, with no per-target toolchain. It replaced the
earlier single-target musl `cc` (ADR-ci-002's first cut).
### 2. Targets this iteration — the four non-macOS
Added to `rust-toolchain.toml` and the release matrix:
- **`x86_64-unknown-linux-musl`**, **`aarch64-unknown-linux-musl`** — musl +
`crt-static`, so **fully static** portable binaries (D2);
- **`x86_64-pc-windows-gnu`**, **`aarch64-pc-windows-gnullvm`** — Zig statically
links its libc, so the `.exe` is **standalone** (no mingw runtime DLLs).
### 3. The Windows `synchronization` stub
Rust's `std` links **`-lsynchronization`** (its `WaitOnAddress`-based thread
parking). That import library is normally supplied by Rust's `rust-mingw`
"self-contained" component — which **rust-overlay does not ship** — and Zig's
mingw doesn't carry it either, so the link fails with *"unable to find dynamic
system library 'synchronization'"*. The functions (`WaitOnAddress`,
`WakeByAddress*`) are **forwarded by `kernel32`** (already linked), so an
**empty stub** `libsynchronization.a` (committed at **`ci/winstub/`**, 8 bytes,
wired via **`.cargo/config.toml`** for the Windows targets *only*) satisfies the
linker without contributing symbols. Host and Linux builds are untouched by it.
### 4. Workflow shape — test once, then a build matrix
`release.yaml` is **`test``build`**:
- **`test`** runs once on the host (`cargo test`) — a tag never publishes
untested code;
- **`build`** is a **matrix over the four targets** (`needs: test`,
`fail-fast: false`), each `cargo zigbuild --release --target <triple>`, then
packages the binary (`.exe` for Windows) + a `.sha256` and uploads both to the
**shared release** via an **idempotent create-or-get** (the first matrix job
creates the release; the rest fetch it).
### 5. macOS — deferred, with rationale
macOS is **not** in this iteration. `arboard`→AppKit needs the macOS SDK, and:
- the SDK ships **only inside Xcode**; Apple's license ties its use to
**Apple-branded hardware**, so using it on a Linux runner is a **grey area**
(widely done, low enforcement, but technically against the terms);
- **redistributing** the SDK is a clearer violation — and our **CI image is
public**, so the SDK **cannot be baked into it** even if the grey area were
accepted; it would have to live in a private store;
- the **clean** path is building on **real Apple hardware** (a Mac registered as
a Gitea runner, or hosted Mac CI), where the SDK is fully licensed.
macOS therefore becomes its **own step**, choosing between **(a)** osxcross + a
**private** SDK kept out of the public image, or **(b)** a **Mac runner**. The
user decides when we get there.
## Consequences
- **D1: four of six targets met** from a single Linux runner; **D2 met on
Linux** (static musl). Windows `.exe`s are standalone.
- **Runtime coverage:** Linux x86_64 + Windows aarch64 confirmed running
(user, 2026-06-13); Linux aarch64 + Windows x86_64 are the outstanding
runtime checks.
- **Each matrix target recompiles from scratch** (~24 min; ~10 min total on the
single runner), and Zig's per-target libc cache is cold each run. Fine at
release frequency; cacheable later if it matters.
- **The empty stub depends on `kernel32` forwarding `WaitOnAddress`** (true on
Windows 8+), which covers every supported target.
- **Asset naming** `rdbms-playground-<tag>-<target>[.exe]` is close to what
`cargo-binstall` / the D3 package managers will want.
## Alternatives considered
- **`cross` (cross-rs).** Docker-image-per-target; covers Linux + Windows but
**not macOS** (no legally redistributable Apple images), and needs DinD
orchestration inside our job. Rejected — no macOS, more moving parts than
zigbuild.
- **Per-target nix cross (`pkgsCross`).** Clean for Linux-musl and
Windows-x86_64 (mingw-w64, which *does* ship `libsynchronization.a`), but
Windows-aarch64 isn't readily packaged and **macOS-from-Linux is unsupported**
in nixpkgs. Rejected — incomplete.
- **Native runners per OS.** Cleanest for macOS/Windows, but needs mac/windows
runners we don't have. Kept on the table specifically for the deferred macOS
step.
- **A real `libsynchronization.a`** (from nixpkgs mingw or a `rust-mingw`
component) instead of the empty stub. More principled, but more flake
machinery, doesn't cover Windows-aarch64, and unnecessary — the stub links
clean because the symbols resolve via `kernel32`.
## Deferred / out of scope
- ~~**macOS** (x86_64 + aarch64)~~**done** via the Tart runner (see the
2026-06-14 amendment); §5 below is the as-deferred rationale, kept for history.
- **D3 packaging** — Homebrew / Scoop / winget / `cargo-binstall` manifests
(and binstall-friendly archive naming).
- **CI speed** — caching per-target builds / Zig's libc cache.
- **Runtime smoke test** of the two not-yet-checked targets (Linux aarch64,
Windows x86_64).
## Relationship to other decisions
- **Extends ADR-ci-002** — the flake devShell now carries `cargo-zigbuild` +
`zig` and the four release targets.
- **Fills in ADR-ci-001 §3 (Release)** — that single-target job is now this
matrix.
- **Advances `requirements.md`** **D1** (4/6) and **D2** (Linux, done).
+23
View File
@@ -0,0 +1,23 @@
# CI / Build Architecture Decision Records
Decision records for the **continuous-integration + release pipeline**
subproject — the Gitea Actions workflows under `.gitea/`, the nix CI image,
and the release tooling. These are kept in their own namespace, separate
from the project-wide ADRs in [`docs/adr/`](../../adr/README.md), so CI
decisions never compete with the main global ADR sequence for numbers — the
same split the website subproject uses (`docs/website/adr/`, on the `website`
branch), and for the same reason (see
[ADR-0000 "Numbering discipline"](../../adr/0000-record-architecture-decisions.md)).
**Numbering.** Files are named `<date>-adr-ci-<NNN>.md` and referenced in
prose as `ADR-ci-NNN`. The `<date>` (the ADR's accepted/created day,
`YYYYMMDD`) plus the `ci` segment keeps the namespace disjoint from `main`'s
integers. Assign the next free `NNN` from this index. Every ADR change
updates this index in the same edit (the ADR-0000 index-upkeep rule applies
here too).
## Index
- [ADR-ci-001 — CI + release pipeline on Gitea Actions](20260612-adr-ci-001.md) — **Accepted 2026-06-12** (implemented the same day on the `ci` branch). Establishes the CI/release pipeline on the self-hosted Gitea instance's Actions runner (`ci-public`). **Runner model** (established by a throwaway probe): jobs execute *inside* a container (`catthehacker/ubuntu:act-22.04` by default), as root, so the runner host's nix is **not** reachable from steps. **Toolchain delivery:** a **baked CI image**`node:22-bookworm-slim` (satisfies the act_runner job-container contract: `/bin/sleep` keep-alive, `bash`, `node` for JS actions; a bare `nixos/nix` image lacks these and won't start) **+ single-user nix + the flake's devShell pre-warmed** — built by `build-ci-image.yaml` via DinD and pushed to the Gitea container registry as a **public** package, so CI runs `nix develop -c …` against the **same pinned toolchain as dev** (the flake, ADR-ci-002) with a warm store (~1.4 s to a ready toolchain). **Gate** (`ci.yaml`): `clippy -D warnings` + `cargo test` inside that image on branch pushes + PRs; **fmt deliberately not gated** (the tree isn't stock-rustfmt-clean — user decision, revisit on `main`; see ADR-ci-002). **Release** (`release.yaml`): on a `v*` tag, runs the tests, builds the **static `x86_64-unknown-linux-musl` binary** (D2: single static binary, no runtime deps — the glibc/nix build is non-portable), strips it, and publishes it + a `.sha256` to a Gitea release via the API and the auto-provided `GITEA_TOKEN`. **Triggers:** gate + image-build are scoped to **branch** pushes (`branches: ['**']`) so a release tag doesn't spuriously re-run them; the image-build additionally path-filters to its inputs (Dockerfile/flake/toolchain); the release owns tags. **Auth:** a dedicated PAT (`REGISTRY_USERNAME`/`REGISTRY_TOKEN` secrets) pushes the image; the auto `GITEA_TOKEN` publishes releases. **Scope:** the original release job was Linux x86_64 only; it's now the **four non-macOS D1 targets** (Linux + Windows × x86_64/aarch64) cross-built via cargo-zigbuild — see **ADR-ci-003**. macOS, D3 package-manager manifests, CI-speed dependency caching, and the website's static→Cloudflare deploy remain deferred, added step by step. Verified live: probe → runner facts; image built + checked locally; gate green (**2424 tests**); release exercised end-to-end (`v0.0.0-citest2` published with binary + checksum). Builds on **ADR-ci-002** (the nix flake, relocated here from main's ADR-0049 to avoid exactly this cross-branch collision).
- [ADR-ci-002 — Nix flake for a reproducible dev + build environment](20260612-adr-ci-002.md) — **Accepted 2026-06-12** (relocated from main's **ADR-0049** on the same day — content unchanged — to keep CI/dev-env decisions out of `main`'s integer sequence). The single, version-pinned declaration of the **dev *and* build toolchain** so CI never relies on whatever Rust is on the build machine — mirroring **datamage ADR 0046**, but far simpler (pure-Rust TUI). Root **Nix flake** with two outputs: **`devShells.default`** (pinned **Rust 1.95.0** via `rust-toolchain.toml` + `rust-overlay`, `cargo-sweep`, and the musl cc for the static release build) and **`packages.default`** (`rustPlatform.buildRustPackage` from the committed `Cargo.lock`; `doCheck = false`). Exact-pin (not floating `stable`) so `nix flake update` can't surprise-bump clippy past the `-D warnings` gate. System inputs near-empty by design (`libsqlite3-sys bundled` → stdenv cc only; `arboard``x11rb` pure-Rust). `.envrc` (`use flake`) for direnv parity. Verified through the flake: `nix build` yields a working binary, clippy clean, **2424 tests pass / 0 fail / 1 intentional ignored doctest**. Consumed by **ADR-ci-001** (the pipeline). Alternatives rejected: dev-shell-only; a standard `rust:1.95` CI image (a second toolchain definition = drift); `rustup` on the build host (non-reproducible).
- [ADR-ci-003 — Cross-platform release builds (the D1 matrix)](20260613-adr-ci-003.md) — **Accepted 2026-06-13** (implemented + a real matrix release verified the same day — tag `v.0.0.0-citest3` published 8 assets). Cross-compiles the **four non-macOS D1 targets** from the Linux x86_64 runner with **`cargo-zigbuild`** (Zig's bundled clang + libc as one universal cross cc/linker, incl. rusqlite's bundled SQLite C; added to the flake devShell, replacing the single-target musl cc): **`x86_64`/`aarch64-unknown-linux-musl`** (musl + crt-static → fully static, **D2**) and **`x86_64-pc-windows-gnu`** / **`aarch64-pc-windows-gnullvm`** (Zig statically links libc → standalone `.exe`). **Windows `synchronization` stub:** Rust std links `-lsynchronization` (WaitOnAddress thread-parking), an import lib rust-overlay's toolchain doesn't ship and Zig's mingw lacks; the symbols are forwarded by `kernel32`, so an **empty 8-byte stub** `libsynchronization.a` (`ci/winstub/`, wired via `.cargo/config.toml` for the Windows targets only) satisfies the linker. **Workflow:** `release.yaml` = **`test` once (host) → `build` matrix** over the four targets (`needs: test`, `fail-fast: false`); each job packages binary (`.exe` for Windows) + `.sha256` and uploads to the **shared release** via idempotent create-or-get. **macOS** (2026-06-14 amendment) — built natively on a **Tart (Apple-Silicon) runner** (`runs-on: macos`), which makes the SDK fully licensed and dissolves the grey-area/public-image problem; `release-macos.yaml` is **dispatch-only** (intermittent runner; becomes triggerable once CI is on `main`), de-nixes the binary's libiconv load path (`install_name_tool``/usr/lib`) + re-signs ad-hoc, and uploads to the tagged release. **D1 complete (all six targets).** Alternatives rejected: `cross` (no macOS, needs DinD), per-target nix cross (Windows-aarch64 unpackaged, macOS-from-Linux unsupported), a real `libsynchronization.a` (more machinery, doesn't cover Windows-aarch64). Runtime-verified by the user (2026-06-13): Linux x86_64 + Windows aarch64 run correctly; Linux aarch64 + Windows x86_64 are the outstanding runtime checks. Builds on ADR-ci-002 (flake) and fills in ADR-ci-001 §3 (Release).
+104
View File
@@ -0,0 +1,104 @@
# CI subproject handoff — 2026-06-15 (ci-01)
First handover for the **CI / release subproject** (the `ci` branch). Kept in
`docs/ci/handoff/`, a namespace separate from the project's global
`docs/handoff/` session sequence so it can't collide with `main`'s numbering —
the same split as `docs/ci/adr/`, and needed for the same reason: `main`
independently wrote its own **handoff-70** this same day (just as it took
**ADR-0049**), which would have collided.
A dedicated infrastructure session that built the project's **entire CI/CD
pipeline** on the self-hosted Gitea Actions runner — from nothing to a live
gate plus a six-target cross-platform release. Net: the **CI** /
`requirements.md` **TT5** item and **D1**/**D2** are now done; **D3** and a
couple of TT5 tails remain. Decisions are recorded in the sibling ADR namespace
**`docs/ci/adr/`** (ADR-ci-001/002/003).
## §1. State at handoff
**Branch:** `ci` (worktree). **`main` has been merged into `ci`** (commit
`138e766`, clean — `ci` and `main` touched disjoint files) so the gate runs
against current `main` before CI lands there. Working tree clean except the
in-progress doc updates from this handoff. Pushes/promotion are the user's
step.
**Gate verified locally on the merged code:** `clippy -D warnings` clean;
**`cargo test` 2488 passing / 0 failing / 1 ignored** (the long-standing
`friendly` doctest). main's features came in with their tests (2424 → 2488).
**Pipeline (`.gitea/workflows/`):**
- `build-ci-image.yaml` — builds + pushes the CI image (`node:22-bookworm-slim`
+ single-user nix + the flake's devShell pre-warmed) to the Gitea registry.
Triggers only on image-input changes (Dockerfile / flake / toolchain).
- `ci.yaml` — the gate: `clippy -D warnings` + `cargo test`, branch pushes + PRs
(docs-only changes skipped).
- `release.yaml` — on a `v*` tag: `test``build` matrix over the **four
non-macOS** targets via `cargo-zigbuild`, upload to the Gitea release.
- `release-macos.yaml`**workflow_dispatch** (tag input) on the Tart
Apple-Silicon runner (`runs-on: macos`): test → build both `*-apple-darwin`
→ de-nix `libiconv` + ad-hoc re-sign → upload.
**Verified live this session:** the 4-target release published **8 assets**
(binary + `.sha256` each) for tag `v.0.0.0-citest3`; the macOS build was proven
portable (system-only deps) + signed + launches on the runner.
## §2. What was built (and the non-obvious bits)
- **Nix flake** (ADR-ci-002, relocated from a would-be `main` ADR-0049): one
pinned toolchain (`1.95.0`) for dev *and* CI; `cargo-zigbuild` + `zig` (Linux
only) for the cross targets; `apple-sdk` on darwin.
- **Runner facts** (ADR-ci-001): jobs run *inside* a container (`ci-public`
`catthehacker/ubuntu`), so host nix is unreachable — hence the baked image.
The Mac runner is **host execution**; its label is `macos` (`:host` in the
registration is the act_runner backend, not part of the label).
- **Cross-compile** (ADR-ci-003): `cargo-zigbuild` for the 4 non-macOS targets.
Windows needs an **empty `libsynchronization.a` stub** (`ci/winstub/`, wired
via `.cargo/config.toml`) — std links `-lsynchronization`, absent from
rust-overlay's toolchain + zig's mingw, but forwarded by `kernel32`.
- **macOS** (ADR-ci-003 amendment): built on **real Apple hardware** (Tart), so
the SDK is fully licensed — no osxcross grey area. The darwin stdenv bakes a
`/nix/store` `libiconv` path into the binary; the build rewrites it to
`/usr/lib/libiconv.2.dylib` (`install_name_tool`) and re-signs ad-hoc
(`codesign -f -s -`; `install_name_tool` invalidates the signature, arm64
refuses unsigned). A guard fails the build on any remaining `/nix/store` dep.
- **Cache hygiene (Mac):** the runner wipes the workspace each run, so cargo
`target/` never accumulates; the persistent nix store is bounded by
**generation** (record the devShell in a persistent profile, keep the 2
newest via `nix-env --delete-generations +2`, GC the rest). First sweep
reclaimed a ~3.8 GB one-time backlog of build scaffolding (source + build-only
deps, *not* re-installed toolchains).
## §3. Immediate next steps (user)
1. **Push `ci`** → the gate re-runs in CI (should be green; no image rebuild —
the merge didn't touch the flake/Dockerfile).
2. **Promote:** `git checkout main && git merge ci` — a **fast-forward** (`ci`
already contains `main`) — then push `main`. CI goes live; `release-macos`
becomes dispatchable (workflow_dispatch needs the default branch).
3. **First real release:** tag `v0.1.0` (auto-builds the 4 Linux/Windows
assets), then **dispatch `release-macos` for `v0.1.0`** with the Mac up (adds
the 2 macOS assets) → a full 6-binary release.
4. **Cleanup:** delete the `v.0.0.0-citest*` test tags + their releases.
5. **Runner-side:** add `min-free`/`max-free` to the Mac's `/etc/nix/nix.conf`
as a hands-off nix-store backstop.
## §4. Known gaps / follow-ups
- **Versioning is not wired into the binary** (flagged by the user). The release
**git tag is nowhere in the produced binary** — there is no `--version` flag,
no `CARGO_PKG_VERSION` use anywhere in `src/`, and the release workflows use
the tag only for the *release name* + *asset filenames*
(`rdbms-playground-<tag>-<target>`). `Cargo.toml` is a static `version =
"0.1.0"`, decoupled from the tag. So a `v0.5.0` tag yields a `…-v0.5.0-…`
asset whose binary knows nothing of "0.5.0". To fix later: add a `--version`
flag, and inject the tag at build time (e.g. a `build.rs` reading a
CI-provided env, or bumping `Cargo.toml` as part of tagging) so the binary and
the release agree.
- **D3 packaging** — Homebrew / Scoop / winget / `cargo binstall` manifests
(asset naming is already binstall-friendly).
- **TT5 tails** — Windows is build-only (no execution runner); Tier-4 PTY (TT4)
is unwired in CI.
- **`fmt` gate** — deliberately off (tree isn't stock-`rustfmt`-clean); revisit
on `main`.
- **Website → Cloudflare** deploy — the separate, simpler workflow, still to do.
+21
View File
@@ -0,0 +1,21 @@
# CI / Build subproject — session handoffs
Handover notes for the **CI / release pipeline** work (the Gitea Actions
workflows under `.gitea/`, the nix flake, the release tooling). Kept in their
own namespace, separate from the project-wide session handoffs in
[`docs/handoff/`](../../handoff/), so a CI-branch handoff never competes with
`main`'s global handoff sequence for numbers — the same split the CI ADRs use
([`docs/ci/adr/`](../adr/README.md)). This is not hypothetical: `main`
independently wrote a `handoff-70` the same day this subproject's first handoff
was drafted.
**Numbering.** Files are named `<date>-handoff-ci-<NN>.md` and referenced in
prose as `handoff-ci-NN`. Assign the next free `NN` from this index.
## Index
- [handoff-ci-01 — the CI/release pipeline build-out](20260615-handoff-ci-01.md)
— Gitea Actions gate (clippy + test) + a six-target release (four via
`cargo-zigbuild` on a `v*` tag, two macOS via dispatch on a Tart runner), all
on a nix flake; decisions in `docs/ci/adr/`. Built on the `ci` branch, merged
`main` in, gate green (2488 tests), ready to promote to `main`.
+181
View File
@@ -0,0 +1,181 @@
# Website-branch handoff — 2026-06-10 (website-1)
First handoff for the **website** work. This is a **separate sequence** from
`main`'s `YYYYMMDD-handoff-NN.md` files — branch-scoped name on purpose, so
the two don't collide. Continue numbering these `…-website-handoff-N.md`.
## State
- **Branch:** `website`. **HEAD `936d925`.** Not pushed (push is the user's
step). Working tree clean.
- The website lives in **`website/`** (monorepo; the playground crate is at
the repo root). Decisions: **ADR-0044**
(`docs/adr/0044-public-website-and-documentation-site.md`). Implementation
plan: **`docs/plans/20260604-adr-0044-website.md`**. Living style guide:
**`website/STYLE.md`** (read this first — it has the binding conventions
and an open-decisions log).
## Stack & layout
- **Astro 6 + Starlight + Tailwind v4**, all under `website/`.
- `website/astro.config.mjs` — Starlight config (title, 5-section sidebar,
Expressive Code `langs`, `server.host: '127.0.0.1'`).
- `website/src/grammars/rdbms.mjs` — custom Shiki grammar, **two language
ids**: `rdbms` (real commands) and `rdbms-syntax` (abstract templates).
- `website/src/styles/global.css` — Starlight↔Tailwind bridge + the `> `
command prompt + copy-button hiding (CSS `:has()`).
- `website/src/content/docs/` — the five sections.
## Commands
```sh
cd website
pnpm install # node_modules is gitignored — reinstall on a fresh checkout
pnpm dev # serves http://127.0.0.1:4321 (see dev-server gotcha below)
pnpm build # static dist/, 24 pages, Pagefind search index
```
**Dev-server gotcha (already fixed, don't re-break):** Astro/Vite's default
`localhost` bind resolves to IPv6 `::1` here, which breaks SSH
`-L 4321:127.0.0.1:4321` tunnels. `server.host: '127.0.0.1'` in the config
pins IPv4. Tunnel with `ssh -L 4321:127.0.0.1:4321 <host>`.
**Verify after changes:** `pnpm build` clean; then from the repo root
`grep -rniE '\b(DSL|SQLite|STRICT|rusqlite|PRAGMA)\b' website/src/content/`
must be empty; internal links should resolve (build doesn't fail on broken
links — no validator installed — so sanity-check by hand or with a small
script).
## Documentation structure (5 sections, autogenerated per directory)
1. **Getting started** — install, first-project, modes, example-library. **(real)**
2. **Using the playground** — command-line-options, the-assistive-editor,
the-output-pane, projects, undo-and-history, export-and-import,
copy-to-clipboard, getting-help. **(real, grounded)** *This is "the app you
drive", distinct from the database-language Reference.*
3. **Guides** — build-the-library **(DRAFT — marked; to be iterated for
teaching quality before publication)**.
4. **Reference** — types **(real)**, tables **(real)**; columns,
relationships, indexes, constraints, inserting-and-editing-data,
querying-and-inspecting **(STUBS — real syntax synopsis + an "In progress"
note; THEY NEED WORKED EXAMPLES — this is the main remaining bulk)**.
5. **Concepts** — projects-and-storage **(real)**.
- Landing: `index.mdx` splash (feature cards incl. the assistive editor +
start-here links).
## Binding conventions (STYLE.md / ADR-0044 §7)
- **No "DSL"** in user-facing copy → "simple mode" / "advanced mode".
- **No engine name** (SQLite/STRICT/rusqlite/PRAGMA) → "the database" / "the
engine".
- **Code fences:** simple-mode commands → ` ```rdbms ` (highlighted; gets a
decorative copy-safe `> ` prompt via CSS). Abstract syntax templates →
` ```rdbms-syntax ` (highlighted, **no** prompt, no copy button). Advanced
SQL → ` ```sql `. Shell → ` ```sh `.
- **One command per line** in `rdbms` blocks. A multi-line *single* statement
(advanced `CREATE TABLE`) goes in ` ```sql `.
- **Copy button** is hidden on multi-line `rdbms` blocks and on
`rdbms-syntax` (the app input is single-line — a multi-command paste isn't
runnable); kept on single-command `rdbms`, and all `sql`/`sh`.
- Unshipped features → `:::caution[Planned]` aside; never presented as
shipped.
- **Ground every page in source**`parse.usage.*` / `help.*` in
`src/friendly/strings/en-US.yaml`, `src/dsl/command.rs`, `src/dsl/types.rs`,
the ADRs. **Do not** trust `requirements.md` markers (handoff-59 found
~46% mis-marked; it now uses a `[/]` partial legend) — verify against code.
## Canonical example database (use in every example)
A small **library**: `authors`(author_id serial pk, name text, birth_year
int) · `books`(book_id serial pk, title text, author_id int→authors,
published int, isbn text unique) · `members`(member_id serial pk, name text,
joined date) · `loans`(loan_id serial pk, book_id int→books, member_id
int→members, loaned_on date, returned_on date). 1:n author→books; m:n
books↔members via loans. **Simplest examples lead with bare `with pk`** (a
default `id` key); the library build uses **named** keys (`author_id`, …) so
relationships read clearly.
## Verified syntax cheat-sheet (don't re-derive)
- Simple create: `create table <T> with pk [<col>(<type>)[, ...]]` (bare =
default `id`); `add column [to] [table] <T>: <name> (<type>)`;
`rename column [in] [table] <T>: <old> to <new>`; `change column … (<type>)
[--force-conversion|--dont-convert]`; `drop column [from] [table] <T>: <col>
[--cascade]`.
- Advanced create: `create table T (id serial primary key, …, col int
references parent(col))` (verified against `tests/it/sql_create_table.rs`).
- Relationship: `add 1:n relationship [as <name>] from <P>.<col> to <C>.<col>
[on delete <action>] [on update <action>] [--create-fk]`;
compound: `from <P>.(a, b) to <C>.(x, y)`; drop by name or by endpoints.
- Data: `insert into T [(cols)] [values] (vals)`; `update T set … (where … |
--all-rows)`; `delete from T (where … | --all-rows)`.
- Inspect: `show data <T> [where …] [limit n]`, `show table <T>`, `show
tables|relationships|indexes`, `show relationship|index <name>`.
- `explain <…>` (query plan; safe — never executes). Advanced `select …`.
- 10 types: text int real decimal bool date datetime blob serial shortid;
advanced-mode SQL aliases (integer/varchar/timestamp/numeric/…).
- App commands: save / save as / new / load / rebuild / export [path] /
import <zip> [as <t>] / undo / redo / replay <path> / mode / help
[<command>] / help types / copy [all|last] / quit. (`hint` and `seed` are
NOT implemented — mark planned/omit.)
## Next work (priority order)
1. **Fill the 6 Reference stubs** with worked examples on the library schema
(the remaining bulk). Each has a syntax synopsis + an "In progress" note —
expand to full content: worked example(s), both simple + advanced forms
where both apply, cross-links. This is the biggest chunk.
2. **Iterate the Guides** for teaching quality; add guides (model a 1:n / m:n,
querying with joins). The user flagged guides as the most important
didactic content, to be polished before publication.
3. **Phase B — landing polish:** use the `frontend-design` skill; set
Starlight `site` (production URL) once the domain is known (enables sitemap
+ OG/SEO); add a logo + favicon (small Starlight config). Branding palette
when the user wants it (staying on Starlight; community themes were
surveyed — see ADR-0044 / chat).
4. **asciinema casts — DEFERRED until the app is final** (ADR-0044 §2). When
starting, settle STYLE.md open-decision #9: scripted-input driver
(`asciinema-automation` vs `autocast` — prove with a throwaway test run),
`.cast` script format + repo location, terminal geometry, light/dark
player theme, file naming. The **assistive editor** is prime cast material
(completion / `[ERR]`/`[WRN]` indicator are motion a still block can't
show) — earmark a cast for it on the landing + the assistive-editor page.
5. Remaining STYLE.md open decisions: **versioning** (leaning single-version
for launch) and **SEO/meta** (settle with Phase B + the `site` URL).
## Process pins
- **Commits:** user-confirmed (show the message first), **no AI attribution**,
**append-only** (no amend/rebase/force-push). Push is the user's step.
- **ADR numbering:** assigned at merge-to-`main` (ADR-0000 "Numbering
discipline", added this branch). The website ADR is **0044** — renumbered
from 0042 on the `main` merge, because `main` had independently used 0042
(H1a) and 0043 (compound-FK).
- **Issues:** Gitea via `tea` (repo `oli/rdbms-playground` on
`git.lazyeval.net`); append `< /dev/null` + `timeout 30`; never raw API.
- **Escalate genuine forks**, declare epistemic status, write down the DA pass
(`/runda`) on non-trivial plans.
## Commit history on this branch (newest first)
```
936d925 feat: add "Using the playground" section + Reference skeleton
44390e7 feat: simple-mode code-block highlighting, prompt, and copy rules
995c0ba docs: reconcile website doc inventory with merged main scope
c72c624 chore: bind website dev/preview server to IPv4 loopback (127.0.0.1)
9e774b2 docs: ADR numbering discipline — assign numbers at merge-to-main
40de389 Merge branch 'main' into website (Gitea migration + ADR renumber)
0fcb7b1 docs: website docs structure + first content pages
cea99e8 chore: scaffold website (Astro 6 + Starlight + Tailwind v4)
1fad29c docs: ADR-0042 — public website + documentation site plan (now ADR-0044)
```
## Review status (what the user has signed off)
Highlighting / `> ` prompt / copy behavior — good. Voice, altitude,
terminology — good. Responsive layout (checked in Polypane) — good. Locked
decisions: bare `with pk` leads the simplest examples; copy hidden on
multi-command blocks (not per-command copy); the 5-section structure with
"Using the playground" near the top; assistive editor surfaced on
landing + Getting started. **The 6 Reference stubs have not been reviewed for
content** — only their syntax synopses exist.
+205
View File
@@ -0,0 +1,205 @@
# Website-branch handoff — 2026-06-11 (website-2)
Second handoff for the **website** work (separate sequence from `main`'s
`YYYYMMDD-handoff-NN.md`). Read `website-1` (2026-06-10) first for the
original scaffolding context; this note covers everything since.
## State
- **Branch:** `website`. **HEAD `e782a28`.** Working tree clean. Pushed
through an earlier point; currently **ahead of `origin/website`** (push is
the user's step — never push).
- The website lives in **`website/`** (monorepo; the playground crate is at
the repo root). Living style guide + binding conventions:
**`website/STYLE.md`** (read first). Website decisions:
**`docs/website/adr/20260604-adr-website-001.md`** (the website ADR namespace
— see below). Plan: `docs/website/plans/20260604-website-implementation-plan.md`.
## What changed since website-1 (commit highlights, newest first)
```
e782a28 feat(website): projects cast (vi-nav load picker) + --demo on all casts
927e6b2 Merge branch 'main' (m:n, logging, UI nav, demo overlays, vi-nav)
52860c3 feat(website): casts for first-project/modes/undo-redo; quit via Ctrl-C
ce153bd docs(website): add SQL queries reference page (advanced query surface)
302329d docs(website): record the cast-placement policy in STYLE.md
bb7887e feat(website): relationship-diagram cast on the relationships page
65a48fa feat(website): joins cast on the querying-with-joins guide
c0cc92a docs(website): rewrite Build the library + add Querying with joins guide
10655e4 docs(website): fill the six Reference stubs with worked examples + output
a8f84c9 feat(website): refine casts — trim shell, autoplay+loop landing, cap size
… (cast pipeline, the astro/starlight upgrade, the ADR-namespace move)
```
## ADR namespace (important — avoids the recurring collision)
Website decision records live in their **own namespace**:
`docs/website/adr/` (`<date>-adr-website-<NNN>.md`, id `ADR-website-NNN`),
indexed by `docs/website/adr/README.md`. They do **not** draw from `main`'s
global ADR integer pool, so a `main` ADR and a website ADR can never collide
again (this is why the latest merge of `main`'s ADR-0045/0046/0047 was
conflict-free). Recorded in ADR-0000 "Numbering discipline". The main
`docs/adr/README.md` intro carries a pointer to the website namespace.
## Content status
**Done & verified (build clean, grounded in source, forbidden-terms clean):**
- **Getting started** — installation, first-project, modes, example-library.
- **Using the playground** — command-line-options, the-assistive-editor,
the-output-pane, projects, undo-and-history, export-and-import,
copy-to-clipboard, getting-help.
- **Guides** — build-the-library (full 4-table build, 1:n + m:n bridge),
querying-with-joins.
- **Reference** — types, tables, columns, relationships, indexes, constraints,
inserting-and-editing-data, querying-and-inspecting, **sql-queries** (the
advanced SELECT surface: DISTINCT, GROUP BY/HAVING, set ops, subqueries,
CTEs, CASE/CAST/functions, with a "supported subset" boundary note).
- **Concepts** — projects-and-storage.
- Landing `index.mdx` splash with the quickstart cast.
**26 pages build clean.** Only expected warning: sitemap needs `site` (Phase B).
## asciinema casts — the pipeline + the 7 casts
Pipeline (STYLE.md "asciinema casts", ADR-website-001 §2):
- **Driver: `autocast`** (chosen by spike; `asciinema-automation` can't drive a
full-screen TUI). Sources in `website/casts-src/casts.mjs`; `pnpm casts`
runs `casts-src/generate.mjs` → autocast YAML → `public/casts/<name>.cast`.
Command-lists are the durable source; **`.cast` files are regenerable** —
re-run `pnpm casts` (needs a `cargo build` binary at `../target/debug`).
- **Components:** `Cast.astro` (asciinema-player island) wrapped by
`Demo.astro` (the WASM-swap seam, ADR-website-001 §3). Embed via `<Demo
src="/casts/NAME.cast" … />` in an **.mdx** page (md can't import).
- **Generator features:** trims each cast to the in-app region (drops shell
launch + the return-to-shell); ends casts with **Ctrl-C** (`{ key: 'CtrlC' }`)
not a typed `quit` (invisible, so the cast ends on the last content frame);
per-cast `holdEnd`, `dataDir` (isolated data root, wiped per run), and
**`--demo` is default-on** (opt out with `demo:false`).
- **The 7 casts:** quickstart (landing, autoplay+loop), assistive-editor,
relationship-diagram, joins, modes, undo-redo, **projects** (the new one:
save as → new → load via the picker, navigated with `j`).
### `--demo` (#22 / ADR-0047) is on for ALL casts
The demonstration overlay shows a **badge** for special keystrokes
(`[ENTER]`, `[TAB]`, arrows, etc.) — plain characters are NOT badged. This
makes e.g. the assistive-editor's Tab completion visible (`[TAB]`), and the
projects cast's `j`/`k` picker navigation stays *un*surfaced (plain chars) by
design. Captions exist too (a stealth `Ctrl+]`-delimited banner) — usable in
casts for neutral "point something out" labels, not yet used.
### ⚠️ Cast tooling limits (don't rediscover these)
- autocast can only send **single characters, ASCII control codes (`^X`), and
waits** — **NO arrows / PageUp/PageDown / Home/End / function keys** (those
are escape sequences; the per-key delay makes the terminal read a lone Esc —
verified). So any interaction we want to demo must be reachable via typeable
keys. This is why #24 (vi `j/k` in the picker) was needed for the projects
cast, and why **output-pane scrolling has no cast** (needs PgUp/PgDn).
- `Ctrl+]` (caption toggle) and `Ctrl-C` (quit) ARE sendable (`^]`, `^C`).
### ⚠️ No-advertising constraint (user, 2026-06-11)
The docs must **NOT** advertise that the load picker supports **vi keys**, nor
that **`Ctrl+]`** is the caption/banner trigger. The `--demo` flag itself MAY
be documented lightly as "a teaching helper that shows special keystrokes" —
and nothing more. Casts may *use* vi-nav and captions (the viewer sees only the
result/banner, not the keystroke), but cast captions must not name `j/k` or
`Ctrl+]`.
## NEXT WORK — priority order
### 1. Document the features the `main` merge brought (the biggest gap)
The merge (`927e6b2`) added app features that are **not yet documented**:
- **m:n convenience command**`create m:n relationship …` (C4, **ADR-0045**).
The relationships page currently models m:n only via the manual loans-bridge.
Document the convenience command (it auto-generates the junction table).
Ground in ADR-0045 + `tests/it/m2n.rs` + `tests/typing_surface/create_m2n.rs`
for exact syntax. Likely a new section on the **relationships** reference
page and/or a mention in the build-the-library guide.
- **`--demo` flag** — document on **command-line-options** as a teaching helper
that "shows special keystrokes" (per the no-advertising constraint above —
do NOT mention badges-for-vi or captions/`Ctrl+]`).
- **ADR-0046 UI** — the **schema sidebar** (auto-shows on wide terminals,
`Ctrl-O` navigation mode to peek/expand), **responsive two-row input** +
horizontal scroll, and the geometry-fixed hint panel. Decide where in *Using
the playground* (a new "the schema sidebar" page, or fold into the-output-pane
/ the-assistive-editor). Ground in ADR-0046.
- FK-message fixes + the X1 logging sweep: **no user-doc impact** (note only).
Whenever output changed because of the merge, **re-verify any affected static
output blocks** (capture-harness recipe below).
### 2. Consider a final cast re-record sweep + optional captions
- All casts re-record with `pnpm casts` once the app is "final".
- **Chase up two pacing/clarity guidelines across the existing casts** (added
to STYLE.md "Cast pacing & clarity" 2026-06-11; the projects cast already
follows them):
1. **Don't submit a command too fast** — a typed-and-`Enter`ed-in-one-instant
command vanishes before the viewer reads it. Re-review each cast for
type-then-instant-Enter (especially modal confirms / short commands) and
add a pause before `Enter` (split `type` and `key:'Enter'` steps).
2. **Show state where the sidebar would** — at 90 cols the schema sidebar is
hidden (ADR-0046), so insert `show tables` / `show table` / `show data`
where state changes, so the viewer can follow what happened.
- **Review whether caption banners would improve the existing casts.** The
demo overlay can show a neutral step **caption** (the stealth `Ctrl+]`
banner) to label or narrate a moment — e.g. marking the phases of the
build-the-library/projects casts, or calling out the relationship diagram /
the teaching echo in the modes cast. Go cast-by-cast and decide where a
caption adds clarity vs. adds noise. Constraint: caption **text must not name
keys** (no `j/k`, no `Ctrl+]`); it narrates *what* is happening, not *how* it
was typed. (Captions are wired but not yet used in any cast.)
- Output-pane scrolling cast remains blocked (PgUp/PgDn unsendable). If desired
later, it needs an app-side typeable scroll key (file an enhancement like #24)
— otherwise leave it to static docs.
### 3. Phase B — landing/site polish
- Set Starlight **`site`** (production URL) → clears the sitemap warning,
enables sitemap + canonical/OG. Then SEO/meta conventions (STYLE #8).
- Logo + favicon; branding palette (staying on Starlight).
- **Light/dark player theme**: the asciinema player theme is currently fixed
(`asciinema`); sync it to the Starlight theme toggle (folded into STYLE #8).
- Use the `frontend-design` skill.
### 4. Open STYLE.md decisions
- **#7 Versioning** (leaning single-version for launch).
- **#8 SEO/meta** + the player light/dark theme.
## Capture-harness recipe (how to get accurate static output for new pages)
Output blocks must be **captured from the real app, never hand-drawn**
(STYLE.md). Pattern used throughout:
- For `pub` render fns (`render_data_table`, `render_explain_plan`) + the DB
worker API: a throwaway **external** test `tests/doc_capture.rs` that builds
the library schema via `Database` and prints rendered output; run
`cargo test --test doc_capture -- --nocapture --ignored`; paste verbatim
(trim trailing spaces); delete the file.
- For `pub(crate)` fns (`render_structure_with_diagrams`,
`render_relationship_diagram`): an in-crate `#[ignore]` test in
`src/output_render.rs`'s test module instead.
- **Verify box-drawing integrity** after pasting (top `┬` count == bottom `┴`,
equal line lengths) — a mis-paste truncated a CTE border once and the check
caught it.
## Verify-after-changes checklist
```sh
cd website && pnpm build # clean; 26 pages; only the `site` warning
# from repo root — forbidden terms must be empty:
grep -rniE '\b(DSL|SQLite|STRICT|rusqlite|PRAGMA)\b' website/src/content/
# internal links + heading anchors: spot-check in dist/ (no link validator installed)
cd website && pnpm casts # regenerate all casts (needs target/debug binary)
```
Dev server + tunnel for visual checks (player playback, sizing, badges):
`cd website && pnpm dev` (binds 127.0.0.1:4321) then `ssh -L 4321:127.0.0.1:4321 <host>`.
**Visual playback of all 7 casts (now with `--demo` badges) is still pending a
tunnel check by the user.**
## Process pins
- **Commits:** user-confirmed (show the message first), **no AI attribution**,
**append-only** (no amend/rebase/force-push). Push is the user's step.
- **Ground every page in source** (`src/dsl/*`, `en-US.yaml`, the ADRs) — not
`requirements.md` markers. No engine name, no "DSL" in user-facing copy.
- **Issues** via `tea` (repo `oli/rdbms-playground` on `git.lazyeval.net`;
append `< /dev/null` + `timeout 30`). Open/related: **#22** (demo overlay,
implemented), **#24** (vi picker nav, implemented). Both merged via `927e6b2`.
- Escalate genuine forks; declare epistemic status; write down the `/runda` DA
pass on non-trivial plans.
+165
View File
@@ -0,0 +1,165 @@
# Session handoff — 2026-06-15 (70)
Seventieth handover. Continues from handoff-69 (which closed the last
four Gitea issues and left the tracker empty). This session did the
**ADR-0052 follow-up** (unwinding vestigial worker `source` plumbing),
then **designed and fully implemented H2 — the contextual `hint`
command + F1 keybinding (ADR-0053)** end to end (Phases AD). The CI
branch was also merged into `main` mid-session (not my work — see §5).
Net: **2 feature areas shipped, 1 new ADR (0053) + 1 ADR amendment
(0052), 4 new Gitea issues (#35#38), the `hint` corpus (~57 teaching
blocks), and A1 + H2 closed in `requirements.md`.**
## §1. State at handoff
**Branch:** `main`. Working tree **clean**; all work committed. Commits
are local (push is the user's step).
**Tests: 2499 passing / 0 failing / 0 skipped / 1 ignored** (the
long-standing `friendly` doctest). **Clippy clean** (nursery, all
targets). Breakdown: 1799 lib + 500 `it` + 200 typing-surface-matrix.
**Open Gitea issues (4, all enhancement, all filed this session):**
- **#35** — enforce `cargo fmt` across the codebase (single reformat +
CI gate). The tree is *not* fmt-clean (~1800 pre-existing diffs); do it
once, coordinated with CI, before first publication.
- **#36** — `help` collapses advanced-SQL forms onto their simple sibling
(a `help`-list dedup artifact); they deserve distinct help content.
- **#37** — `hint` clause-concept hints (`on delete` actions, constraint
slots, `with pk`, cardinality) — a deferred `hint.concept.<topic>`
layer.
- **#38** — `hint` pre-submit-diagnostic route + the ~33 `diagnostic.*`
tier-3 blocks (deferred; `Diagnostic` carries no class key).
## §2. ADR-0052 follow-up — vestigial worker `source` unwind (`e8fa859`)
The first task from handoff-69 §3. ADR-0052 moved success-journaling out
of the worker, leaving the `source` that handlers threaded purely for the
old `history.log` write dead. **Bigger than the handoff estimated** (it
framed it as ~28 call-site edits): the cascade ran through ~30 worker
handlers + the `DescribeTable`/`QueryData`/`RunSelect` request fields +
their `DatabaseHandle` methods (~164 mostly-test call sites). Fully
unwound, compiler-guided, **no behaviour change** (journaling uses a
`source_for_journal` clone at the spawn, independent of the worker). The
only worker `source` left is the snapshot/undo label. Amended ADR-0052
*Consequences* + README. (Two scope forks escalated + user-approved.)
## §3. H2 — contextual `hint` (ADR-0053), Phases AD — **shipped**
The bulk of the session. ADR-0053 settles the `hint` slot ADR-0003 left
"ADR pending"; **closes A1** (all 15 app commands now exist) and
**requirements H2**. Read ADR-0053 before touching this area — it went
through three revisions and several user decisions.
### The design (all user-chosen)
- **Two surfaces:** an **F1 keybinding** → tier-3 hint for the *live*
partial input (read-only overlay — never touches buffer/cursor/memo);
a submitted **`hint` command** → expands on the *most recent runtime
error*. No topic arg (contextual only; `help <topic>` owns reference).
- **Tier-3 teaching layer** beneath the existing tier-1 (colour / error
headline) and tier-2 (ambient one-liner; the error `hint:` shown **by
default** since `Verbosity::Verbose` is the default). Each block is
`what` / `example` / `concept`, rendered as a `Hint` heading + aligned
labels.
- **Per-form keying** (Phase-B revision — the original per-node `hint_id`
was too coarse for multi-form commands like `add`/`drop`/`show`): a new
**`hint_ids: &[&str]`** field on `CommandNode` mirroring `usage_ids`,
resolved by `hint_key_for_input_in_mode` (reuses `usage_key`'s
form-word disambiguation + a mode-primary fallback for shared entry
words so advanced `insert``sql_insert`, simple → `insert`).
- **Comprehensive for v1 = command forms + 9 runtime error classes**
(the ~33 `diagnostic.*` classes were **deferred**, #38 — see §4).
### Key files
- `src/dsl/command.rs``AppCommand::Hint`.
- `src/dsl/grammar/app.rs``HINT` node + `build_hint`.
- `src/dsl/grammar/mod.rs` — the `hint_ids` field, `hint_key_for_input_in_mode`,
the factored `pick_form_key`, and the two **comprehensiveness coverage
tests** (every node has a resolving `hint.cmd.*`; every runtime error
class has a `hint.err.*`).
- `src/app.rs` — F1 arm in `handle_key` (read-only overlay, placed before
the completion-memo clear); `note_hint_for_input` / `note_hint_for_recent_error`
/ `note_getting_started` / `emit_tier3_block`; `last_error_hint_key`
state (set in `handle_dsl_failure`, cleared in `submit` for DSL
commands).
- `src/friendly/translate.rs``error_hint_class` (maps a `DbError` +
ctx to its `hint.err.<class>`; mirrors `translate`'s dispatch — keep in
sync, unit-tested).
- `src/friendly/strings/en-US.yaml` + `keys.rs` — the corpus under
`hint.cmd.<form>` / `hint.err.<class>` + `hint.block.*` labels +
`shortcut.hint`.
- `src/ui.rs` — ADR-0051 strip advertises **F1** (editing + default
states); 12 full-panel snapshots re-accepted.
### Phases (one commit each unless noted)
- **A** (`050b363`) skeleton + tier-2 fallback; **B** (`4a5fd1b`) per-form
keying + 3 exemplars; **C** content in 5 batches (`4bdfce6` app,
`6429b56` DDL, `9c4d520` DML, `97970f2` advanced-SQL, `b6b98ad` runtime
errors) + `417cbc8` diagnostic deferral; **D** (`447112b`) coverage gate
+ F1 strip + status flips; **/runda fix** (`329adfc`) — see §3.1.
### 3.1 — what the final `/runda` caught (don't skip)
Per-batch substring tests masked a **presentation gap**: `emit_tier3_block`
was emitting three *bare, unlabelled* lines, deviating from the approved
exemplar format. Fixed to render a `Hint` heading + aligned `What:` /
`Example:` / `Concept:` lines, **locked by an `insta` snapshot**
(`hint_block_insert`). Also confirmed the `Next:` line (ADR D2 exemplar)
is correctly **omitted** — tier-2 ambient already owns live
position-awareness. Lesson for the next content/UI work: **add a rendered
snapshot early**; substring asserts don't see layout.
## §4. Deferrals (all tracked, all user-confirmed)
- **#38 diagnostic route + `diagnostic.*` blocks** — `Diagnostic`
(`walker/outcome.rs`) carries only its rendered `message`, not a class
key, so the F1 diagnostic route would need a `class` field threaded
through every diagnostic site (broad) for marginal value (tier-2
already surfaces diagnostics; many duplicate runtime classes). F1 still
shows the useful command block when a diagnostic is present.
- **#37 clause-concept hints** — per-form is the right tier-3 granularity;
clause-level concepts are a separate `hint.concept.<topic>` layer for
later.
- **#36 `help` advanced-SQL** — out of H2's scope (touches shipped `help`).
## §5. CI branch merged into `main` (not my work)
Mid-session the **`ci` branch was merged** (commits `47a0816`, `138e766`
+ the `ci:`/`build:`/`docs(ci):` commits). `main` now carries a CI
pipeline, a nix flake, and **D1 cross-platform release builds** (matrix +
macOS), documented under a **new `docs/ci/adr/` namespace** (ci-001..003).
Implications for the roadmap: **D1 (cross-platform binaries) is now
substantially underway** — re-assess D1/D2/D3 status against what landed
before treating them as open. My H2 work is layered cleanly on top (all
green post-merge).
## §6. Next session — start here
1. **Push** (user step) — 30-odd local commits incl. the CI merge + all
of H2.
2. **Re-baseline the roadmap** against the merged CI work: D1/D2/D3 and
**TT5 CI** are partly/largely done now — read `docs/ci/adr/` and the
workflows before assuming they're open (handoff-69 §5 predates this).
3. **#35 (cargo fmt gate)** is the natural pairing with the now-merged CI
— the user wanted it done once, before first publication.
4. Other `requirements.md` open items (verify against CI merge first):
**TT4** PTY tier-4 (still unwired), **I1** multi-line input, **I5/B3**
in-flight cancellation, **V4** session journal (own ADR), **TU1**
tutorial system (own ADR). H2/A1 are now **done**.
5. The H2 deferrals (#36/#37/#38) are available if the user wants to
round out the hint/help surface.
## §7. How to take over
1. Read handoffs 68 → 69 → 70, `CLAUDE.md`, `docs/requirements.md`.
2. Confirm green: `cargo test` (expect **2499 pass / 1 ignored**) +
`cargo clippy --all-targets` (clean).
3. Read `docs/ci/adr/` (the merged CI work) before touching CI/release/D*.
4. For anything in the `hint` area, read **ADR-0053** first (3 revisions
+ deferrals #37/#38). For journaling, ADR-0052 (+ its 2026-06-14
follow-up note).
5. Project workflow unchanged: phased, test-first, `/runda` + DA before
commits, ADR amendment + README index-upkeep for decided-area changes,
confirm commit messages with the user.
6. Consider a `cargo sweep` at this milestone (`target/` grows; see
CLAUDE.md "Build hygiene").
+120
View File
@@ -0,0 +1,120 @@
# Session handoff — 2026-06-15 (71)
Short, focused handover. Continues immediately from handoff-70 (which
shipped H2 / the contextual `hint`, ADR-0053). **A user smoke-test
surfaced a correctness bug in the hint content, and it implicates the
whole corpus.** This handoff exists so the next session does a
**systematic semantic verification pass over every hint block** — context
ran too low to do it now.
## §1. State
**Branch:** `main`, clean, all committed (local; push pending). **2499
pass / 1 ignored, clippy clean.** Open issues: #35#38 (see handoff-70).
H2 / ADR-0053 is *functionally* complete; the **content is not
trustworthy** until the pass below is done.
## §2. The bug (confirmed)
`hint.cmd.create_table` (in `src/friendly/strings/en-US.yaml`) reads:
```
What: Create a new table — its columns, their types, and a primary key.
Example: create table Customers with pk id(serial), name(text), email(text)
Concept: A table is a set of rows that share the same columns. The primary
key uniquely identifies each row; a `serial` key numbers the rows for you.
```
**This is wrong.** In the DSL, **everything after `with pk` is the
primary-key column list** (a possibly *compound* PK, ADR-0005). So the
example does **not** create a table with `pk=id` plus regular columns
`name`/`email` — it creates a table whose **compound primary key is
(id, name, email)**. Non-key columns are added *separately* with
`add column`. The `what` ("its columns, their types") and the example
both mislead a learner badly.
- **Evidence:** real test usage is `create table Orders with pk
id(serial), CustId(int)` (a 2-column *compound PK*) and the common form
`create table X with pk id(int)` (single-column PK only). The usage
template `create table <Name> with pk [<col>(<type>)[, ...]]` is itself
misleading — the `[, ...]` is the PK list, not regular columns.
- **Correct mental model:** `create table <T> with pk <pk-cols…>` then
`add column <T>: <name> (<type>)` for each non-key column. Confirm
against ADR-0005 (compound PK) and ADR-0009 (DSL syntax) when fixing.
## §3. Root cause — why this needs a *full* pass
During Phase C I verified *some* examples against `parse.usage.*`
templates and real test greps, but for others I **extrapolated** beyond
verified syntax. For `create_table` I saw `... with pk id(int)` (single
col) and wrongly generalised to "pk + more columns," misreading the
`with pk` list as a column list. The examples are **syntactically**
checked but not **semantically** — i.e. not verified to *do what the
`what`/`concept` claims*.
So the corpus needs a pass that, for **every** `hint.cmd.*` and
`hint.err.*` block, checks:
1. the `example` parses **and runs**, and
2. it actually demonstrates what `what`/`concept` says, and
3. `what`/`concept` are factually true of the real behaviour.
**Don't trust grep+extrapolation.** Prefer: run the example in the app
(or a Tier-3 test), or check it against the authoritative ADR.
## §4. The pass — how to do it (next session)
The corpus lives in `src/friendly/strings/en-US.yaml` under `hint.cmd.*`
(per command form) and `hint.err.*` (per runtime error class). The
inventory and authoritative syntax sources:
- **`hint.cmd.<form>`** — for each, cross-check the example against the
matching `parse.usage.<form>` template **and** the form's ADR, and run
it. Highest-risk (extrapolated, verify first): **DDL**`create_table`
(known wrong), `add_column`, `add_index`, `add_constraint`,
`change_column`, `drop_*`, `create_m2n`; **advanced-SQL** — confirm
each is in the supported SQL subset (`select`, `with` CTE,
`sql_insert/update/delete`, `sql_create_table`, `sql_alter_table`,
`sql_create_index/drop_index/drop_table`, `explain_sql`); **DML**
`seed` forms, `explain`, `show_*`, `update`/`delete` (`--all-rows` /
required-WHERE wording). App commands are lower-risk (reference-style).
- **`hint.err.<class>`** — verify the fix recipe in `example` is actually
the right remedy and `concept` matches the engine's real behaviour
(FK sides, `on delete` actions, check/not_null/unique semantics).
- Relevant ADRs: 0005 (types + compound PK), 0009 (DSL syntax), 0011 (FK
type compat), 0013 (relationships/rebuild), 0014 (data ops +
required-WHERE), 0025 (indexes), 0028/0039 (explain), 00300036 (SQL
subset), 0048 (seed). `docs/requirements.md` for scope.
**Suggested method:** drive the app (`/run` or a small PTY/Tier-3 harness)
and actually execute each example; or add a test that parses+runs every
`hint.cmd.*` example and asserts success. The latter would also be a
durable regression guard — consider adding it as part of the pass (it
upgrades the comprehensiveness coverage test from "a block exists" to
"the example actually works").
## §5. Immediate fix ready to apply
`create_table` is diagnosed (§2). The corrected block should make the
example a PK-only `create table` and move the regular columns to a
follow-up `add column`, e.g.:
```
What: Create a new table with its primary key.
Example: create table Customers with pk id(serial)
Concept: A table is a set of rows sharing the same columns. `with pk`
declares the primary key (one column, or several for a compound
key); add the other columns afterwards with `add column`.
```
Apply this (and re-check `create_m2n` / `add_*` while there), but only as
part of the systematic pass — a one-off fix risks leaving siblings wrong.
## §6. How to take over
1. Read handoffs 70 → 71, `CLAUDE.md`.
2. Confirm green: `cargo test` (2499 / 1 ignored), `cargo clippy
--all-targets`.
3. Do the §4 pass (consider the run-every-example test in §4). Test-first,
`/runda` before commit, confirm the commit message with the user.
4. Pedagogy wins — these are teaching strings; correctness and clarity
over cleverness.
+113
View File
@@ -0,0 +1,113 @@
# Session handoff — 2026-06-15 (72)
Short, focused handover. Continues from handoff-71, which asked the next
session to run a **systematic semantic verification pass over every
`hint` block** (handoff-70 shipped H2 / ADR-0053, but a user smoke-test
found a wrong hint and implicated the whole corpus). **That pass is now
done.** Four content errors fixed, a durable parse-guard added, two stale
docs corrected. Commit `5a37437`.
## §1. State
**Branch:** `main`, clean, all committed (local; **push pending** — your
step). **2500 pass / 0 fail / 1 ignored** (the long-standing `friendly`
doctest), **clippy clean** (nursery, all targets). The +1 vs handoff-71's
2499 is the new guard test. Open Gitea issues unchanged: **#35#38**.
## §2. The verification pass (commit `5a37437`)
Method: cross-checked every `hint.cmd.*` example against its
`parse.usage.*` template, ground-truthed every concept claim against the
authoritative ADR **and a named existing test** (not grep+extrapolation —
the trap handoff-71 §3 warned about), and parse-validated all 49 command
examples via a new guard.
### Four content errors fixed (`src/friendly/strings/en-US.yaml`)
| Block | Bug | Fix |
|---|---|---|
| `cmd.create_table` | Example `with pk id(serial), name(text), email(text)` declares a **3-column compound PK**, not a PK + regular columns. Every `with pk` column is a key member — confirmed by the grammar test comment *"Every `create table` column is a primary-key column"* (`ddl.rs`), ADR-0005. | Single-column PK + `add column` for the rest; `what`/`concept` aligned. |
| `cmd.save` | `save as my-shop` **does not parse**`build_save` yields `AppCommand::SaveAs` with **no inline name**; `save as` opens a path-entry modal (`iteration4b` tests). | Example → `save as`; `what` de-implied; added an accurate temp-vs-named-auto-save `concept`. |
| `cmd.import` | Target `shop-copy` **does not parse** — the `as <target>` slot is an `IdentSource::NewName` ident that tokenises only up to the hyphen. (The zip path is a BarePath and *does* accept hyphens, hence `export my-shop.zip` is fine.) | → `shop_copy`. |
| `err.foreign_key.child_side.concept` | Offered `on delete set null/cascade` as the remedy — but `error_hint_class` maps child_side to **insert/update** violations; `on delete` governs the **parent** direction. The tier-1 hint (line 64) correctly omits it. | Corrected: parent must exist first; clarified `on delete` is the *other* direction. |
### Durable guard added
`every_cmd_hint_example_parses_in_its_mode` (`src/dsl/grammar/mod.rs`,
in the `hint_key_tests` module). **Catalog-driven** — it iterates
`catalog().keys()` for `hint.cmd.*.example` rather than the REGISTRY, so
an orphaned/mis-keyed block can't slip past; floor-asserts ≥49 examples.
Each parses in its taught mode (advanced for the SQL surface, simple
otherwise). It caught the `save` and `import` errors **test-first** (red
before the YAML fix). Registered the new `hint.cmd.save.concept` key in
`keys.rs` (the `keys_validate_against_catalog` test requires every catalog
key be declared).
### Verified correct (not changed)
All other `cmd`/`err` blocks. Notably the guard-*concept* claims were each
confirmed against a named runtime test, not assumed:
`drop_column_refuses_primary_key` / `…_column_in_a_relationship`,
`drop_table_with_inbound_relationship_errors`,
`add_not_null_column_without_default_to_populated_table_is_refused`. The
corrected `create_table` story stays coherent with the `Customers`-
referencing examples (id serial PK → `add column` name/email → `insert`
skips the auto id).
## §3. Docs corrected (same commit)
Discovered while verifying `create_m2n` (which **is** implemented —
`db.rs::do_create_m2n_relationship` + `tests/it/m2n.rs`):
- **CLAUDE.md** carried two **stale "deferred" claims**, both already
implemented. Removed/updated: (a) the at-a-glance project-format line
said export/import (Iter 5) + `--resume`/input-history/migration (Iter
6) were "pending" — all `[x]` in `requirements.md` (ADR-0015); (b) the
"Things deliberately deferred" list still had the **m:n convenience
(C4)** bullet and the same project-storage bullet. `requirements.md`
was already correct (C4 done 2026-06-10, ADR-0045), so only a
verification-pass note was appended to its **H2** entry.
## §4. Scope note — what the guard does *not* do
The bug class here is **semantic** (an example that parses and runs but
misrepresents the prose — e.g. `create_table`). The guard enforces only
the **syntactic floor**: examples parse in their mode. It backstops
future typos/clause-drift but cannot police meaning. Semantic correctness
of the current corpus rests on this session's review (recorded in the
commit + requirements.md H2). A stronger-but-brittler option was offered
to the user and **not built pending their call**: per-form assertions
that each example resolves to the *expected command shape* (e.g.
create_table → single-column PK). `hint.err.*` examples are fix-recipe
prose, not runnable, so they're verified by review only — inherent.
## §5. Next session — start here
The hint corpus is now trustworthy. Open roadmap (verify against the CI
merge first, per handoff-70 §5):
1. **Push** (your step) — this commit + the still-unpushed backlog from
handoffs 70/71 (the CI merge + all of H2).
2. **#35 (cargo fmt gate)** — the natural pairing with the merged CI; the
user wanted it done once, before first publication. The tree is **not**
fmt-clean (~1800 pre-existing diffs).
3. Other `requirements.md` open items: **TT4** PTY tier-4 (unwired),
**I1** multi-line input, **I5/B3** in-flight cancellation, **V4**
session journal (own ADR), **TU1** tutorial system (own ADR).
4. Hint follow-ups if wanted: **#37** clause-concept hints, **#38**
diagnostic route + `diagnostic.*` blocks, **#36** `help` advanced-SQL.
## §6. How to take over
1. Read handoffs 70 → 71 → 72, `CLAUDE.md`, `docs/requirements.md`.
2. Confirm green: `cargo test` (**2500 / 1 ignored**) + `cargo clippy
--all-targets` (clean).
3. For anything in the `hint` area, read **ADR-0053** first. For the
corpus, `src/friendly/strings/en-US.yaml` (`hint.cmd.*` / `hint.err.*`)
is the content; the guard in `src/dsl/grammar/mod.rs` is the regression
net.
4. Workflow unchanged: phased, test-first, `/runda` + DA before commits,
ADR amendment + README index-upkeep for decided-area changes, confirm
commit messages with the user.
5. Consider a `cargo sweep` at this milestone (`target/` grows; see
CLAUDE.md "Build hygiene").
@@ -0,0 +1,243 @@
# Plan — ADR-0053: contextual `hint` command + F1 keybinding (H2)
Implements ADR-0053. Closes the last open piece of **A1** (the canonical
app-command set) and requirements **H2**. No Gitea issue — this is
requirements-driven work; any genuine "later" item found en route gets
its own issue (cf. #36, already filed for the parallel `help`-side gap).
## 1. Goal
Give learners on-demand, **teaching-grade** contextual help — a *third*
tier beneath the existing terse always-on text (tier 1) and the
short contextual lines that are already shown (tier 2: the live ambient
prose, and the error `hint:` which is on by default since
`Verbosity::Verbose` is the default). Two surfaces:
- **F1** (read-only overlay) → a tier-3 block for the **live partial
input**, or — on empty input — for the **most recent runtime error**.
- **`hint`** (submitted app command) → the tier-3 block for the **most
recent runtime error** (the buffer is empty post-submit, so it can only
act on recent context).
The mechanism is small; the **content corpus is the feature** (~80
blocks, comprehensive for v1, authored exemplars-first per ADR-0053 D7).
## 2. The shape of the work (why this order)
The mechanism and the content are separable, and the mechanism should
land first with **graceful tier-2 fallback** so every surface works
before any tier-3 text exists. That lets us:
- build + test the trigger matrix / routing / `:`-strip / read-only-
overlay behaviour against a skeleton (TDD), then
- pour in content in reviewable batches without re-touching the wiring,
- and turn on the **comprehensiveness coverage test** only once the
corpus is complete (it is red until then — by design).
Build order: **Phase A** (mechanism skeleton, falls back to tier-2) →
**Phase B** (catalogue structure + the three approved exemplars) →
**Phase C** (comprehensive content, batched) → **Phase D** (polish:
strip advertisement, snapshots, full green).
## 3. Grammar: the `hint_ids` field + the `HINT` node
### 3a. New `CommandNode.hint_ids` (per-form — revised in Phase B)
- Add `pub hint_ids: &'static [&'static str]` to `CommandNode`
(`src/dsl/grammar/mod.rs:512`, beside `help_id` / `usage_ids`),
**mirroring `usage_ids`***not* a per-node `Option<&str>`. The Phase-B
exemplar (`add 1:n relationship`) showed per-*node* keying is too coarse:
`add`/`drop`/`show`/`create` are each one node spanning many forms, and
a live-input hint must be specific to the typed form. Compiler forces
every node literal (~37, across `grammar/app.rs`, `data.rs`, `ddl.rs`) to
set it — Phase A/B leave most `&[]` (tier-2 fallback); Phase C fills them.
**Multi-form nodes list ALL their form keys** (e.g. `add`
`["add_column", "add_relationship", "add_index", "add_constraint"]`) so
the form-word disambiguation resolves correctly and unauthored forms fall
back at render rather than mis-resolving to a sibling.
- **Lookup:** `hint_key_for_input_in_mode(source, mode)` returns the single
typed form's hint stem, reusing `pick_form_key` (factored out of
`usage_key_for_input_in_mode` — shared digit/`m:n`/suffix disambiguation).
- **Why a new field, not `help_id`** (ADR-0053 D3): `help_id` is `None` on
the 7 advanced-SQL forms purely to dedup the `help` *list*; those forms
have distinct SQL syntax and need their own block. `hint_ids` is per
form. (The parallel `help`-side gap is issue #36; clause-concept hints
are deferred — issue #37.)
### 3b. `AppCommand::Hint` + the `HINT` node
- `AppCommand::Hint` variant (no fields — no topic arg) in
`src/dsl/command.rs:544`.
- `pub static HINT: CommandNode` in `grammar/app.rs` mirroring `HELP` but
with **no topic shape** (bare keyword, like `UNDO`): `entry:
Word::keyword("hint")`, `shape: EMPTY_SEQ` (as `UNDO`,
`grammar/app.rs:333`), `ast_builder:
build_hint` (returns `Command::App(AppCommand::Hint)`), `help_id:
Some("app.hint")`, `hint_id: Some("app.hint")`, `usage_ids:
&["parse.usage.hint"]`.
- Register `(&app::HINT, CommandCategory::Simple)` in `REGISTRY`
(`grammar/mod.rs`), beside `HELP`. (App commands are available in both
modes via the existing mechanism.)
## 4. Command identification (live-input → node)
The F1 live-input path needs "which command form is being typed." **The
lookup machinery already exists** — do not rebuild entry matching:
- `command_for_entry_word(word) -> Option<(usize, &'static CommandNode)>`
(`grammar/mod.rs:811`) returns the matched node for an entry word
(Simple-first; the caller extracts the first word of the input).
- `usage_keys_for_input_in_mode(source, mode)` (`grammar/mod.rs:564`)
already performs the **mode-aware** Simple/Advanced selection the hint
path needs (advanced `create` → the SQL nodes, simple → the DSL node) —
it just returns `usage_ids` rather than the node.
- **The only new bit:** a thin `hint_id_for_input_in_mode(source, mode)`
(or a node-returning sibling of `usage_keys_for_input_in_mode`) that
applies the same mode selection and returns the chosen node's
`hint_id`. Mirror the existing function; don't duplicate its matching.
- **`:`-strip:** in Simple mode, strip a leading `:` (one-shot escape,
ADR-0003) before identification so `: SELECT …` resolves to the
advanced `SELECT` node.
- No match (empty / unrecognised entry word) → the "getting started"
pointer (D2).
## 5. F1 keybinding (read-only overlay)
In `App::handle_key` (`src/app.rs:1155`):
- Add an F1 arm (`KeyCode::F(1)`) **after** the modal gate and the
sidebar-nav gate (inert there, per D2), and **before** the
"any other key clears the completion memo" fall-through (`_ =>
self.last_completion = None`, ~line 1228) — F1 must **not** clear the
memo or touch the buffer/cursor (D1).
- Behaviour (the trigger matrix, D2):
- non-empty input → `note_hint_for_input()` (the command's `hint.cmd`
block + the live "Next:" expected-set from the walker).
- empty input + `last_error_hint_key` set → `note_hint_for_error()`.
- empty input + no recent error → `note_getting_started()`.
- Returns `Vec::new()` (pure output emission, like `help`).
- `demo_badge_label` (`app.rs:520`) gains an `F1 → "[F1]"` entry so demo
mode surfaces it (ADR-0047).
## 6. The two error routes (D2 / D5)
- **Runtime errors:** add `last_error_hint_key: Option<String>` to `App`.
Set it where friendly errors are rendered (`runtime.rs:2615`,
`app.rs:2424`) from the error's class key; clear on the next successful
command. The `hint` command and empty-input F1 read it.
- **Pre-submit diagnostics:** the F1 live-input path, when the input
carries an under-cursor diagnostic, reads it straight from the walker
(`input_diagnostics_in_mode`, the same source the ambient panel uses)
and renders that diagnostic's `hint.err.<class>` block instead of (or
alongside) the command block. No stored state.
- Both render from `hint.err.*`.
## 7. Rendering: the `note_hint*` family (D4)
- New `App::note_hint_for_input`, `note_hint_for_error`,
`note_getting_started` (siblings of `note_help`/`note_help_topic`,
`app.rs:2982`/`3021`).
- A tier-3 block is **structured** (`what` / `example` / `concept`, plus
the live `Next:` line on the input path). The catalogue stores each part
under sub-keys (`hint.cmd.<id>.what`, `.example`, `.concept`); the
renderer fetches each via `t!` and lays them out as a small framed
block.
- Styling: `OutputKind::System`; `OutputStyleClass::Hint` (muted) on
`what`/`concept`/`Next`, `Neutral` on `example` so the runnable line
stands out. Reuse `OutputLine::styled` + `push_category_three_prose`
patterns (`app.rs:3121`).
- **Fallback:** if a node's `hint_id` is `None` or a key is missing,
degrade to tier-2 (ambient prose for the input path; the verbose error
`hint:` for the error path) — never blank.
## 8. Catalogue + `keys.rs`
- New sub-namespaces under the existing top-level `hint:` in
`src/friendly/strings/en-US.yaml`: `hint.cmd.<hint_id>.{what,example,
concept}` and `hint.err.<class>.{what,example,concept}`.
- Register every key + its placeholders in `src/friendly/keys.rs`
(`KEYS_AND_PLACEHOLDERS`) so the build-time validation covers them.
- `parse.usage.hint` + `help.app.hint` strings for the command itself.
## 9. Content (Phase C — the bulk, batched per D7)
Exemplars approved in the ADR (`insert` live-input, FK child-side error,
`add relationship`) are the template. Author in reviewable batches:
1. **App commands** (~16): save/save as/load/new/rebuild/export/import/
replay/undo/redo/mode/messages/copy/help/hint/quit.
2. **DDL** (simple): create table, create m:n, add column/relationship/
index, drop, rename, change column.
3. **DML** (simple): insert, update, delete, show, seed, explain,
select/with.
4. **Advanced-mode SQL forms** (7): SQL CREATE TABLE, ALTER TABLE,
CREATE/DROP INDEX, DROP TABLE, SQL INSERT/UPDATE/DELETE, EXPLAIN SQL —
**own blocks, SQL-syntax examples**.
5. **Runtime error classes** (9): unique, foreign_key ×{child,parent},
not_null, check, type_mismatch, not_found, already_exists, generic,
invalid_value.
6. **`diagnostic.*` classes** (~33): arity/type/unknown-table-column/etc.
Each block: `what` (12 sentences), `example` (one runnable line,
mode-correct), `concept` (the relational idea — the teaching part;
optional only where genuinely none, e.g. `quit`).
## 10. Tests
Written test-first against the Phase-A skeleton where possible.
- **Tier 1 (unit, `app.rs`):**
- trigger matrix: F1 non-empty → command block; F1 empty + recent error
→ error block; F1 empty + none → getting-started; `hint` command +
error → error block; `hint` + none → getting-started.
- `last_error_hint_key` set on a failing command, cleared on the next
success.
- routing: a pre-submit diagnostic on the input drives the diagnostic
`hint.err`; a runtime error drives the stored-key route.
- `:`-strip: `: SELECT …` in Simple mode resolves to the advanced node.
- **read-only overlay:** F1 leaves `input`, `input_cursor`, and
`last_completion` unchanged.
- tier-2 fallback when `hint_id`/key absent.
- **Tier 2 (`insta`):** snapshot a representative rendered tier-3 block
(the `insert` exemplar) so the framed layout + styling spans are locked.
- **Tier 3 (integration, `tests/it/`):** type a partial command → F1 →
block appears, buffer untouched; run a failing insert → `hint` → FK
error expansion.
- **Comprehensiveness coverage test** (enforces D6, the key one): iterate
`REGISTRY` and assert every node has a `hint_id` resolving to a
`hint.cmd.*` block; assert every runtime-error + `diagnostic.*` class
has a `hint.err.*` block. **Red until Phase C completes** — enable
(un-`ignore`) as the final gate.
- `keys.rs` validation continues to guarantee every *referenced* key
resolves.
## 11. Keybinding strip + discoverability (Phase D)
- The ADR-0051 bottom strip advertises **F1 = hint** in the editing/
typing state (and on the empty-input state, since F1 still does
something there). Re-accept the affected full-panel snapshots.
## 12. ADR / docs
- ADR-0053 is committed (`e16ad50`). On completion, flip its Status from
"implementation pending" to implemented (with date), and update the
README index entry + `requirements.md` **H2 → [x]** and **A1 → [x]**
(A1 closes when `hint` lands).
## 13. Risks / watch-list
- **Command-identification reuse.** The lookup exists
(`command_for_entry_word` + the mode-aware `usage_keys_for_input_in_mode`,
`grammar/mod.rs:811`/`564`); the only new code is a thin node/`hint_id`
variant that reuses their selection. Do **not** re-implement entry-word
matching — mirror the existing functions.
- **Structured-key ergonomics.** Three sub-keys per block × ~80 blocks is
~240 catalogue keys; keep the `keys.rs` registration generation tidy
(consider a helper that registers the `{what,example,concept}` triple
for an id).
- **Content voice drift across batches.** Re-check each batch against the
approved exemplars; the `concept` line is where drift (too terse / too
advanced) creeps in. Pedagogy wins ties.
- **F1 terminal capture.** A few terminals intercept F1; acceptable
(it's the convention) but note it if testing surfaces it.
- **Snapshot churn.** The strip change re-accepts ADR-0051 snapshots;
keep that diff isolated.
- **Coverage-test timing.** It is red through Phases AC; gate it so CI
isn't broken mid-stream (e.g. `#[ignore]` until the final batch), then
make passing it the completion criterion.
```
+52 -11
View File
@@ -61,11 +61,32 @@ since ADR-0027.)
## Distribution and install ## Distribution and install
- [ ] **D1** Cross-platform binaries: Linux, macOS, Windows on - [x] **D1** Cross-platform binaries: Linux, macOS, Windows on
x86_64 and aarch64. x86_64 and aarch64.
- [ ] **D2** Single static binary, no runtime dependencies. *(Done 2026-06-15 — CI produces all six. The four non-macOS
targets (Linux musl + Windows gnu/gnullvm × x86_64/aarch64) are
cross-built from the Linux runner with `cargo-zigbuild` on a `v*`
tag (`release.yaml`); the two `*-apple-darwin` targets build
natively on a Tart Apple-Silicon runner via the dispatched
`release-macos.yaml`. All uploaded to the Gitea release with a
`.sha256` each. Decisions in `docs/ci/adr/` (ADR-ci-001/002/003).
Runtime-verified by the user: Linux x86_64 + Windows aarch64; the
others are link-clean / valid format.)*
- [x] **D2** Single static binary, no runtime dependencies.
*(Done 2026-06-15, per platform: **Linux** is fully static (musl +
`crt-static`); **Windows** is a standalone `.exe` (Zig statically
links libc — no mingw runtime DLLs); **macOS** links only system
libraries (`libSystem` + the AppKit/Foundation frameworks —
inherent on every Mac, never user-installed; the build rewrites the
one nix-store `libiconv` path to `/usr/lib` and re-signs ad-hoc).
No target requires anything the user must install. ADR-ci-003.)*
- [ ] **D3** Released via prebuilt binaries plus Homebrew, Scoop, - [ ] **D3** Released via prebuilt binaries plus Homebrew, Scoop,
`winget`, and `cargo binstall`. `winget`, and `cargo binstall`.
*(Prebuilt binaries + checksums now published to Gitea releases
(D1); the package-manager manifests (Homebrew / Scoop / winget /
`cargo binstall`) remain to do. The asset naming
`rdbms-playground-<tag>-<target>` is already binstall-friendly.
Tracked under ADR-ci-003 "Deferred".)*
## TUI shell ## TUI shell
@@ -250,16 +271,13 @@ since ADR-0027.)
## App-level commands (per ADR-0003) ## App-level commands (per ADR-0003)
- [/] **A1** All canonical app-level commands implemented and - [x] **A1** All canonical app-level commands implemented and
available in both modes: `save`, `save as`, `load`, `new`, available in both modes: `save`, `save as`, `load`, `new`,
`rebuild`, `export`, `import`, `seed`, `replay`, `undo`, `rebuild`, `export`, `import`, `seed`, `replay`, `undo`,
`redo`, `mode`, `help`, `hint`, `quit`. `redo`, `mode`, `help`, `hint`, `quit`.
*(Partial: **14 of 15** implemented and available in both modes — *(Done 2026-06-15: the last command, **`hint`**, landed with H2
`quit`/`q`, `mode simple|advanced`, `help`, `save`, `save as`, (ADR-0053). All 15 canonical app commands are now registered and
`load`, `new`, `rebuild`, `export`, `import`, `replay`, `undo`, available in both modes.)*
`redo`, and now **`seed`** (ADR-0048 / SD1, done 2026-06-11).
**Only `hint`** (tracked as H2) remains unregistered. A1 closes
when H2 lands.)*
## DSL data commands ## DSL data commands
@@ -793,8 +811,21 @@ since ADR-0027.)
`returning `) still shows the raw expression first-set — `returning `) still shows the raw expression first-set —
typing-time completion already offers the right candidates typing-time completion already offers the right candidates
there, so the payoff is small. there, so the payoff is small.
- [ ] **H2** `hint` provides contextual help for the current - [x] **H2** `hint` provides contextual help for the current
input or the most recent error. input or the most recent error.
*(Done 2026-06-15, ADR-0053: an **F1** keybinding gives a tier-3
teaching hint for the live partial input (read-only overlay), and a
submitted **`hint`** command expands on the most recent runtime error.
A new `hint.cmd.<form>` / `hint.err.<class>` catalogue tier
(`what`/`example`/`concept`) covers every command form + the 9 runtime
error classes, enforced by a comprehensiveness coverage test. Deferred:
the pre-submit-diagnostic route + `diagnostic.*` blocks (#38),
clause-concept hints (#37). **Content verified 2026-06-15 (handoff-71):**
a semantic pass over every `hint.cmd.*`/`hint.err.*` block fixed four
errors — `create_table` (compound-PK misread), `save` (no inline name),
`import` (hyphen-rejecting target), and `foreign_key.child_side` (wrong
`on delete` remedy) — and added a catalogue-driven guard test that parses
every command example in its taught mode.)*
- [x] **H3** `help` provides general reference and per-command - [x] **H3** `help` provides general reference and per-command
help. help.
*(Done 2026-06-07: the **general reference** is `help` (no arg) — *(Done 2026-06-07: the **general reference** is `help` (no arg) —
@@ -878,8 +909,18 @@ since ADR-0027.)
PTY. Correcting a stale `CLAUDE.md` line that read "Tier 4 is PTY. Correcting a stale `CLAUDE.md` line that read "Tier 4 is
wired only for the listed critical flows" — it was not wired at wired only for the listed critical flows" — it was not wired at
all. Genuinely deferred.)* all. Genuinely deferred.)*
- [ ] **TT5** CI runs all tiers on Linux, macOS, and Windows on - [/] **TT5** CI runs all tiers on Linux, macOS, and Windows on
stable Rust. stable Rust.
*(Partial, 2026-06-15. **CI is live** on the self-hosted Gitea
Actions (`docs/ci/adr/`): the gate runs `clippy -D warnings` +
`cargo test` (Tiers 13) on the **Linux** runner for every branch
push / PR, and `release-macos` runs the suite natively on the
**macOS** runner. **Windows is build-only** — cross-compiled, not
executed (no Windows runner). **Tier 4** (PTY, TT4) is still
unwired, so "all tiers" is not yet fully met. "Stable Rust" is
satisfied by the flake's pinned `1.95.0` (a stable release, not
nightly). Remaining for full TT5: a Windows execution runner and
Tier-4 PTY in CI.)*
## Cross-cutting ## Cross-cutting
@@ -0,0 +1,146 @@
# ADR-website-001: Public website and documentation site
## Status
Accepted (2026-06-04). Implementation plan:
[`docs/website/plans/20260604-website-implementation-plan.md`](../plans/20260604-website-implementation-plan.md).
> History: drafted as ADR-0042, renamed to ADR-0044 (each collided with a
> number `main` had independently assigned — H1a took 0042, compound-PK FK
> took 0043, then relationship-visualization took 0044). Moved to the
> website ADR namespace (`docs/website/adr/`, id **ADR-website-001**) on
> 2026-06-10 to end the recurring cross-branch number collision: website
> decision records now draw from their own dated sequence and never the
> main global ADR pool (see ADR-0000 "Numbering discipline"). Content is
> unchanged from the original draft.
## Context
RDBMS Playground is nearing its first public release and needs a public
website that does two jobs: **attract** — a landing page that shows the
playground in action — and **document** — a thorough, canonical reference
for everything the playground can do.
The documentation-heavy surface is already implemented and verified (full
simple- and advanced-mode command set, the ten-type vocabulary,
relationships, constraints, indexes, EXPLAIN, undo/history/replay, projects,
export/import, the teaching echo, clipboard, friendly errors, tab completion
and syntax highlighting; 2151 tests passing at the time of writing). The
site is therefore largely a presentation-and-writing effort, not a
wait-for-features one. A grounded inventory of what is shippable now lives
in the implementation plan.
Several choices here had no canonical default; they were settled during a
planning + `/runda` pass with the user and are recorded below.
## Decision
1. **Stack — Astro 6 + Starlight + Tailwind v4.** Astro's content-first,
zero-JS-by-default model with the Starlight docs theme fits a
marketing-landing-plus-heavy-docs site better than the alternative
considered, SvelteKit + Tailwind (the usual go-to here). Interactive
pieces are added as Astro islands (Svelte or vanilla), so Svelte is still
available where it earns its place. Tailwind v4 is wired via the official
`@tailwindcss/vite` plugin; the `@astrojs/starlight-tailwind` plugin
bridges Tailwind with Starlight's theming.
2. **Demo medium — asciinema.** Showcase sequences are recorded as
asciinema `.cast` files (text-based, small, faithful to the full
alternate-screen render) and embedded with `asciinema-player`. The same
casts are reused inline in the docs — one recording format serves both
the landing page and documentation enrichment. Recordings are produced by
a **scripted-input driver** that types commands into a real PTY with
viewer-friendly pacing; the app's own `history.log` **replay** (ADR-0034)
re-executes commands without typing animation or pacing and is therefore
suitable only for state-deterministic docs snippets, not the hero demo.
3. **In-page WASM playground — deferred** (OOS: **deferred**, not rejected).
A live, type-it-yourself playground compiled from the Rust app to
WebAssembly is desirable but is a multi-week sub-project, so it does not
block the site. The demo section is designed with a stable seam (a single
`Demo` component contract) so a WASM playground island can replace the
asciinema player later with no change to call sites. Recorded boundary
for that future work:
- **Portable core (runs on `wasm32-unknown-unknown` largely as-is):**
`src/dsl/*` (parser, types, grammar, walker), the pure `App::update()`,
`ui.rs`, `theme.rs`, `friendly/*`, output rendering; an in-memory DB
path already exists (`Connection::open_in_memory()`). `rusqlite`
compiles to the browser target via its `ffi-sqlite-wasm-rs` feature.
- **Native edge needing `cfg`-gated browser replacements:** the
multi-thread Tokio runtime + the dedicated DB **worker thread**
(ADR-0010) → current-thread/in-line async; `crossterm` terminal +
event-stream → a browser backend (e.g. Ratzilla's DOM/Canvas) + DOM
events; `arboard`, `zip`, file persistence (ADR-0015), file logging;
and the rusqlite **backup-API** undo (ADR-0006) → a SQL dump/restore.
When taken up, this becomes its own ADR + iteration plan.
4. **Hosting — portable static build; Cloudflare is the target (decided
2026-06-11).** Astro 6 builds to static HTML/CSS with no adapter, so the
output deploys equally to Cloudflare, Vercel, Netlify, or GitHub Pages — we
stay uncoupled from any one host. **Planned pipeline: Gitea Actions →
Cloudflare.** Cloudflare now steers new projects to **Workers (static
assets)** over Pages; either serves the static `dist/` and needs no Astro
adapter (the `@astrojs/cloudflare` adapter is only for SSR, which the site
does not use). The future in-page WASM playground (§3), if it needs
COOP/COEP headers, can get them from Cloudflare `_headers`. **CI implemented
2026-06-15** (`.gitea/workflows/website.yaml`): a push touching `website/**`
builds the static site with pnpm and deploys `dist/` to the Cloudflare Pages
project **`relplay`** via `wrangler` (Direct Upload — no Git integration).
The `--branch` label selects environment against the project's production
branch (`main`): **`main` → production (`relplay.org`)**, **`website`
preview (`website.relplay.pages.dev`)**, with `staging.relplay.org` attachable
to the `website` branch alias. The crate's CI gate (`ci.yaml`) skips
website-only pushes; the build is pure-Node (the `.cast` files are committed,
so no cargo). Secrets: `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID`.
5. **Repo topology — monorepo.** The site lives under `website/` in the
playground repo; the crate stays at the repo root. The repo as a whole
moves to its public home later; site and crate travel together.
6. **Canonical docs home — the website.** User-facing documentation lives on
the site. In-repo `docs/` keeps ADRs, handoffs, and development notes;
`docs/simple-mode-limitations.md` (requirement DOC1) was a development aid
and now *feeds* the site's content rather than competing with it. The
sharing recipes promised by requirement E2 become a docs page.
7. **Documentation scope and conventions.** Document the **full supported
feature set**. Any capability not yet fully implemented (a small minority
— e.g. multi-line input, query cancellation, `seed`, `m:n` convenience,
ER-diagram export, the `show tables`/`relationships`/`indexes` family) is
either omitted or carries a clear **"planned / not yet available"**
callout — never presented as shipped. Two wording rules bind all
user-facing copy:
- **No engine name** (SQLite/STRICT/rusqlite/PRAGMA) — continues the
user-facing posture of ADR-0002; copy says "the database"/"the engine".
- **No "DSL"** — it is internal jargon. The two input modes are **simple
mode** (the playground's keyword command language) and **advanced
mode** (SQL).
8. **Install documentation — two mechanisms.** The install page documents
**prebuilt release binaries** (self-hosted download — not GitHub
Releases, since the repo will move) and **package managers**. Both can be
written now against the planned mechanisms; concrete download URLs slot in
at release. (Distribution items D1D3 in `requirements.md` remain the
tracking home for the release tooling itself.)
## Consequences
- The site can ship on the strength of already-implemented features; it is
gated on writing and recording, not on finishing the app.
- One recording format (asciinema `.cast`) serves both marketing and docs,
and is reusable as the app evolves (re-run the script, re-record).
- The WASM playground is preserved as a real future option without holding
up launch; the demo seam keeps the upgrade cheap.
- A single canonical docs home removes the divergence risk of maintaining
user docs in two places.
- Website build choices (Decisions 1, 2, 4, 5) are recorded here for
traceability but do not, by themselves, warrant further ADRs; only
app-architecture decisions (notably the future WASM port) will.
## Out of scope
- **In-page WASM playground***deferred* (see Decision 3); revisit as its
own ADR + iteration plan.
- **Hosted/SaaS playground or a server-backed doc CMS***rejected*: a
static site fully satisfies the need, consistent with ADR-0007's
no-hosted-publishing stance. Revisit only if real demand emerges.
+19
View File
@@ -0,0 +1,19 @@
# Website Architecture Decision Records
Decision records for the **public website + documentation site** subproject
(the Astro/Starlight site under `website/`). These are kept in their own
namespace, separate from the project-wide ADRs in
[`docs/adr/`](../../adr/README.md), so website decisions never compete with
the main global ADR sequence for numbers — see
[ADR-0000 "Numbering discipline"](../../adr/0000-record-architecture-decisions.md).
**Numbering.** Files are named `<date>-adr-website-<NNN>.md` and referenced
in prose as `ADR-website-NNN`. The `<date>` (the ADR's accepted/created day,
`YYYYMMDD`) plus the `website` segment keeps the namespace disjoint from
`main`'s integers. Assign the next free `NNN` from this index. Every ADR
change updates this index in the same edit (the ADR-0000 index-upkeep rule
applies here too).
## Index
- [ADR-website-001 — Public website and documentation site](20260604-adr-website-001.md) — **Accepted 2026-06-04** (formerly ADR-0044 in the main index; moved here 2026-06-10 to end recurring cross-branch number collisions). The first public website: a marketing landing page plus the **canonical** user docs. Stack **Astro 6 + Starlight + Tailwind v4** (chosen over SvelteKit + Tailwind for a docs-heavy + marketing site; interactive bits as Astro islands). Showcase demos are **asciinema** `.cast` recordings (scripted-input driver for paced, re-recordable sessions — *not* `history.log` replay), reused inline in docs. The **in-page WASM playground is deferred** (OOS: deferred) behind a stable `Demo` seam, with the portable-core vs native-edge boundary recorded for a future ADR + iteration plan. Portable **static build** (**Cloudflare** target via **Gitea Actions**, host-agnostic); **no CI yet**; **monorepo** (`website/`). Docs cover the **full supported feature set** with "planned" callouts for the unshipped minority; two wording rules bind user-facing copy — **no engine name** (continues ADR-0002) and **no "DSL"** ("simple mode" / "advanced mode"). Install docs cover **prebuilt binaries + package managers** (D1D3 track the release tooling). Plan: [`docs/website/plans/20260604-website-implementation-plan.md`](../plans/20260604-website-implementation-plan.md)
@@ -0,0 +1,198 @@
# Plan: public website and documentation site
**Date:** 2026-06-04 · **Status:** ready to build
Decisions for this work are recorded in
[ADR-website-001](../adr/20260604-adr-website-001.md): Astro 6 +
Starlight + Tailwind v4; asciinema demos reusable in docs; the in-page WASM
playground deferred behind a stable demo seam; portable static hosting
(Vercel target); monorepo (`website/`); website is the canonical docs home;
full-feature-set docs with "planned" callouts; install docs cover prebuilt
binaries + package managers. This plan is the *how*.
## Repository layout
The site lives under `website/` in this repo; the crate stays at the root.
```
website/
├── package.json # pnpm; astro, @astrojs/starlight, tailwind v4
├── astro.config.mjs # Starlight integration + sidebar nav
├── src/
│ ├── pages/index.astro # marketing landing (custom, not Starlight)
│ ├── components/
│ │ ├── Demo.astro # demo SLOT — the WASM-playground seam
│ │ └── Cast.astro # asciinema-player island wrapper
│ ├── content/docs/ # Starlight MDX docs (the bulk of the work)
│ └── styles/ # shared Tailwind + Starlight theme tokens
├── public/casts/ # recorded *.cast asciinema files
├── README.md # local dev + recording recipe
└── STYLE.md # living documentation style guide
```
Root `.gitignore` gains `website/node_modules`, `website/dist`,
`website/.astro`.
## Documentation inventory (grounded — drives Phase D scope)
Built from `docs/handoff/5559`, `docs/adr/*`, the command REGISTRY
(`src/dsl/grammar/mod.rs:603`, which also auto-assembles in-app `help`), the
`Command` enum (`src/dsl/command.rs:149`), and
`src/friendly/strings/en-US.yaml`**not** the coarse `requirements.md`
checkboxes (handoff-59 found those ~46% mis-marked; they now use a `[/]`
"partial" legend — trust the code, not the marker). Refreshed **2026-06-09
after merging `main`**, which added the show-list/detail, `help <command>`,
and compound-PK FK surface (see the dedicated bullet below). Test state:
**2193 passing, 0 failing, 1 ignored.**
**SHIPPED — document as-is (the doc core):**
- Input modes: simple, advanced (SQL), `:` one-shot escape, `mode` command,
per-project mode restore (ADR-0003/0015/0037).
- Full simple-mode command surface: create/drop table; add/drop/rename/
change column; add/drop 1:n relationship (named, ON DELETE/UPDATE
CASCADE/SET NULL/RESTRICT, `--create-fk`); add/drop index; insert/update/
delete (required WHERE + `--all-rows`; complex WHERE: AND/OR/NOT, LIKE,
IS NULL, IN, BETWEEN); show table/data (where/limit); add/drop constraint;
explain (ADR-0009/0013/0014/0025/0026/0028/0029).
- Full advanced-mode SQL: CREATE/DROP/ALTER TABLE (cols, constraints, inline
+ table FKs, rename, alter-column-type), CREATE [UNIQUE]/DROP INDEX; SELECT
(joins, GROUP BY/HAVING, ORDER BY, LIMIT/OFFSET, UNION/INTERSECT/EXCEPT,
WITH [RECURSIVE] CTEs); INSERT (multi-row, ON CONFLICT, RETURNING)/UPDATE/
DELETE; full expression grammar incl. CASE, CAST, curated functions;
EXPLAIN over SQL (ADR-00300039).
- Types: all ten, advanced-mode SQL aliases, serial/shortid auto-fill
(ADR-0005/0011/0017/0018). Constraints: PK incl. compound, NOT NULL,
UNIQUE, CHECK, DEFAULT, FK (ADR-0029/0013/0035).
- Undo/redo, history.log journal, replay, `--resume`, `--no-undo`
(ADR-0006/0034). Projects & storage: project.yaml + CSV + history.log,
save/save as/load/new/rebuild, temp projects, `--data-dir`
(ADR-0004/0015). Export/import (zip), clipboard copy/copy all/copy last
(ADR-0007/0041).
- Friendly errors (all five categories) + validity indicator
(ADR-0019/0027), DSL→SQL teaching echo (ADR-0038), EXPLAIN plan tree
(ADR-0028), box-drawing tables (ADR-0016), tab completion + syntax
highlighting + in-line editing (ADR-0022).
- **Added by the `main` merge (2026-06-09):** schema-inspection commands
`show tables` / `show relationships` / `show indexes` and the singular
`show relationship <name>` / `show index <name>` detail views (V5/V5a);
`help [<command>]` per-command detail + `help types` + general reference
(H3); **compound-primary-key foreign-key references** — DSL
`from <P>.(a, b) to <C>.(x, y)` and SQL `FOREIGN KEY (a, b) REFERENCES
P(x, y)` (single-column form unchanged) (ADR-0043, T3); friendlier
parse-error near-miss messaging (H1a, ADR-0042). These need coverage: a
schema-inspection page (the `show` family) and compound-FK examples on the
Relationships page.
**DOCUMENT WITH CAVEAT:** `add unique index` is advanced-only; simple-mode
table rename is intentionally absent (rename is `ALTER TABLE … RENAME TO`);
`hint` (H2) is still partial; a compound-FK *violation* message names only
the first column pair (enforcement is correct — a messaging-only residual).
**OMIT or MARK "planned":** multi-line input (I1), readline shortcuts (I1b),
in-flight cancellation / query timeout (I5/B3), `seed` (SD1), `m:n`
convenience (C4), one-step modify relationship (C3a), relationship line-art
(V1), ER-diagram export (V3), session-log + Markdown export (V4).
**Mine verbatim for docs:** `en-US.yaml` `help.app.*`, `help.ddl.*`,
`help.data.*`, `help.types_reference`, `parse.usage.*` (one-line syntax
templates), `hint.*` — keeps docs and in-app help consistent.
## Phases
### A — Scaffold
`pnpm create astro@latest` (Starlight template) in `website/`; `astro add
tailwind` (Tailwind v4 via `@tailwindcss/vite`); add
`@astrojs/starlight-tailwind`. Confirm `pnpm dev` serves and `pnpm build`
emits a static `dist/`. Echo build steps for traceability.
### B — Landing page
Custom `src/pages/index.astro` (Starlight owns `/docs/*`). Hero + value prop
("learn relational databases by doing"), feature highlights from the
inventory, an embedded demo cast above the fold. Use the `frontend-design`
skill to avoid generic AI aesthetics; honour NFR-4/5/7 (distinctive design,
meaningful colour, light/dark).
### C — asciinema recording workflow
Record real `rdbms-playground` sessions to `public/casts/*.cast` using a
**scripted-input driver** (e.g. `asciinema-automation`/autocast, or an
expect/doitlive script) for paced, re-recordable demos. Record at a fixed
sensible cols×rows; provide light + dark player themes. `Cast.astro` wraps
`asciinema-player` as a `client:visible` island; the same component embeds
casts inline in docs. Document the recipe in `website/README.md`.
(`asciinema` 2.4.0 is installed.)
### D — Documentation (the bulk)
**Five** top-level sidebar sections (autogenerated per directory). The key
split: *Using the playground* = the application you drive; *Reference* = the
database language you build with.
- **Getting started** — install (prebuilt binaries + package managers),
first project, simple vs. advanced mode, the example library.
- **Using the playground** — command-line options; the assistive editor
(completion, syntax highlighting, the `[ERR]`/`[WRN]` validity indicator,
hints, in-line editing); the output pane (PageUp/PageDown scrolling — the
fuller V4 session-log / Markdown export is *planned*, mark it); projects
(save / load / new / rebuild); undo, redo & history (+ replay); export &
import (E2 recipes); copy to clipboard; getting help (`help` /
`help <command>` / `hint`). (ADR-0003 "app-level commands" + ADR-0022/0027
typing assistance + the CLI.)
- **Guides** — task walkthroughs.
- **Reference** — the database language: Tables, Columns, Relationships,
Indexes, Constraints, Inserting & editing data, Querying & inspecting
(`show` / `select`), Types, Query plans (EXPLAIN), Errors explained, the
simple-command → SQL teaching echo.
- **Concepts** — the *why*: projects & storage model, the derived database,
how undo works.
**Surface the assistive editor prominently** — it is a differentiator and
most helps beginners: a landing-page card + a Getting-started mention, both
linking into *Using the playground*. It is prime asciinema-cast material
(completion / validity indicator are motion a still code block can't show).
Build order: Tier 1 simple-mode reference + types + constraints + input
modes + mined help/usage strings → Tier 2 advanced SQL + relationships +
project lifecycle + undo/history → Tier 3 teaching echo + EXPLAIN + errors +
completion/highlighting → Tier 4 clipboard + hints + editing.
Conventions live in the **living style guide** `website/STYLE.md` (binding
rules from ADR-website-001 §7 — no engine name, **no "DSL"**, "planned" callouts —
plus finer conventions and an open-decisions log for depth/splitting/example
dataset/etc. as they settle). Sources to mine: `src/dsl/command.rs`,
`src/dsl/grammar/*`, the REGISTRY, `en-US.yaml`, `docs/adr/*`,
`docs/simple-mode-limitations.md`.
### E — Hosting & portability
Keep the default static build (no adapter); `dist/` deploys to Vercel or any
static host. `website/README.md` notes the Vercel preset (root dir
`website/`) and the one-line `@astrojs/vercel` switch if SSR is ever needed.
## Demo seam (WASM hook)
`Demo.astro` exposes a stable contract (`{ src, title, height, autoplay }`).
At launch it renders `Cast.astro`; later a `Playground.astro` WASM island
swaps in behind the same props on the landing page and in docs, with zero
call-site changes. Boundary details are in ADR-website-001 §3.
## Verification
- `pnpm dev` renders landing + docs; `pnpm build` emits a clean static
`dist/` with no errors/warnings.
- Landing shows at least one playing `.cast`; the same component renders a
cast inline in a docs page (proves reuse).
- Starlight link-check passes (broken internal links fail the build).
- Docs grep clean of forbidden terms: **no "DSL"**, no engine name.
- A `dist/` static deploy works on Vercel (manual import) — confirms
portability. (No CI gate yet, per ADR-website-001 §4.)
## Notes / recommendations (non-blocking)
- **Doc drift:** consider generating the command reference from source (the
`help` REGISTRY / `en-US.yaml`) rather than hand-writing all of it.
- **Accessibility/SEO:** pair each hero `.cast` with a text transcript or the
equivalent docs snippet.
- **Branding/domain & analytics** unspecified — assume none until decided;
no third-party trackers without consent.
- Tailwind v4 + Starlight have occasional theme-token friction; the
`@astrojs/starlight-tailwind` plugin is the supported bridge.
- Starlight ships local search (Pagefind) by default.
- No `README.md` exists at the repo root yet — wanted for the destination
repo; out of this plan's core scope but flagged.
Generated
+82
View File
@@ -0,0 +1,82 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1780902259,
"narHash": "sha256-q8yYEC5f1mFlQO9RGna4LTc9QrcvWunX6FYp83munkQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "bd0ff2d3eac24699c3664d5966b9ef36f388e2ca",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1781234414,
"narHash": "sha256-HdA+P4fKRGOomkewnI/Tww5Wz4xK1O7+hDO90YAsPB4=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "1d18bfe3de6244c641ca4e8011186d0981b81d76",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
+98
View File
@@ -0,0 +1,98 @@
{
description = "RDBMS Playground Rust TUI dev environment + reproducible build";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, rust-overlay, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ (import rust-overlay) ];
};
# Single source of the Rust toolchain: the rustup toolchain file.
# rust-overlay provisions the exact channel + components declared there,
# so the dev shell and the build package share one pinned toolchain.
rust = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
# Read the package version straight from Cargo.toml so it never drifts
# from the crate metadata (no hand-maintained duplicate here).
cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
# System build inputs are deliberately tiny — this is a pure-Rust TUI:
# * libsqlite3-sys is built with the `bundled` feature, so SQLite is
# compiled from vendored C. That needs a C compiler, which the
# stdenv provides automatically (no entry required here).
# * arboard's clipboard backend is `x11rb` — a pure-Rust socket XCB
# client. It links no C X11 libraries, so none appear below. A live
# X server is only needed at *runtime* to copy; headless sessions
# fall back to OSC 52.
# If a future dependency introduces a pkg-config / native-lib link, add
# it here (and document why) rather than leaking it into the host env.
nativeBuildInputs = [ ];
buildInputs = [ ];
# `nix build` → the release binary, built reproducibly from the pinned
# toolchain and the committed Cargo.lock (importCargoLock fetches each
# dependency by its lockfile checksum — offline, no cargoHash to churn).
# CI's release job consumes this artifact; the gate's tests run
# separately via `nix develop -c cargo test` (see below), so the package
# build skips the suite — the nix sandbox has no HOME/X server and would
# fight the project-dirs / clipboard paths the tests touch.
rdbms-playground = pkgs.rustPlatform.buildRustPackage {
pname = cargoToml.package.name;
version = cargoToml.package.version;
src = ./.;
cargoLock.lockFile = ./Cargo.lock;
inherit nativeBuildInputs buildInputs;
doCheck = false;
};
in {
packages.default = rdbms-playground;
packages.rdbms-playground = rdbms-playground;
devShells.default = pkgs.mkShell {
buildInputs = buildInputs ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [
# macOS release builds (aarch64/x86_64-apple-darwin) link AppKit
# (arboard) + libSystem; the Apple SDK provides those framework/
# system-lib stubs as *system* paths (/usr/lib, /System/Library).
# NOTE: the darwin stdenv still propagates a *nix-store* libiconv and
# links it regardless of inputs, so the release workflow rewrites that
# one load path to /usr/lib/libiconv.2.dylib (install_name_tool) and
# re-signs — see release-macos / the macOS smoke-test. Adding
# `pkgs.libiconv` here would only reinforce the wrong path, so don't.
pkgs.apple-sdk
];
nativeBuildInputs = nativeBuildInputs ++ [
rust
# Dev-disk maintenance: cargo never garbage-collects stale per-hash
# build artifacts, so target/ creeps into the tens of GB (see
# CLAUDE.md "Build hygiene"). cargo-sweep prunes them; run it
# periodically between milestones.
pkgs.cargo-sweep
] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
# Cross-compilation for the non-macOS D1 targets: `cargo zigbuild`
# uses Zig's bundled clang + libc as one universal cross cc/linker
# (incl. the `cc`-crate compile of rusqlite's bundled SQLite C) for
# Linux musl + Windows gnu/gnullvm. macOS builds natively with the
# Apple toolchain on the Mac runner, so these are Linux-only.
pkgs.cargo-zigbuild
pkgs.zig
];
shellHook = ''
echo "RDBMS Playground dev shell ($(uname -s))"
echo " rust: $(rustc --version | cut -d' ' -f1-2)"
echo " cargo: $(cargo --version | cut -d' ' -f1-2)"
'';
};
});
}
+26
View File
@@ -0,0 +1,26 @@
[toolchain]
# Pinned to an exact stable release (not the floating "stable" channel) so
# `nix flake update` cannot surprise-bump Rust into new clippy lints that would
# fail the `-D warnings` CI gate. Matches the host toolchain and the datamage
# flake's convention (its ADR 0046). Bump deliberately, in its own commit.
channel = "1.95.0"
# rustfmt + clippy back the `fmt`/`clippy` CI stages; no coverage or WASM
# tooling is needed here (pure-Rust TUI).
components = ["rustfmt", "clippy"]
# The non-macOS D1 release matrix, all cross-built from Linux x86_64 via
# `cargo zigbuild` (D1: cross-platform binaries; D2: single static binary).
# Linux uses musl + crt-static for fully static, portable binaries; Windows
# uses the gnu/gnullvm ABIs (Zig statically links libc, so the .exe is
# standalone). macOS is deferred — its arboard/AppKit link needs Apple's SDK,
# which a Linux runner can't supply cleanly (see docs/ci/adr ADR-ci-001).
targets = [
"x86_64-unknown-linux-musl",
"aarch64-unknown-linux-musl",
"x86_64-pc-windows-gnu",
"aarch64-pc-windows-gnullvm",
# macOS — built natively on the Apple-Silicon Mac runner (aarch64 native,
# x86_64 cross). These need Apple's SDK to link, which a Linux runner can't
# supply, so they are produced only on the Mac (see docs/ci/adr ADR-ci-003).
"aarch64-apple-darwin",
"x86_64-apple-darwin",
]
+503 -5
View File
@@ -271,6 +271,13 @@ pub struct App {
pub nav_focus: NavFocus, pub nav_focus: NavFocus,
pub output: VecDeque<OutputLine>, pub output: VecDeque<OutputLine>,
pub hint: Option<String>, pub hint: Option<String>,
/// Catalog class key of the most recent runtime error (H2 /
/// ADR-0053 D5), e.g. `foreign_key.child_side`. Set when a
/// friendly error is rendered, cleared on the next successful
/// command. The submitted `hint` command and empty-input F1 use
/// it to render that error's tier-3 `hint.err.<class>` block.
/// `None` → no recent error → the "getting started" pointer.
pub last_error_hint_key: Option<String>,
/// The validity indicator's currently-visible verdict /// The validity indicator's currently-visible verdict
/// (ADR-0027). `None` means the indicator shows nothing — /// (ADR-0027). `None` means the indicator shows nothing —
/// the input is clean, or it is hidden mid-typing while the /// the input is clean, or it is hidden mid-typing while the
@@ -513,14 +520,16 @@ const HISTORY_CAPACITY: usize = 1000;
/// produces a glyph of its own (and so needs no badge) — ADR-0047 D2. /// produces a glyph of its own (and so needs no badge) — ADR-0047 D2.
/// ///
/// The set is exactly the *otherwise-invisible* keys: motion, editing, /// The set is exactly the *otherwise-invisible* keys: motion, editing,
/// submission, and the `Ctrl-O` navigation toggle. Plain character keys /// submission, the `Ctrl-O` navigation toggle, and the `Ctrl-G` F1-alias
/// already appear on the input line, and `Ctrl-C` (quit) / `Ctrl+]` /// (ADR-0047 amendment). Plain character keys already appear on the input
/// (the caption toggle) are deliberately excluded. Pure and total, so /// line, and `Ctrl-C` (quit) / `Ctrl+]` (the caption toggle) are
/// it is exhaustively unit-testable without a running app. /// deliberately excluded. Pure and total, so it is exhaustively
/// unit-testable without a running app.
pub const fn demo_badge_label(key: &KeyEvent) -> Option<&'static str> { pub const fn demo_badge_label(key: &KeyEvent) -> Option<&'static str> {
match (key.code, key.modifiers) { match (key.code, key.modifiers) {
(KeyCode::Tab, _) => Some("[TAB]"), (KeyCode::Tab, _) => Some("[TAB]"),
(KeyCode::BackTab, _) => Some("[SHIFT-TAB]"), (KeyCode::BackTab, _) => Some("[SHIFT-TAB]"),
(KeyCode::F(1), _) => Some("[F1]"),
(KeyCode::Enter, _) => Some("[ENTER]"), (KeyCode::Enter, _) => Some("[ENTER]"),
(KeyCode::Esc, _) => Some("[ESC]"), (KeyCode::Esc, _) => Some("[ESC]"),
(KeyCode::Up, _) => Some("[UP]"), (KeyCode::Up, _) => Some("[UP]"),
@@ -533,8 +542,12 @@ pub const fn demo_badge_label(key: &KeyEvent) -> Option<&'static str> {
(KeyCode::PageDown, _) => Some("[PGDN]"), (KeyCode::PageDown, _) => Some("[PGDN]"),
(KeyCode::Backspace, _) => Some("[BKSP]"), (KeyCode::Backspace, _) => Some("[BKSP]"),
(KeyCode::Delete, _) => Some("[DEL]"), (KeyCode::Delete, _) => Some("[DEL]"),
// The only badged control chord: the ADR-0046 navigation toggle. // The ADR-0046 navigation toggle.
(KeyCode::Char('o'), m) if m.contains(KeyModifiers::CONTROL) => Some("[CTRL-O]"), (KeyCode::Char('o'), m) if m.contains(KeyModifiers::CONTROL) => Some("[CTRL-O]"),
// ADR-0047 amendment: the Ctrl-G F1-alias badges AS [F1] so a
// cast recorded by a tool that can't send F1 looks identical to a
// real F1 press. (Only consulted in demo mode — the caller gates.)
(KeyCode::Char('g'), m) if m.contains(KeyModifiers::CONTROL) => Some("[F1]"),
_ => None, _ => None,
} }
} }
@@ -557,6 +570,7 @@ impl App {
nav_focus: NavFocus::Input, nav_focus: NavFocus::Input,
output: VecDeque::with_capacity(OUTPUT_CAPACITY), output: VecDeque::with_capacity(OUTPUT_CAPACITY),
hint: None, hint: None,
last_error_hint_key: None,
input_indicator: None, input_indicator: None,
tables: Vec::new(), tables: Vec::new(),
relationships: Vec::new(), relationships: Vec::new(),
@@ -1208,6 +1222,32 @@ impl App {
return self.handle_nav_key(key); return self.handle_nav_key(key);
} }
// H2 / ADR-0053: F1 is a read-only contextual-hint overlay —
// it emits into the output journal and must NOT touch the input
// buffer, cursor, or the completion memo, so it sits ahead of
// the memo-clearing completion match below. Non-empty input →
// a hint for the command being typed; empty input → expand on
// the most recent error (or a getting-started pointer).
//
// ADR-0047 amendment: in demo mode, Ctrl-G is an alias for F1.
// The cast recorder (autocast) can't emit F1 (an escape
// sequence) but can send the single control byte Ctrl-G; it
// badges AS [F1] (see `demo_badge_label`) so the cast is visually
// identical to a real F1 press. Demo-gated, so the shipped keymap
// stays F1-only.
let hint_key = key.code == KeyCode::F(1)
|| (self.demo_mode
&& (key.code, key.modifiers)
== (KeyCode::Char('g'), KeyModifiers::CONTROL));
if hint_key {
if self.input.trim().is_empty() {
self.note_hint_for_recent_error();
} else {
self.note_hint_for_input();
}
return Vec::new();
}
// ADR-0022 stage 8 — non-modal completion. Tab / // ADR-0022 stage 8 — non-modal completion. Tab /
// Shift-Tab cycle; Esc / Backspace undo the whole // Shift-Tab cycle; Esc / Backspace undo the whole
// last-Tab insertion in one keystroke while the memo // last-Tab insertion in one keystroke while the memo
@@ -1774,6 +1814,13 @@ impl App {
// recallable. The canonical (un-prefixed) text is what reaches // recallable. The canonical (un-prefixed) text is what reaches
// the journal via `ExecuteDsl.source`. // the journal via `ExecuteDsl.source`.
let is_app = matches!(&parsed, Ok(Command::App(_))); let is_app = matches!(&parsed, Ok(Command::App(_)));
// H2 / ADR-0053 D5: a new *DSL* command supersedes the previous
// runtime error for `hint`. App commands (incl. `hint` itself)
// and parse errors leave it intact, so `hint` still expands the
// last real error after, say, a `help` in between.
if matches!(&parsed, Ok(cmd) if !matches!(cmd, Command::App(_))) {
self.last_error_hint_key = None;
}
let advanced = submission_mode.is_advanced() && !is_app; let advanced = submission_mode.is_advanced() && !is_app;
let ring_line = if advanced { let ring_line = if advanced {
format!(": {effective_input}") format!(": {effective_input}")
@@ -1814,6 +1861,13 @@ impl App {
} }
Vec::new() Vec::new()
} }
// H2 / ADR-0053: a submitted `hint` acts on the most recent
// runtime error (the buffer is empty post-submit). The
// live-input surface is the F1 keybinding (handle_key).
AppCommand::Hint => {
self.note_hint_for_recent_error();
Vec::new()
}
AppCommand::Rebuild => vec![Action::PrepareRebuild], AppCommand::Rebuild => vec![Action::PrepareRebuild],
AppCommand::Save => self.handle_save_command(false), AppCommand::Save => self.handle_save_command(false),
AppCommand::SaveAs => self.handle_save_command(true), AppCommand::SaveAs => self.handle_save_command(true),
@@ -2422,6 +2476,10 @@ impl App {
// runtime built before posting the event. // runtime built before posting the event.
let ctx = self.build_translate_context(command, facts); let ctx = self.build_translate_context(command, facts);
let rendered = crate::friendly::translate_error(&error, &ctx).render(); let rendered = crate::friendly::translate_error(&error, &ctx).render();
// H2 / ADR-0053 D5: remember this error's tier-3 class so a
// following `hint` (or empty-input F1) can expand on it.
self.last_error_hint_key =
crate::friendly::error_hint_class(&error, &ctx).map(String::from);
warn!( warn!(
verb = command.verb(), verb = command.verb(),
error = %rendered, error = %rendered,
@@ -3091,6 +3149,109 @@ impl App {
} }
} }
// ── H2 / ADR-0053: contextual `hint` ────────────────────────
// Phase A wires the two surfaces (F1 → live input; the `hint`
// command → most recent error) plus the tier-2 fallback. The
// tier-3 corpus (`hint.cmd.*` / `hint.err.*`) is authored in later
// phases; until a block exists, `emit_tier3_block` returns false
// and the surface degrades to the ambient prose / getting-started
// pointer — never blank.
/// F1 with a non-empty buffer: a tier-3 hint for the command form
/// being typed, else the tier-2 ambient prose (ADR-0053 D2).
/// Read-only — callers guarantee the buffer/cursor/memo are left
/// untouched.
fn note_hint_for_input(&mut self) {
// `feedback_view` strips the `:` one-shot sigil and
// `effective_mode` reflects the one-shot advanced surface, so
// the hint matches the command the user is actually typing.
let (view, cursor, _off) = self.feedback_view();
let probe = view.to_string();
let mode = self.effective_mode().as_mode();
if let Some(id) = crate::dsl::grammar::hint_key_for_input_in_mode(&probe, mode)
&& self.emit_tier3_block(&format!("hint.cmd.{id}"))
{
return;
}
// Tier-2 fallback: surface the ambient prose as a persistent
// line (computed exactly as the live panel does).
let ambient = crate::input_render::ambient_hint_in_mode(
&probe,
cursor,
self.last_completion.as_ref(),
&self.schema_cache,
mode,
);
match ambient {
Some(crate::input_render::AmbientHint::Prose(text)) => {
self.push_category_three_prose(text);
}
Some(crate::input_render::AmbientHint::Candidates { items, .. }) => {
let names = items
.iter()
.map(|c| c.text.clone())
.collect::<Vec<_>>()
.join(", ");
self.push_category_three_prose(crate::t!("hint.ambient_expected", expected = names));
}
None => self.note_getting_started(),
}
}
/// The `hint` command (and empty-input F1): expand on the most
/// recent runtime error, else point the user at how to start
/// (ADR-0053 D2/D5).
fn note_hint_for_recent_error(&mut self) {
if let Some(class) = self.last_error_hint_key.clone()
&& self.emit_tier3_block(&format!("hint.err.{class}"))
{
return;
}
self.note_getting_started();
}
fn note_getting_started(&mut self) {
self.note_system(crate::t!("hint.getting_started"));
}
/// Render a tier-3 block (`<stem>.what` / `.example` / `.concept`)
/// when it has been authored; returns `false` if the `what` part is
/// absent so the caller can fall back to tier 2. `what` is
/// mandatory, `example`/`concept` optional (ADR-0053 D3). Styling
/// polish (the framed block) lands with the corpus.
fn emit_tier3_block(&mut self, stem: &str) -> bool {
let cat = crate::friendly::catalog();
let what_key = format!("{stem}.what");
if cat.get(&what_key).is_none() {
return false;
}
// Labelled block (ADR-0053 D4): a `Hint` heading, then aligned
// `What:` / `Example:` / `Concept:` lines. `concept` renders
// muted (`OutputStyleClass::Hint`); the rest are plain system.
let labelled = |label: &str, value: &str| {
// Pad `<Label>:` to a common width so the values align.
format!(" {:<9}{value}", format!("{label}:"))
};
self.note_system(crate::t!("hint.block.heading"));
self.note_system(labelled(
&crate::t!("hint.block.what"),
&crate::friendly::translate(&what_key, &[]),
));
if cat.get(&format!("{stem}.example")).is_some() {
self.note_system(labelled(
&crate::t!("hint.block.example"),
&crate::friendly::translate(&format!("{stem}.example"), &[]),
));
}
if cat.get(&format!("{stem}.concept")).is_some() {
self.push_category_three_prose(labelled(
&crate::t!("hint.block.concept"),
&crate::friendly::translate(&format!("{stem}.concept"), &[]),
));
}
true
}
fn note_system(&mut self, text: impl Into<String>) { fn note_system(&mut self, text: impl Into<String>) {
self.push_multiline(text.into(), OutputKind::System); self.push_multiline(text.into(), OutputKind::System);
} }
@@ -3314,6 +3475,13 @@ mod tests {
demo_badge_label(&ke(KeyCode::Char('o'), KeyModifiers::CONTROL)), demo_badge_label(&ke(KeyCode::Char('o'), KeyModifiers::CONTROL)),
Some("[CTRL-O]") Some("[CTRL-O]")
); );
// ADR-0047 amendment: the Ctrl-G F1-alias badges AS [F1], so a
// cast recorded with autocast (which can't send F1) is visually
// identical to a real F1 press.
assert_eq!(
demo_badge_label(&ke(KeyCode::Char('g'), KeyModifiers::CONTROL)),
Some("[F1]")
);
} }
#[test] #[test]
@@ -5539,6 +5707,336 @@ mod tests {
assert!(last.text.contains("Ghost"), "{}", last.text); assert!(last.text.contains("Ghost"), "{}", last.text);
} }
// ── H2 / ADR-0053: contextual `hint` (Phase A skeleton) ──────
fn f1(app: &mut App) -> Vec<Action> {
app.update(key(KeyCode::F(1)))
}
fn no_such_table_failure() -> AppEvent {
AppEvent::DslFailed {
command: Command::DropTable {
name: "Ghost".to_string(),
},
error: crate::db::DbError::Sqlite {
message: "no such table: Ghost".to_string(),
kind: crate::db::SqliteErrorKind::NoSuchTable,
},
facts: crate::friendly::FailureContext::default(),
source: String::new(),
advanced: false,
}
}
#[test]
fn hint_command_parses_to_app_hint() {
use crate::dsl::{parse_command, AppCommand, Command};
assert!(matches!(
parse_command("hint"),
Ok(Command::App(AppCommand::Hint))
));
}
#[test]
fn hint_command_with_no_recent_error_shows_getting_started() {
let mut app = App::new();
type_str(&mut app, "hint");
submit(&mut app);
assert!(output_contains(&app, "press F1"), "{}", error_lines(&app));
}
#[test]
fn f1_on_empty_input_with_no_error_shows_getting_started() {
let mut app = App::new();
let before = app.output.len();
f1(&mut app);
assert!(app.output.len() > before, "F1 must emit something");
assert!(output_contains(&app, "press F1"));
}
#[test]
fn f1_is_a_read_only_overlay() {
let mut app = App::new();
type_str(&mut app, "insert into T");
let input = app.input.clone();
let cursor = app.input_cursor;
let before = app.output.len();
f1(&mut app);
assert_eq!(app.input, input, "F1 must not change the buffer");
assert_eq!(app.input_cursor, cursor, "F1 must not move the cursor");
assert!(app.output.len() > before, "F1 emits a hint line");
}
#[test]
fn f1_preserves_the_completion_memo() {
let mut app = App::new();
type_str(&mut app, "show ");
app.update(key(KeyCode::Tab));
assert!(app.last_completion.is_some(), "precondition: Tab sets the memo");
let input = app.input.clone();
f1(&mut app);
assert!(app.last_completion.is_some(), "F1 must not clear the memo");
assert_eq!(app.input, input, "F1 must not change the buffer");
}
// ── ADR-0047 amendment: Ctrl-G is a demo-mode alias for F1 ──────
// The cast recorder (autocast) cannot emit F1 — an escape sequence —
// but Ctrl-G is a single legacy control byte it can send. Demo-gated
// so the real keymap stays F1-only, and badged as [F1] (see
// `demo_badge_label`) so a recorded cast looks identical to a genuine
// F1 press.
fn ctrl_g() -> AppEvent {
key_mod(KeyCode::Char('g'), KeyModifiers::CONTROL)
}
#[test]
fn ctrl_g_in_demo_mode_aliases_f1_on_input() {
let mut app = App::new();
app.demo_mode = true;
type_str(&mut app, "insert into T");
let input = app.input.clone();
let before = app.output.len();
app.update(ctrl_g());
assert_eq!(app.input, input, "Ctrl-G must not change the buffer (no `g` typed)");
assert!(app.output.len() > before, "Ctrl-G must emit the same hint F1 does");
}
#[test]
fn ctrl_g_in_demo_mode_aliases_f1_on_empty_input() {
let mut app = App::new();
app.demo_mode = true;
let before = app.output.len();
app.update(ctrl_g());
assert!(
app.output.len() > before,
"Ctrl-G on empty input emits the getting-started hint"
);
assert!(output_contains(&app, "press F1"));
}
#[test]
fn ctrl_g_outside_demo_mode_is_inert() {
// Not in demo mode: Ctrl-G is neither the hint alias nor a typed
// glyph (the `Char(c)` insert arm excludes CONTROL), so it falls
// through to the inert catch-all — no `g`, no hint.
let mut app = App::new();
type_str(&mut app, "insert");
let input = app.input.clone();
let before = app.output.len();
app.update(ctrl_g());
assert_eq!(app.input, input, "Ctrl-G must not insert a `g`");
assert_eq!(app.output.len(), before, "Ctrl-G does nothing when demo mode is off");
}
#[test]
fn dsl_failure_sets_hint_class_and_a_later_dsl_command_clears_it() {
let mut app = App::new();
app.update(no_such_table_failure());
assert_eq!(app.last_error_hint_key.as_deref(), Some("not_found"));
// A new DSL command supersedes the previous error.
type_str(&mut app, "drop table Ghost");
submit(&mut app);
assert_eq!(app.last_error_hint_key, None);
}
#[test]
fn app_command_does_not_clear_the_hint_class() {
let mut app = App::new();
app.update(no_such_table_failure());
assert_eq!(app.last_error_hint_key.as_deref(), Some("not_found"));
// `help` (an app command) leaves the last error intact, so a
// following `hint` still expands on it.
type_str(&mut app, "help");
submit(&mut app);
assert_eq!(
app.last_error_hint_key.as_deref(),
Some("not_found"),
"an app command must not clear the last error's hint class"
);
}
#[test]
fn hint_after_error_emits_a_hint_without_panicking() {
// Phase A: no tier-3 `hint.err.*` content exists yet, so the
// error path falls back to the getting-started pointer. (Phase C
// replaces this with the real error block.)
let mut app = App::new();
app.update(no_such_table_failure());
let before = app.output.len();
type_str(&mut app, "hint");
submit(&mut app);
assert!(app.output.len() > before, "hint must emit something");
}
#[test]
fn help_list_includes_hint() {
let mut app = App::new();
type_str(&mut app, "help");
submit(&mut app);
assert!(
output_contains(&app, "explain the most recent error"),
"help list must advertise the hint command"
);
}
#[test]
fn help_hint_describes_the_hint_command() {
let mut app = App::new();
type_str(&mut app, "help hint");
submit(&mut app);
assert!(output_contains(&app, "explain the most recent error"));
}
// ── Phase B: tier-3 exemplar content renders ────────────────
#[test]
fn f1_on_insert_input_renders_the_insert_hint_block() {
let mut app = App::new();
type_str(&mut app, "insert into Customers ");
f1(&mut app);
assert!(
output_contains(&app, "Add one or more rows to a table"),
"expected the insert tier-3 block"
);
}
/// Locks the rendered tier-3 block format (ADR-0053 D4): a `Hint`
/// heading + aligned `What:` / `Example:` / `Concept:` lines.
#[test]
fn insert_hint_block_renders_in_the_labelled_format() {
let mut app = App::new();
type_str(&mut app, "insert into Customers ");
f1(&mut app);
let block = app
.output
.iter()
.map(|l| l.text.as_str())
.collect::<Vec<_>>()
.join("\n");
insta::assert_snapshot!("hint_block_insert", block);
}
#[test]
fn f1_on_add_relationship_renders_the_relationship_block() {
let mut app = App::new();
type_str(&mut app, "add 1:n relationship from Customers.id to Orders.cust ");
f1(&mut app);
assert!(
output_contains(&app, "one parent, many children"),
"expected the add-relationship tier-3 block"
);
}
#[test]
fn f1_on_add_column_does_not_render_the_relationship_block() {
// Per-form disambiguation (ADR-0053 D3): `add column` resolves
// to `add_column` (no tier-3 block yet → tier-2 fallback), NOT
// the relationship block — proving the multi-form node keys
// per form, not per node.
let mut app = App::new();
type_str(&mut app, "add column Note text to Customers");
f1(&mut app);
assert!(!output_contains(&app, "one parent, many children"));
assert!(!output_contains(&app, "1:n"));
}
#[test]
fn hint_renders_the_foreign_key_error_block() {
let mut app = App::new();
app.last_error_hint_key = Some("foreign_key.child_side".to_string());
type_str(&mut app, "hint");
submit(&mut app);
assert!(
output_contains(&app, "doesn't match any parent row"),
"expected the FK child-side tier-3 block"
);
}
// ── Phase C batch 1: app-command hints render ───────────────
#[test]
fn f1_on_an_app_command_renders_its_hint_block() {
let mut app = App::new();
type_str(&mut app, "mode advanced");
f1(&mut app);
assert!(
output_contains(&app, "Switch between simple mode"),
"expected the `mode` tier-3 block"
);
}
// ── Phase C batch 2: DDL hints render (incl. multi-form DROP) ──
#[test]
fn f1_on_create_table_renders_its_hint_block() {
let mut app = App::new();
type_str(&mut app, "create table Customers with pk id(serial)");
f1(&mut app);
assert!(output_contains(&app, "Create a new table"));
}
#[test]
fn f1_disambiguates_drop_forms() {
let mut app = App::new();
type_str(&mut app, "drop index idx_email");
f1(&mut app);
// Resolves drop_index, not drop_table/column/etc.
assert!(output_contains(&app, "Remove an index by name"));
assert!(!output_contains(&app, "Remove a table"));
}
// ── Phase C batch 3: DML hints render (incl. multi-form SHOW) ──
#[test]
fn f1_on_update_renders_its_hint_block() {
let mut app = App::new();
type_str(&mut app, "update Customers set email = 'x' ");
f1(&mut app);
assert!(output_contains(&app, "Change values in the rows"));
}
#[test]
fn f1_disambiguates_show_forms() {
let mut app = App::new();
type_str(&mut app, "show relationships");
f1(&mut app);
assert!(output_contains(&app, "List all the relationships"));
assert!(!output_contains(&app, "rows stored in a table"));
}
// ── Phase C batch 4: advanced-SQL hints (mode-aware) ────────
#[test]
fn f1_in_advanced_mode_renders_the_sql_insert_hint() {
let mut app = App::new();
app.mode = Mode::Advanced;
type_str(&mut app, "insert into Customers (name) values ('x')");
f1(&mut app);
assert!(output_contains(&app, "Insert rows with SQL"));
assert!(!output_contains(&app, "Add one or more rows"));
}
#[test]
fn f1_on_select_renders_the_select_hint() {
let mut app = App::new();
app.mode = Mode::Advanced;
type_str(&mut app, "select name from Customers");
f1(&mut app);
assert!(output_contains(&app, "heart of SQL"));
}
// ── Phase C batch 5: runtime error-class hints render ───────
#[test]
fn hint_renders_a_runtime_error_block() {
let mut app = App::new();
app.last_error_hint_key = Some("unique".to_string());
type_str(&mut app, "hint");
submit(&mut app);
assert!(output_contains(&app, "must be unique"));
}
#[test] #[test]
fn messages_command_toggles_verbosity_and_reports() { fn messages_command_toggles_verbosity_and_reports() {
let mut app = App::new(); let mut app = App::new();
+116 -272
View File
File diff suppressed because it is too large Load Diff
+6
View File
@@ -552,6 +552,11 @@ pub enum AppCommand {
Help { Help {
topic: Option<String>, topic: Option<String>,
}, },
/// Show a contextual tier-3 hint (H2 / ADR-0053). No argument:
/// when submitted, it expands on the most recent runtime error
/// (the buffer is empty post-submit). The live-input surface is
/// the F1 keybinding, handled in `App::handle_key`, not here.
Hint,
/// Rebuild `playground.db` from `project.yaml` + data/, with /// Rebuild `playground.db` from `project.yaml` + data/, with
/// confirmation modal. /// confirmation modal.
Rebuild, Rebuild,
@@ -1013,6 +1018,7 @@ impl Command {
Self::App(app) => match app { Self::App(app) => match app {
AppCommand::Quit => "quit", AppCommand::Quit => "quit",
AppCommand::Help { .. } => "help", AppCommand::Help { .. } => "help",
AppCommand::Hint => "hint",
AppCommand::Rebuild => "rebuild", AppCommand::Rebuild => "rebuild",
AppCommand::Save => "save", AppCommand::Save => "save",
AppCommand::SaveAs => "save as", AppCommand::SaveAs => "save as",
+25
View File
@@ -177,6 +177,9 @@ const fn build_rebuild(_path: &MatchedPath, _source: &str) -> Result<Command, Va
const fn build_undo(_path: &MatchedPath, _source: &str) -> Result<Command, ValidationError> { const fn build_undo(_path: &MatchedPath, _source: &str) -> Result<Command, ValidationError> {
Ok(Command::App(AppCommand::Undo)) Ok(Command::App(AppCommand::Undo))
} }
const fn build_hint(_path: &MatchedPath, _source: &str) -> Result<Command, ValidationError> {
Ok(Command::App(AppCommand::Hint))
}
const fn build_redo(_path: &MatchedPath, _source: &str) -> Result<Command, ValidationError> { const fn build_redo(_path: &MatchedPath, _source: &str) -> Result<Command, ValidationError> {
Ok(Command::App(AppCommand::Redo)) Ok(Command::App(AppCommand::Redo))
@@ -263,6 +266,7 @@ pub static QUIT: CommandNode = CommandNode {
shape: EMPTY_SEQ, shape: EMPTY_SEQ,
ast_builder: build_quit, ast_builder: build_quit,
help_id: Some("app.quit"), help_id: Some("app.quit"),
hint_ids: &["quit"],
usage_ids: &["parse.usage.quit"],}; usage_ids: &["parse.usage.quit"],};
pub static HELP: CommandNode = CommandNode { pub static HELP: CommandNode = CommandNode {
@@ -270,13 +274,24 @@ pub static HELP: CommandNode = CommandNode {
shape: HELP_TOPIC_OPT, shape: HELP_TOPIC_OPT,
ast_builder: build_help, ast_builder: build_help,
help_id: Some("app.help"), help_id: Some("app.help"),
hint_ids: &["help"],
usage_ids: &["parse.usage.help"],}; usage_ids: &["parse.usage.help"],};
pub static HINT: CommandNode = CommandNode {
entry: Word::keyword("hint"),
shape: EMPTY_SEQ,
ast_builder: build_hint,
help_id: Some("app.hint"),
// hint_id assigned in Phase C with the tier-3 corpus (ADR-0053).
hint_ids: &["hint"],
usage_ids: &["parse.usage.hint"],};
pub static REBUILD: CommandNode = CommandNode { pub static REBUILD: CommandNode = CommandNode {
entry: Word::keyword("rebuild"), entry: Word::keyword("rebuild"),
shape: EMPTY_SEQ, shape: EMPTY_SEQ,
ast_builder: build_rebuild, ast_builder: build_rebuild,
help_id: Some("app.rebuild"), help_id: Some("app.rebuild"),
hint_ids: &["rebuild"],
usage_ids: &["parse.usage.rebuild"],}; usage_ids: &["parse.usage.rebuild"],};
pub static SAVE: CommandNode = CommandNode { pub static SAVE: CommandNode = CommandNode {
@@ -284,6 +299,7 @@ pub static SAVE: CommandNode = CommandNode {
shape: SAVE_AS_OPT, shape: SAVE_AS_OPT,
ast_builder: build_save, ast_builder: build_save,
help_id: Some("app.save"), help_id: Some("app.save"),
hint_ids: &["save"],
usage_ids: &["parse.usage.save"],}; usage_ids: &["parse.usage.save"],};
pub static NEW: CommandNode = CommandNode { pub static NEW: CommandNode = CommandNode {
@@ -291,6 +307,7 @@ pub static NEW: CommandNode = CommandNode {
shape: EMPTY_SEQ, shape: EMPTY_SEQ,
ast_builder: build_new, ast_builder: build_new,
help_id: Some("app.new"), help_id: Some("app.new"),
hint_ids: &["new"],
usage_ids: &["parse.usage.new"],}; usage_ids: &["parse.usage.new"],};
pub static LOAD: CommandNode = CommandNode { pub static LOAD: CommandNode = CommandNode {
@@ -298,6 +315,7 @@ pub static LOAD: CommandNode = CommandNode {
shape: EMPTY_SEQ, shape: EMPTY_SEQ,
ast_builder: build_load, ast_builder: build_load,
help_id: Some("app.load"), help_id: Some("app.load"),
hint_ids: &["load"],
usage_ids: &["parse.usage.load"],}; usage_ids: &["parse.usage.load"],};
pub static EXPORT: CommandNode = CommandNode { pub static EXPORT: CommandNode = CommandNode {
@@ -305,6 +323,7 @@ pub static EXPORT: CommandNode = CommandNode {
shape: EXPORT_PATH_OPT, shape: EXPORT_PATH_OPT,
ast_builder: build_export, ast_builder: build_export,
help_id: Some("app.export"), help_id: Some("app.export"),
hint_ids: &["export"],
usage_ids: &["parse.usage.export"],}; usage_ids: &["parse.usage.export"],};
pub static IMPORT: CommandNode = CommandNode { pub static IMPORT: CommandNode = CommandNode {
@@ -312,6 +331,7 @@ pub static IMPORT: CommandNode = CommandNode {
shape: IMPORT_BODY_OPT, shape: IMPORT_BODY_OPT,
ast_builder: build_import, ast_builder: build_import,
help_id: Some("app.import"), help_id: Some("app.import"),
hint_ids: &["import"],
usage_ids: &["parse.usage.import"],}; usage_ids: &["parse.usage.import"],};
pub static MODE: CommandNode = CommandNode { pub static MODE: CommandNode = CommandNode {
@@ -319,6 +339,7 @@ pub static MODE: CommandNode = CommandNode {
shape: MODE_VALUE, shape: MODE_VALUE,
ast_builder: build_mode, ast_builder: build_mode,
help_id: Some("app.mode"), help_id: Some("app.mode"),
hint_ids: &["mode"],
usage_ids: &["parse.usage.mode"],}; usage_ids: &["parse.usage.mode"],};
pub static MESSAGES: CommandNode = CommandNode { pub static MESSAGES: CommandNode = CommandNode {
@@ -326,6 +347,7 @@ pub static MESSAGES: CommandNode = CommandNode {
shape: MESSAGES_VALUE_OPT, shape: MESSAGES_VALUE_OPT,
ast_builder: build_messages, ast_builder: build_messages,
help_id: Some("app.messages"), help_id: Some("app.messages"),
hint_ids: &["messages"],
usage_ids: &["parse.usage.messages"],}; usage_ids: &["parse.usage.messages"],};
pub static UNDO: CommandNode = CommandNode { pub static UNDO: CommandNode = CommandNode {
@@ -333,6 +355,7 @@ pub static UNDO: CommandNode = CommandNode {
shape: EMPTY_SEQ, shape: EMPTY_SEQ,
ast_builder: build_undo, ast_builder: build_undo,
help_id: Some("app.undo"), help_id: Some("app.undo"),
hint_ids: &["undo"],
usage_ids: &["parse.usage.undo"],}; usage_ids: &["parse.usage.undo"],};
pub static REDO: CommandNode = CommandNode { pub static REDO: CommandNode = CommandNode {
@@ -340,6 +363,7 @@ pub static REDO: CommandNode = CommandNode {
shape: EMPTY_SEQ, shape: EMPTY_SEQ,
ast_builder: build_redo, ast_builder: build_redo,
help_id: Some("app.redo"), help_id: Some("app.redo"),
hint_ids: &["redo"],
usage_ids: &["parse.usage.redo"],}; usage_ids: &["parse.usage.redo"],};
pub static COPY: CommandNode = CommandNode { pub static COPY: CommandNode = CommandNode {
@@ -347,4 +371,5 @@ pub static COPY: CommandNode = CommandNode {
shape: COPY_VALUE_OPT, shape: COPY_VALUE_OPT,
ast_builder: build_copy, ast_builder: build_copy,
help_id: Some("app.copy"), help_id: Some("app.copy"),
hint_ids: &["copy"],
usage_ids: &["parse.usage.copy"],}; usage_ids: &["parse.usage.copy"],};
+20
View File
@@ -1790,6 +1790,13 @@ pub static SHOW: CommandNode = CommandNode {
shape: SHOW_SHAPE, shape: SHOW_SHAPE,
ast_builder: build_show, ast_builder: build_show,
help_id: Some("data.show"), help_id: Some("data.show"),
hint_ids: &[
"show_data",
"show_table",
"show_tables",
"show_relationships",
"show_indexes",
],
usage_ids: &[ usage_ids: &[
"parse.usage.show_data", "parse.usage.show_data",
"parse.usage.show_table", "parse.usage.show_table",
@@ -1805,6 +1812,7 @@ pub static SEED: CommandNode = CommandNode {
shape: SEED_SHAPE, shape: SEED_SHAPE,
ast_builder: build_seed, ast_builder: build_seed,
help_id: Some("data.seed"), help_id: Some("data.seed"),
hint_ids: &["seed"],
usage_ids: &["parse.usage.seed"], usage_ids: &["parse.usage.seed"],
}; };
@@ -1813,6 +1821,8 @@ pub static INSERT: CommandNode = CommandNode {
shape: INSERT_SHAPE, shape: INSERT_SHAPE,
ast_builder: build_insert, ast_builder: build_insert,
help_id: Some("data.insert"), help_id: Some("data.insert"),
// ADR-0053 Phase-B exemplar.
hint_ids: &["insert"],
usage_ids: &["parse.usage.insert"],}; usage_ids: &["parse.usage.insert"],};
pub static UPDATE: CommandNode = CommandNode { pub static UPDATE: CommandNode = CommandNode {
@@ -1820,6 +1830,7 @@ pub static UPDATE: CommandNode = CommandNode {
shape: UPDATE_SHAPE, shape: UPDATE_SHAPE,
ast_builder: build_update, ast_builder: build_update,
help_id: Some("data.update"), help_id: Some("data.update"),
hint_ids: &["update"],
usage_ids: &["parse.usage.update"],}; usage_ids: &["parse.usage.update"],};
pub static DELETE: CommandNode = CommandNode { pub static DELETE: CommandNode = CommandNode {
@@ -1827,6 +1838,7 @@ pub static DELETE: CommandNode = CommandNode {
shape: DELETE_SHAPE, shape: DELETE_SHAPE,
ast_builder: build_delete, ast_builder: build_delete,
help_id: Some("data.delete"), help_id: Some("data.delete"),
hint_ids: &["delete"],
usage_ids: &["parse.usage.delete"],}; usage_ids: &["parse.usage.delete"],};
pub static REPLAY: CommandNode = CommandNode { pub static REPLAY: CommandNode = CommandNode {
@@ -1834,6 +1846,7 @@ pub static REPLAY: CommandNode = CommandNode {
shape: REPLAY_PATH, shape: REPLAY_PATH,
ast_builder: build_replay, ast_builder: build_replay,
help_id: Some("data.replay"), help_id: Some("data.replay"),
hint_ids: &["replay"],
usage_ids: &["parse.usage.replay"],}; usage_ids: &["parse.usage.replay"],};
pub static EXPLAIN: CommandNode = CommandNode { pub static EXPLAIN: CommandNode = CommandNode {
@@ -1841,6 +1854,7 @@ pub static EXPLAIN: CommandNode = CommandNode {
shape: EXPLAIN_SHAPE, shape: EXPLAIN_SHAPE,
ast_builder: build_explain, ast_builder: build_explain,
help_id: Some("data.explain"), help_id: Some("data.explain"),
hint_ids: &["explain"],
usage_ids: &["parse.usage.explain"],}; usage_ids: &["parse.usage.explain"],};
/// `explain` over advanced-mode SQL (ADR-0039). /// `explain` over advanced-mode SQL (ADR-0039).
@@ -1860,6 +1874,7 @@ pub static EXPLAIN_SQL: CommandNode = CommandNode {
// too). Mirrors the `SQL_INSERT`/`SQL_UPDATE`/`SQL_DELETE` // too). Mirrors the `SQL_INSERT`/`SQL_UPDATE`/`SQL_DELETE`
// precedent; otherwise `note_help` would print `explain` twice. // precedent; otherwise `note_help` would print `explain` twice.
help_id: None, help_id: None,
hint_ids: &["explain_sql"],
usage_ids: &[],}; usage_ids: &[],};
/// SQL `SELECT` (ADR-0030 §6, ADR-0031, ADR-0032). /// SQL `SELECT` (ADR-0030 §6, ADR-0031, ADR-0032).
@@ -1875,6 +1890,7 @@ pub static SELECT: CommandNode = CommandNode {
shape: Node::Subgrammar(&sql_select::SQL_SELECT_TAIL), shape: Node::Subgrammar(&sql_select::SQL_SELECT_TAIL),
ast_builder: build_select, ast_builder: build_select,
help_id: None, help_id: None,
hint_ids: &["select"],
usage_ids: &["parse.usage.select"],}; usage_ids: &["parse.usage.select"],};
/// `WITH …` top-level statement (ADR-0032 §4 / sub-phase 2c). /// `WITH …` top-level statement (ADR-0032 §4 / sub-phase 2c).
@@ -1889,6 +1905,7 @@ pub static WITH: CommandNode = CommandNode {
shape: Node::Subgrammar(&sql_select::SQL_WITH_TAIL), shape: Node::Subgrammar(&sql_select::SQL_WITH_TAIL),
ast_builder: build_select, ast_builder: build_select,
help_id: None, help_id: None,
hint_ids: &["with"],
usage_ids: &["parse.usage.with"],}; usage_ids: &["parse.usage.with"],};
/// SQL `INSERT` — the `Advanced`-category node of the shared /// SQL `INSERT` — the `Advanced`-category node of the shared
@@ -1906,6 +1923,7 @@ pub static SQL_INSERT: CommandNode = CommandNode {
shape: Node::Subgrammar(&sql_insert::SQL_INSERT_SHAPE), shape: Node::Subgrammar(&sql_insert::SQL_INSERT_SHAPE),
ast_builder: build_sql_insert, ast_builder: build_sql_insert,
help_id: None, help_id: None,
hint_ids: &["sql_insert"],
usage_ids: &[], usage_ids: &[],
}; };
@@ -1919,6 +1937,7 @@ pub static SQL_UPDATE: CommandNode = CommandNode {
shape: Node::Subgrammar(&sql_update::SQL_UPDATE_SHAPE), shape: Node::Subgrammar(&sql_update::SQL_UPDATE_SHAPE),
ast_builder: build_sql_update, ast_builder: build_sql_update,
help_id: None, help_id: None,
hint_ids: &["sql_update"],
usage_ids: &[], usage_ids: &[],
}; };
@@ -1934,6 +1953,7 @@ pub static SQL_DELETE: CommandNode = CommandNode {
shape: Node::Subgrammar(&sql_delete::SQL_DELETE_SHAPE), shape: Node::Subgrammar(&sql_delete::SQL_DELETE_SHAPE),
ast_builder: build_sql_delete, ast_builder: build_sql_delete,
help_id: None, help_id: None,
hint_ids: &["sql_delete"],
usage_ids: &[], usage_ids: &[],
}; };
+26
View File
@@ -968,6 +968,13 @@ pub static DROP: CommandNode = CommandNode {
shape: DROP_SHAPE, shape: DROP_SHAPE,
ast_builder: build_drop, ast_builder: build_drop,
help_id: Some("ddl.drop"), help_id: Some("ddl.drop"),
hint_ids: &[
"drop_table",
"drop_column",
"drop_relationship",
"drop_index",
"drop_constraint",
],
usage_ids: &[ usage_ids: &[
"parse.usage.drop_table", "parse.usage.drop_table",
"parse.usage.drop_column", "parse.usage.drop_column",
@@ -981,6 +988,16 @@ pub static ADD: CommandNode = CommandNode {
shape: ADD_SHAPE, shape: ADD_SHAPE,
ast_builder: build_add, ast_builder: build_add,
help_id: Some("ddl.add"), help_id: Some("ddl.add"),
// Per-form (ADR-0053 D3): every form is listed so the form-word
// disambiguation resolves correctly; forms without an authored
// block yet fall back to tier-2 at render. `add_relationship` is
// authored as a Phase-B exemplar.
hint_ids: &[
"add_column",
"add_relationship",
"add_index",
"add_constraint",
],
usage_ids: &[ usage_ids: &[
"parse.usage.add_column", "parse.usage.add_column",
"parse.usage.add_relationship", "parse.usage.add_relationship",
@@ -993,6 +1010,7 @@ pub static RENAME: CommandNode = CommandNode {
shape: RENAME_COLUMN, shape: RENAME_COLUMN,
ast_builder: build_rename_column, ast_builder: build_rename_column,
help_id: Some("ddl.rename"), help_id: Some("ddl.rename"),
hint_ids: &["rename_column"],
usage_ids: &["parse.usage.rename_column"],}; usage_ids: &["parse.usage.rename_column"],};
pub static CHANGE: CommandNode = CommandNode { pub static CHANGE: CommandNode = CommandNode {
@@ -1000,6 +1018,7 @@ pub static CHANGE: CommandNode = CommandNode {
shape: CHANGE_COLUMN, shape: CHANGE_COLUMN,
ast_builder: build_change_column, ast_builder: build_change_column,
help_id: Some("ddl.change"), help_id: Some("ddl.change"),
hint_ids: &["change_column"],
usage_ids: &["parse.usage.change_column"],}; usage_ids: &["parse.usage.change_column"],};
// ================================================================= // =================================================================
@@ -1360,6 +1379,7 @@ pub static CREATE: CommandNode = CommandNode {
shape: CREATE_TABLE, shape: CREATE_TABLE,
ast_builder: build_create_table, ast_builder: build_create_table,
help_id: Some("ddl.create"), help_id: Some("ddl.create"),
hint_ids: &["create_table"],
usage_ids: &["parse.usage.create_table"],}; usage_ids: &["parse.usage.create_table"],};
// ================================================================= // =================================================================
@@ -1428,6 +1448,7 @@ pub static CREATE_M2N: CommandNode = CommandNode {
shape: CREATE_M2N_SHAPE, shape: CREATE_M2N_SHAPE,
ast_builder: build_create_m2n, ast_builder: build_create_m2n,
help_id: Some("ddl.create_m2n"), help_id: Some("ddl.create_m2n"),
hint_ids: &["create_m2n"],
usage_ids: &["parse.usage.create_m2n"], usage_ids: &["parse.usage.create_m2n"],
}; };
@@ -1858,6 +1879,7 @@ pub static SQL_CREATE_TABLE: CommandNode = CommandNode {
shape: Node::Subgrammar(&super::sql_create_table::SQL_CREATE_TABLE_SHAPE), shape: Node::Subgrammar(&super::sql_create_table::SQL_CREATE_TABLE_SHAPE),
ast_builder: build_sql_create_table, ast_builder: build_sql_create_table,
help_id: Some("ddl.sql_create_table"), help_id: Some("ddl.sql_create_table"),
hint_ids: &["sql_create_table"],
usage_ids: &["parse.usage.sql_create_table"], usage_ids: &["parse.usage.sql_create_table"],
}; };
@@ -1877,6 +1899,7 @@ pub static SQL_DROP_TABLE: CommandNode = CommandNode {
shape: SQL_DROP_TABLE_SHAPE, shape: SQL_DROP_TABLE_SHAPE,
ast_builder: build_sql_drop_table, ast_builder: build_sql_drop_table,
help_id: Some("ddl.sql_drop_table"), help_id: Some("ddl.sql_drop_table"),
hint_ids: &["sql_drop_table"],
usage_ids: &["parse.usage.sql_drop_table"], usage_ids: &["parse.usage.sql_drop_table"],
}; };
@@ -1896,6 +1919,7 @@ pub static SQL_DROP_INDEX: CommandNode = CommandNode {
shape: SQL_DROP_INDEX_SHAPE, shape: SQL_DROP_INDEX_SHAPE,
ast_builder: build_sql_drop_index, ast_builder: build_sql_drop_index,
help_id: Some("ddl.sql_drop_index"), help_id: Some("ddl.sql_drop_index"),
hint_ids: &["sql_drop_index"],
usage_ids: &["parse.usage.sql_drop_index"], usage_ids: &["parse.usage.sql_drop_index"],
}; };
@@ -1977,6 +2001,7 @@ pub static SQL_CREATE_INDEX: CommandNode = CommandNode {
shape: SQL_CREATE_INDEX_SHAPE, shape: SQL_CREATE_INDEX_SHAPE,
ast_builder: build_sql_create_index, ast_builder: build_sql_create_index,
help_id: Some("ddl.sql_create_index"), help_id: Some("ddl.sql_create_index"),
hint_ids: &["sql_create_index"],
usage_ids: &["parse.usage.sql_create_index"], usage_ids: &["parse.usage.sql_create_index"],
}; };
@@ -2535,6 +2560,7 @@ pub static SQL_ALTER_TABLE: CommandNode = CommandNode {
shape: SQL_ALTER_TABLE_SHAPE, shape: SQL_ALTER_TABLE_SHAPE,
ast_builder: build_sql_alter_table, ast_builder: build_sql_alter_table,
help_id: Some("ddl.sql_alter_table"), help_id: Some("ddl.sql_alter_table"),
hint_ids: &["sql_alter_table"],
usage_ids: &["parse.usage.sql_alter_table"], usage_ids: &["parse.usage.sql_alter_table"],
}; };
+286 -39
View File
@@ -530,6 +530,18 @@ pub struct CommandNode {
/// so a newly-registered command appears in `help` /// so a newly-registered command appears in `help`
/// automatically (ADR-0024 §help_id). /// automatically (ADR-0024 §help_id).
pub help_id: Option<&'static str>, pub help_id: Option<&'static str>,
/// Catalog key stems (`hint.cmd.<id>`) for this command's
/// **tier-3** contextual hints (ADR-0053 / H2), **one per form**,
/// mirroring `usage_ids`. A single-form command carries one; a
/// multi-form command (`add`, `drop`, `show`, `create`) carries
/// one per form so a live-input hint can be specific to the form
/// being typed (`hint.cmd.add_relationship`, not a shared `add`
/// block). `hint_key_for_input_in_mode` disambiguates by the form
/// word, reusing `usage_key_for_input_in_mode`'s logic. Empty
/// until a form's tier-3 block is authored (the surface falls back
/// to tier-2 ambient/error text). Distinct from `help_id` (which is
/// `None` on advanced-SQL forms purely to dedup the `help` list).
pub hint_ids: &'static [&'static str],
/// Catalog keys under `parse.usage.*` to render in the /// Catalog keys under `parse.usage.*` to render in the
/// "usage:" block when a parse error fires for this command /// "usage:" block when a parse error fires for this command
/// (ADR-0021 §1, ADR-0024 §architecture). Multi-form families /// (ADR-0021 §1, ADR-0024 §architecture). Multi-form families
@@ -574,32 +586,100 @@ pub fn usage_keys_for_input_in_mode(
source: &str, source: &str,
mode: crate::mode::Mode, mode: crate::mode::Mode,
) -> Option<(&'static str, Vec<&'static str>)> { ) -> Option<(&'static str, Vec<&'static str>)> {
let pick = selected_nodes_for_input_in_mode(source, mode);
if pick.is_empty() {
return None;
}
let mut keys: Vec<&'static str> = Vec::new();
for (_, node, _) in &pick {
for k in node.usage_ids {
if !keys.contains(k) {
keys.push(*k);
}
}
}
if keys.is_empty() {
return None;
}
let entry = pick[0].1.entry.primary;
Some((entry, keys))
}
/// The single tier-3 hint key (`hint.cmd.<id>` stem) for the command
/// **form** `source` is currently typing, in `mode` (H2 / ADR-0053).
///
/// Mirrors [`usage_key_for_input_in_mode`]: the union of the
/// mode-selected nodes' `hint_ids`, disambiguated to the typed form by
/// [`pick_form_key`] — so `add 1:n relationship` resolves to the
/// relationship hint, and an advanced-SQL form resolves to its own
/// (not its simple sibling's). `None` if no entry word matches or the
/// form has no tier-3 block yet (the caller falls back to tier-2).
#[must_use]
pub fn hint_key_for_input_in_mode(source: &str, mode: crate::mode::Mode) -> Option<&'static str> {
use crate::dsl::walker::lex_helpers::{consume_ident, skip_whitespace};
let nodes = selected_nodes_for_input_in_mode(source, mode);
if nodes.is_empty() {
return None;
}
// Mode-ordered union (advanced-primary first in advanced mode), so a
// shared entry word resolves to the surface the user is in.
let mut keys: Vec<&'static str> = Vec::new();
for (_, node, _) in &nodes {
for k in node.hint_ids {
if !keys.contains(k) {
keys.push(*k);
}
}
}
if keys.is_empty() {
return None;
}
if keys.len() == 1 {
return Some(keys[0]);
}
// A bare multi-form entry word (no form word yet — `add`⏎) has no
// chosen form: defer to tier-2, which lists the choices.
let start = skip_whitespace(source, 0);
if let Some((_, entry_end)) = consume_ident(source, start)
&& skip_whitespace(source, entry_end) >= source.len()
{
return None;
}
// A form word picks the form (`drop column` → `drop_column`); when
// the second token isn't a form word (`insert into …`, `update …
// set`), fall back to the mode-primary key — in advanced mode the
// SQL form, in simple mode the DSL form.
pick_form_key(source, &keys).or_else(|| keys.first().copied())
}
/// Shared mode-aware command-form selection for the entry word at the
/// start of `source`.
///
/// Extracted so the usage-key and hint-id lookups agree on which form
/// the user is typing.
///
/// Advanced mode: every candidate form is reachable — the SQL nodes
/// are primary, and the DSL nodes remain valid via fallback (verified:
/// `create table … with pk` and `drop column …` both run in advanced
/// mode). Mode-primary (Advanced) first, so a hint never hides input
/// that works. Simple mode: only the DSL forms — the SQL-only forms
/// hit the "this is SQL" rail and are not reachable. (ADR-0042 G3.)
/// Degenerate guard: an advanced-only word in simple mode leaves the
/// selection empty; fall back to all candidates.
fn selected_nodes_for_input_in_mode(
source: &str,
mode: crate::mode::Mode,
) -> Vec<(usize, &'static CommandNode, CommandCategory)> {
use crate::dsl::walker::lex_helpers::{consume_ident, skip_whitespace}; use crate::dsl::walker::lex_helpers::{consume_ident, skip_whitespace};
let start = skip_whitespace(source, 0); let start = skip_whitespace(source, 0);
let (kw_start, kw_end) = consume_ident(source, start)?; let Some((kw_start, kw_end)) = consume_ident(source, start) else {
return Vec::new();
};
let word = &source[kw_start..kw_end]; let word = &source[kw_start..kw_end];
let candidates = commands_for_entry_word(word); let candidates = commands_for_entry_word(word);
if candidates.is_empty() { if candidates.is_empty() {
return None; return Vec::new();
} }
let union = |nodes: &[(usize, &'static CommandNode, CommandCategory)]| -> Vec<&'static str> {
let mut keys: Vec<&'static str> = Vec::new();
for (_, node, _) in nodes {
for k in node.usage_ids {
if !keys.contains(k) {
keys.push(*k);
}
}
}
keys
};
// Advanced mode: every candidate form is reachable — the SQL
// nodes are primary, and the DSL nodes remain valid via fallback
// (verified: `create table … with pk` and `drop column …` both
// run in advanced mode). Show them all, mode-primary (Advanced)
// first, so the usage hint never hides input that works. Simple
// mode: only the DSL forms — the SQL-only forms hit the "this is
// SQL" rail and are not reachable. (ADR-0042 G3.)
let selected: Vec<(usize, &'static CommandNode, CommandCategory)> = let selected: Vec<(usize, &'static CommandNode, CommandCategory)> =
if mode == crate::mode::Mode::Advanced { if mode == crate::mode::Mode::Advanced {
let mut v: Vec<_> = candidates let mut v: Vec<_> = candidates
@@ -621,17 +701,7 @@ pub fn usage_keys_for_input_in_mode(
.filter(|(_, _, c)| *c == CommandCategory::Simple) .filter(|(_, _, c)| *c == CommandCategory::Simple)
.collect() .collect()
}; };
// Degenerate guard: an advanced-only word in simple mode (not if selected.is_empty() { candidates } else { selected }
// normally reachable — it hits the SQL rail first) leaves
// `selected` empty; fall back to all candidates so a usage block
// still renders rather than the available-commands fallback.
let pick = if selected.is_empty() { candidates } else { selected };
let keys = union(&pick);
if keys.is_empty() {
return None;
}
let entry = pick[0].1.entry.primary;
Some((entry, keys))
} }
/// The single usage template most relevant to `source`, when /// The single usage template most relevant to `source`, when
@@ -658,14 +728,24 @@ pub fn usage_key_for_input_in_mode(
source: &str, source: &str,
mode: crate::mode::Mode, mode: crate::mode::Mode,
) -> Option<&'static str> { ) -> Option<&'static str> {
use crate::dsl::walker::lex_helpers::{consume_ident, skip_whitespace};
let (_entry, keys) = usage_keys_for_input_in_mode(source, mode)?; let (_entry, keys) = usage_keys_for_input_in_mode(source, mode)?;
pick_form_key(source, &keys)
}
/// From the form word after the entry keyword, pick the single `keys`
/// entry for the form `source` names.
///
/// A single-entry list resolves to its one key; a multi-form list
/// disambiguates by the form word (`add 1:n relationship` → the
/// `…relationship` key, `create m:n …` → the `…m2n` key, else the
/// identifier form word matched against each key's suffix). Shared by
/// the usage-template and tier-3-hint single-key lookups so they agree.
fn pick_form_key<'a>(source: &str, keys: &[&'a str]) -> Option<&'a str> {
use crate::dsl::walker::lex_helpers::{consume_ident, skip_whitespace};
let first = *keys.first()?; let first = *keys.first()?;
if keys.len() == 1 { if keys.len() == 1 {
return Some(first); return Some(first);
} }
// Multi-form: the form is named by the token right after
// the entry keyword.
let start = skip_whitespace(source, 0); let start = skip_whitespace(source, 0);
let (_, entry_end) = consume_ident(source, start)?; let (_, entry_end) = consume_ident(source, start)?;
let after = skip_whitespace(source, entry_end); let after = skip_whitespace(source, entry_end);
@@ -674,14 +754,12 @@ pub fn usage_key_for_input_in_mode(
return keys.iter().copied().find(|k| k.ends_with("relationship")); return keys.iter().copied().find(|k| k.ends_with("relationship"));
} }
// The `create m:n relationship` form (ADR-0045) opens with `m:n` // The `create m:n relationship` form (ADR-0045) opens with `m:n`
// — a letter, so the digit branch misses it, and its usage key ends // — a letter, so the digit branch misses it; its key ends `…m2n`.
// `…create_m2n` (not `relationship`).
if source[after..].get(..3).is_some_and(|s| s.eq_ignore_ascii_case("m:n")) { if source[after..].get(..3).is_some_and(|s| s.eq_ignore_ascii_case("m:n")) {
return keys.iter().copied().find(|k| k.ends_with("m2n")); return keys.iter().copied().find(|k| k.ends_with("m2n"));
} }
// Otherwise the form word is an identifier — `column`, // Otherwise the form word is an identifier — `column`, `index`,
// `index`, `table`, `relationship` — matched against the // `table`, `relationship` — matched against each key's suffix.
// usage key's suffix.
let (s, e) = consume_ident(source, after)?; let (s, e) = consume_ident(source, after)?;
let form = source[s..e].to_ascii_lowercase(); let form = source[s..e].to_ascii_lowercase();
keys.iter().copied().find(|k| k.ends_with(form.as_str())) keys.iter().copied().find(|k| k.ends_with(form.as_str()))
@@ -712,6 +790,7 @@ pub fn entry_words_alphabetised() -> Vec<&'static str> {
pub static REGISTRY: &[(&CommandNode, CommandCategory)] = &[ pub static REGISTRY: &[(&CommandNode, CommandCategory)] = &[
(&app::QUIT, CommandCategory::Simple), (&app::QUIT, CommandCategory::Simple),
(&app::HELP, CommandCategory::Simple), (&app::HELP, CommandCategory::Simple),
(&app::HINT, CommandCategory::Simple),
(&app::REBUILD, CommandCategory::Simple), (&app::REBUILD, CommandCategory::Simple),
(&app::SAVE, CommandCategory::Simple), (&app::SAVE, CommandCategory::Simple),
(&app::NEW, CommandCategory::Simple), (&app::NEW, CommandCategory::Simple),
@@ -836,6 +915,174 @@ pub fn commands_for_entry_word(
.collect() .collect()
} }
#[cfg(test)]
mod hint_key_tests {
use super::hint_key_for_input_in_mode;
use crate::mode::Mode;
/// Per-form hint keying (ADR-0053 D3): a multi-form command
/// resolves the *typed* form, not the node — `add 1:n
/// relationship` → the relationship hint, `add column` → the
/// (as-yet-unauthored) column hint, never the wrong form.
#[test]
fn hint_key_resolves_the_typed_form() {
assert_eq!(
hint_key_for_input_in_mode("add 1:n relationship from A.x to B.y", Mode::Simple),
Some("add_relationship")
);
assert_eq!(
hint_key_for_input_in_mode("add column Note text to T", Mode::Simple),
Some("add_column")
);
assert_eq!(
hint_key_for_input_in_mode("insert into T values (1)", Mode::Simple),
Some("insert")
);
// Multi-form DROP disambiguates to the typed form too.
assert_eq!(
hint_key_for_input_in_mode("drop table T", Mode::Simple),
Some("drop_table")
);
// Mode picks the surface for a shared entry word whose second
// token isn't a form word: SQL form in advanced, DSL in simple.
assert_eq!(
hint_key_for_input_in_mode("insert into T values (1)", Mode::Advanced),
Some("sql_insert")
);
assert_eq!(
hint_key_for_input_in_mode("insert into T values (1)", Mode::Simple),
Some("insert")
);
// `create table` shares a form word — advanced-first ordering
// resolves it to the SQL form in advanced mode.
assert_eq!(
hint_key_for_input_in_mode("create table T (id int)", Mode::Advanced),
Some("sql_create_table")
);
// Unknown entry word → None (tier-2 fallback).
assert_eq!(hint_key_for_input_in_mode("zzz", Mode::Simple), None);
}
/// Comprehensiveness gate (ADR-0053 D6): every command form in the
/// REGISTRY carries at least one `hint_id`, and each resolves to a
/// tier-3 `hint.cmd.<id>` block. `keys.rs` checks referenced keys
/// resolve; this checks every command *has* one.
#[test]
fn every_command_form_has_a_tier3_block() {
let cat = crate::friendly::catalog();
for (node, _category) in super::REGISTRY {
assert!(
!node.hint_ids.is_empty(),
"command `{}` has no hint_ids (ADR-0053 D6)",
node.entry.primary
);
for id in node.hint_ids {
let key = format!("hint.cmd.{id}.what");
assert!(
cat.get(&key).is_some(),
"missing tier-3 block `{key}` for command `{}`",
node.entry.primary
);
}
}
}
/// Comprehensiveness gate (ADR-0053 D6): every runtime error class
/// `friendly::error_hint_class` can return resolves to a tier-3
/// `hint.err.<class>` block. Keep this list in sync with
/// `error_hint_class` (its own unit tests pin the outputs).
/// Diagnostic classes are deferred (issue #38), so not checked here.
#[test]
fn every_runtime_error_class_has_a_tier3_block() {
let cat = crate::friendly::catalog();
let classes = [
"unique",
"foreign_key.child_side",
"foreign_key.parent_side",
"not_null",
"check",
"type_mismatch",
"not_found",
"already_exists",
"generic",
"invalid_value",
];
for c in classes {
let key = format!("hint.err.{c}.what");
assert!(cat.get(&key).is_some(), "missing tier-3 error block `{key}`");
}
}
/// Semantic-verification guard (handoff-71): every `hint.cmd.<form>`
/// **example** must parse in the mode the form is taught for. This
/// backstops the bug class found in the H2 corpus pass — an example
/// that drifts out of the real grammar (a typo, a removed clause, or
/// an argument the command never accepted, e.g. an inline name on
/// `save as` which opens a modal instead). It cannot police the
/// *semantics* of an example that happens to parse (that is the
/// manual pass), but it locks the syntactic floor so future edits
/// can't ship an unparseable teaching line.
///
/// The mode per form mirrors `hint_key_for_input_in_mode`: the
/// advanced-SQL forms are taught in advanced mode; everything else
/// (DSL + app commands) in simple mode.
#[test]
fn every_cmd_hint_example_parses_in_its_mode() {
use crate::dsl::parser::parse_command_in_mode;
use crate::mode::Mode;
// Advanced-mode forms — the SQL surface (ADR-00300039). Every
// other form (DSL + app commands) is taught in simple mode. This
// mirrors the mode split `hint_key_for_input_in_mode` resolves.
const ADVANCED: &[&str] = &[
"sql_create_table",
"sql_alter_table",
"sql_create_index",
"sql_drop_index",
"sql_drop_table",
"sql_insert",
"sql_update",
"sql_delete",
"select",
"with",
"explain_sql",
];
// Iterate the *catalog* (the corpus is the source of truth), not the
// REGISTRY: this reaches every `hint.cmd.<id>` block including any
// not owned by a command node, so an orphaned or mis-keyed example
// can't slip past the guard.
let cat = crate::friendly::catalog();
let mut checked = 0usize;
for key in cat.keys() {
let Some(id) = key
.strip_prefix("hint.cmd.")
.and_then(|rest| rest.strip_suffix(".example"))
else {
continue;
};
let example = cat.get(key).expect("key came from the catalog");
let mode = if ADVANCED.contains(&id) {
Mode::Advanced
} else {
Mode::Simple
};
assert!(
parse_command_in_mode(example, mode).is_ok(),
"hint.cmd.{id}.example does not parse in {mode:?} mode: {example:?}",
);
checked += 1;
}
// Floor guard: the corpus had 49 command forms at the time of
// writing (ADR-0053). If this drops, a block (and its example
// coverage) silently vanished.
assert!(
checked >= 49,
"expected at least 49 hint.cmd.* examples, checked {checked}",
);
}
}
#[cfg(test)] #[cfg(test)]
mod usage_key_tests { mod usage_key_tests {
use super::usage_key_for_input; use super::usage_key_for_input;
+2
View File
@@ -6910,6 +6910,7 @@ mod dispatch_3a_tests {
shape: Node::Word(Word::keyword("dsltail")), shape: Node::Word(Word::keyword("dsltail")),
ast_builder: dsl_builder, ast_builder: dsl_builder,
help_id: None, help_id: None,
hint_ids: &[],
usage_ids: &[], usage_ids: &[],
}; };
static SMOKE_SQL: CommandNode = CommandNode { static SMOKE_SQL: CommandNode = CommandNode {
@@ -6917,6 +6918,7 @@ mod dispatch_3a_tests {
shape: Node::Word(Word::keyword("sqltail")), shape: Node::Word(Word::keyword("sqltail")),
ast_builder: sql_builder, ast_builder: sql_builder,
help_id: None, help_id: None,
hint_ids: &[],
usage_ids: &[], usage_ids: &[],
}; };
+181
View File
@@ -180,6 +180,7 @@ pub const KEYS_AND_PLACEHOLDERS: &[(&str, &[&str])] = &[
("help.unknown_topic", &["topic"]), ("help.unknown_topic", &["topic"]),
("help.app.quit", &[]), ("help.app.quit", &[]),
("help.app.help", &[]), ("help.app.help", &[]),
("help.app.hint", &[]),
("help.app.rebuild", &[]), ("help.app.rebuild", &[]),
("help.app.save", &[]), ("help.app.save", &[]),
("help.app.new", &[]), ("help.app.new", &[]),
@@ -222,6 +223,184 @@ pub const KEYS_AND_PLACEHOLDERS: &[(&str, &[&str])] = &[
&["message", "usage"], &["message", "usage"],
), ),
("hint.ambient_expected", &["expected"]), ("hint.ambient_expected", &["expected"]),
("hint.getting_started", &[]),
("hint.block.heading", &[]),
("hint.block.what", &[]),
("hint.block.example", &[]),
("hint.block.concept", &[]),
// Tier-3 teaching blocks (ADR-0053 D3) — Phase-B exemplars.
("hint.cmd.insert.what", &[]),
("hint.cmd.insert.example", &[]),
("hint.cmd.insert.concept", &[]),
("hint.cmd.add_relationship.what", &[]),
("hint.cmd.add_relationship.example", &[]),
("hint.cmd.add_relationship.concept", &[]),
("hint.err.foreign_key.child_side.what", &[]),
("hint.err.foreign_key.child_side.example", &[]),
("hint.err.foreign_key.child_side.concept", &[]),
// Phase C batch 5 — runtime error-class hints.
("hint.err.foreign_key.parent_side.what", &[]),
("hint.err.foreign_key.parent_side.example", &[]),
("hint.err.foreign_key.parent_side.concept", &[]),
("hint.err.unique.what", &[]),
("hint.err.unique.example", &[]),
("hint.err.unique.concept", &[]),
("hint.err.not_null.what", &[]),
("hint.err.not_null.example", &[]),
("hint.err.not_null.concept", &[]),
("hint.err.check.what", &[]),
("hint.err.check.example", &[]),
("hint.err.check.concept", &[]),
("hint.err.type_mismatch.what", &[]),
("hint.err.type_mismatch.example", &[]),
("hint.err.type_mismatch.concept", &[]),
("hint.err.not_found.what", &[]),
("hint.err.not_found.example", &[]),
("hint.err.not_found.concept", &[]),
("hint.err.already_exists.what", &[]),
("hint.err.already_exists.example", &[]),
("hint.err.already_exists.concept", &[]),
("hint.err.generic.what", &[]),
("hint.err.generic.example", &[]),
("hint.err.invalid_value.what", &[]),
("hint.err.invalid_value.example", &[]),
// Phase C batch 1 — app-lifecycle command hints.
("hint.cmd.quit.what", &[]),
("hint.cmd.quit.example", &[]),
("hint.cmd.help.what", &[]),
("hint.cmd.help.example", &[]),
("hint.cmd.help.concept", &[]),
("hint.cmd.hint.what", &[]),
("hint.cmd.hint.example", &[]),
("hint.cmd.rebuild.what", &[]),
("hint.cmd.rebuild.example", &[]),
("hint.cmd.rebuild.concept", &[]),
("hint.cmd.save.what", &[]),
("hint.cmd.save.example", &[]),
("hint.cmd.save.concept", &[]),
("hint.cmd.new.what", &[]),
("hint.cmd.new.example", &[]),
("hint.cmd.load.what", &[]),
("hint.cmd.load.example", &[]),
("hint.cmd.export.what", &[]),
("hint.cmd.export.example", &[]),
("hint.cmd.export.concept", &[]),
("hint.cmd.import.what", &[]),
("hint.cmd.import.example", &[]),
("hint.cmd.mode.what", &[]),
("hint.cmd.mode.example", &[]),
("hint.cmd.mode.concept", &[]),
("hint.cmd.messages.what", &[]),
("hint.cmd.messages.example", &[]),
("hint.cmd.messages.concept", &[]),
("hint.cmd.undo.what", &[]),
("hint.cmd.undo.example", &[]),
("hint.cmd.undo.concept", &[]),
("hint.cmd.redo.what", &[]),
("hint.cmd.redo.example", &[]),
("hint.cmd.copy.what", &[]),
("hint.cmd.copy.example", &[]),
// Phase C batch 2 — DDL command hints.
("hint.cmd.create_table.what", &[]),
("hint.cmd.create_table.example", &[]),
("hint.cmd.create_table.concept", &[]),
("hint.cmd.create_m2n.what", &[]),
("hint.cmd.create_m2n.example", &[]),
("hint.cmd.create_m2n.concept", &[]),
("hint.cmd.add_column.what", &[]),
("hint.cmd.add_column.example", &[]),
("hint.cmd.add_column.concept", &[]),
("hint.cmd.add_index.what", &[]),
("hint.cmd.add_index.example", &[]),
("hint.cmd.add_index.concept", &[]),
("hint.cmd.add_constraint.what", &[]),
("hint.cmd.add_constraint.example", &[]),
("hint.cmd.add_constraint.concept", &[]),
("hint.cmd.drop_table.what", &[]),
("hint.cmd.drop_table.example", &[]),
("hint.cmd.drop_table.concept", &[]),
("hint.cmd.drop_column.what", &[]),
("hint.cmd.drop_column.example", &[]),
("hint.cmd.drop_column.concept", &[]),
("hint.cmd.drop_relationship.what", &[]),
("hint.cmd.drop_relationship.example", &[]),
("hint.cmd.drop_relationship.concept", &[]),
("hint.cmd.drop_index.what", &[]),
("hint.cmd.drop_index.example", &[]),
("hint.cmd.drop_index.concept", &[]),
("hint.cmd.drop_constraint.what", &[]),
("hint.cmd.drop_constraint.example", &[]),
("hint.cmd.drop_constraint.concept", &[]),
("hint.cmd.rename_column.what", &[]),
("hint.cmd.rename_column.example", &[]),
("hint.cmd.rename_column.concept", &[]),
("hint.cmd.change_column.what", &[]),
("hint.cmd.change_column.example", &[]),
("hint.cmd.change_column.concept", &[]),
// Phase C batch 3 — DML command hints.
("hint.cmd.update.what", &[]),
("hint.cmd.update.example", &[]),
("hint.cmd.update.concept", &[]),
("hint.cmd.delete.what", &[]),
("hint.cmd.delete.example", &[]),
("hint.cmd.delete.concept", &[]),
("hint.cmd.show_data.what", &[]),
("hint.cmd.show_data.example", &[]),
("hint.cmd.show_data.concept", &[]),
("hint.cmd.show_table.what", &[]),
("hint.cmd.show_table.example", &[]),
("hint.cmd.show_table.concept", &[]),
("hint.cmd.show_tables.what", &[]),
("hint.cmd.show_tables.example", &[]),
("hint.cmd.show_relationships.what", &[]),
("hint.cmd.show_relationships.example", &[]),
("hint.cmd.show_relationships.concept", &[]),
("hint.cmd.show_indexes.what", &[]),
("hint.cmd.show_indexes.example", &[]),
("hint.cmd.show_indexes.concept", &[]),
("hint.cmd.seed.what", &[]),
("hint.cmd.seed.example", &[]),
("hint.cmd.seed.concept", &[]),
("hint.cmd.explain.what", &[]),
("hint.cmd.explain.example", &[]),
("hint.cmd.explain.concept", &[]),
("hint.cmd.replay.what", &[]),
("hint.cmd.replay.example", &[]),
("hint.cmd.replay.concept", &[]),
// Phase C batch 4 — advanced-mode SQL command hints.
("hint.cmd.sql_create_table.what", &[]),
("hint.cmd.sql_create_table.example", &[]),
("hint.cmd.sql_create_table.concept", &[]),
("hint.cmd.sql_alter_table.what", &[]),
("hint.cmd.sql_alter_table.example", &[]),
("hint.cmd.sql_alter_table.concept", &[]),
("hint.cmd.sql_create_index.what", &[]),
("hint.cmd.sql_create_index.example", &[]),
("hint.cmd.sql_create_index.concept", &[]),
("hint.cmd.sql_drop_index.what", &[]),
("hint.cmd.sql_drop_index.example", &[]),
("hint.cmd.sql_drop_index.concept", &[]),
("hint.cmd.sql_drop_table.what", &[]),
("hint.cmd.sql_drop_table.example", &[]),
("hint.cmd.sql_drop_table.concept", &[]),
("hint.cmd.sql_insert.what", &[]),
("hint.cmd.sql_insert.example", &[]),
("hint.cmd.sql_insert.concept", &[]),
("hint.cmd.sql_update.what", &[]),
("hint.cmd.sql_update.example", &[]),
("hint.cmd.sql_update.concept", &[]),
("hint.cmd.sql_delete.what", &[]),
("hint.cmd.sql_delete.example", &[]),
("hint.cmd.sql_delete.concept", &[]),
("hint.cmd.select.what", &[]),
("hint.cmd.select.example", &[]),
("hint.cmd.select.concept", &[]),
("hint.cmd.with.what", &[]),
("hint.cmd.with.example", &[]),
("hint.cmd.with.concept", &[]),
("hint.cmd.explain_sql.what", &[]),
("hint.cmd.explain_sql.example", &[]),
("hint.cmd.explain_sql.concept", &[]),
( (
"hint.ambient_invalid_ident", "hint.ambient_invalid_ident",
&["kind", "found"], &["kind", "found"],
@@ -299,6 +478,7 @@ pub const KEYS_AND_PLACEHOLDERS: &[(&str, &[&str])] = &[
("parse.usage.rename_column", &[]), ("parse.usage.rename_column", &[]),
("parse.usage.export", &[]), ("parse.usage.export", &[]),
("parse.usage.help", &[]), ("parse.usage.help", &[]),
("parse.usage.hint", &[]),
("parse.usage.import", &[]), ("parse.usage.import", &[]),
("parse.usage.copy", &[]), ("parse.usage.copy", &[]),
("parse.usage.load", &[]), ("parse.usage.load", &[]),
@@ -472,6 +652,7 @@ pub const KEYS_AND_PLACEHOLDERS: &[(&str, &[&str])] = &[
("shortcut.confirm", &[]), ("shortcut.confirm", &[]),
("shortcut.cycle", &[]), ("shortcut.cycle", &[]),
("shortcut.del_word", &[]), ("shortcut.del_word", &[]),
("shortcut.hint", &[]),
("shortcut.history", &[]), ("shortcut.history", &[]),
("shortcut.home_end", &[]), ("shortcut.home_end", &[]),
("shortcut.load", &[]), ("shortcut.load", &[]),
+1 -1
View File
@@ -35,7 +35,7 @@ pub mod translate;
pub use error::{DiagnosticTable, FriendlyError}; pub use error::{DiagnosticTable, FriendlyError};
pub use format::{catalog, Catalog}; pub use format::{catalog, Catalog};
pub use translate::{FailureContext, Operation, TranslateContext, Verbosity}; pub use translate::{error_hint_class, FailureContext, Operation, TranslateContext, Verbosity};
// `translate::translate` and `format::translate` are different // `translate::translate` and `format::translate` are different
// callables — the former is the structured DbError → FriendlyError // callables — the former is the structured DbError → FriendlyError
+258
View File
@@ -256,6 +256,8 @@ help:
help: |- help: |-
help — show this command list help — show this command list
help <command> — detailed help for one command (e.g. `help insert`) help <command> — detailed help for one command (e.g. `help insert`)
hint: |-
hint — explain the most recent error (press F1 for a hint on what you're typing)
rebuild: |- rebuild: |-
rebuild — rebuild the project database from project.yaml + data/ (with confirmation) rebuild — rebuild the project database from project.yaml + data/ (with confirmation)
save: |- save: |-
@@ -386,6 +388,260 @@ hint:
ambient_complete: "Submit with Enter" ambient_complete: "Submit with Enter"
ambient_expected: "Next: {expected}" ambient_expected: "Next: {expected}"
ambient_error_with_usage: "{message} — usage: {usage}" ambient_error_with_usage: "{message} — usage: {usage}"
# H2 / ADR-0053: shown by `hint` / F1 when there is nothing specific
# to expand on (no recent error, empty input).
getting_started: "Start typing a command and press F1 for a hint, or type `help` for the full command list."
# Tier-3 block scaffolding (ADR-0053 D4): the heading + the labels the
# `what` / `example` / `concept` parts render under.
block:
heading: "Hint"
what: "What"
example: "Example"
concept: "Concept"
# ── Tier-3 teaching blocks (ADR-0053 D3) ──────────────────────────
# Per-form command hints (`hint.cmd.<form>`) and per-class error
# hints (`hint.err.<class>`), each a `what` (12 sentences) / `example`
# (one runnable, mode-correct line) / `concept` (the relational idea —
# the teaching part). Phase B seeds the three approved exemplars; the
# rest are authored in Phase C.
cmd:
insert:
what: "Add one or more rows to a table."
example: "insert into Customers values ('Ann', 'ann@example.io')"
concept: "A row is one record; each value lines up with a column, in order. Columns typed `serial`/`shortid` fill themselves — leave them out."
add_relationship:
what: "Link two tables so a parent row can own many child rows."
example: "add 1:n relationship from Customers.id to Orders.customer_id"
concept: "The \"1:n\" means one parent, many children. The child column holds the foreign key; add `--create-fk` to create that column if it doesn't exist yet."
# App-lifecycle commands (Phase C batch 1). Reference-leaning, so
# `concept` appears only where there's a real idea to teach.
quit:
what: "Leave the playground. Your project is already saved to disk."
example: "quit"
help:
what: "List every command, or show the detail for one."
example: "help insert"
concept: "`help` is the reference; press F1 while typing for a hint about the command you're building right now."
hint:
what: "Explain the most recent error — or, pressing F1 while typing, the command you're building."
example: "hint"
rebuild:
what: "Rebuild the project database from its saved text files."
example: "rebuild"
concept: "The text files (project.yaml + the data folder) are the source of truth; the database is derived and can always be rebuilt from them."
save:
what: "Save the current project; `save as` copies it to a new name or location."
example: "save as"
concept: "On a temporary project, `save` opens a prompt to give it a permanent name; a named project auto-saves as you work, so `save` on one is already done. `save as` always prompts for a new name or path — use it to copy a project."
new:
what: "Close the current project and start a fresh temporary one."
example: "new"
load:
what: "Open the project picker to switch to a saved project."
example: "load"
export:
what: "Write a shareable zip of the project — its text files only, never the database."
example: "export my-shop.zip"
concept: "The zip carries the schema and data as text, so anyone can rebuild the very same database from it."
import:
what: "Unpack a project zip into a new project and switch to it."
example: "import my-shop.zip as shop_copy"
mode:
what: "Switch between simple mode (the guided teaching commands) and advanced mode (raw SQL)."
example: "mode advanced"
concept: "Simple mode uses keyword commands; advanced mode lets you write SQL directly. A leading `:` runs a single advanced command without switching modes."
messages:
what: "Show or set how much detail error messages give."
example: "messages short"
concept: "Verbose (the default) adds a fix-it hint under each error headline; short shows just the headline."
undo:
what: "Undo the most recent change, after a confirmation."
example: "undo"
concept: "Every data or schema change is snapshotted first, so you can step back; `redo` re-applies what you undid."
redo:
what: "Re-apply the most recently undone change."
example: "redo"
copy:
what: "Copy the output panel to the clipboard — all of it, or just the last command's output."
example: "copy last"
# DDL — schema-shaping commands (Phase C batch 2).
create_table:
what: "Create a new table and declare its primary key."
example: "create table Customers with pk id(serial)"
concept: "A table is a set of rows sharing the same columns. `with pk` declares the primary key — one column, or several for a compound key; add the other columns afterwards with `add column`. A `serial` key numbers the rows for you."
create_m2n:
what: "Create a junction table linking two tables many-to-many."
example: "create m:n relationship from Students to Courses"
concept: "A many-to-many link (a student takes many courses; a course has many students) can't live in either table, so it gets its own junction table holding a foreign key to each side."
add_column:
what: "Add a new column to an existing table."
example: "add column Customers: phone (text)"
concept: "Existing rows take the column's default, or null. A `not null` column with no default can't be added to a table that already has rows — there'd be nothing to put in them."
add_index:
what: "Create an index on one or more columns to speed up lookups."
example: "add index as idx_email on Customers (email)"
concept: "An index is a sorted side-structure that makes a lookup like `where email = …` fast, at the cost of a little space and slightly slower writes."
add_constraint:
what: "Add a constraint — not null, unique, default, or check — to an existing column."
example: "add constraint not null to Customers.email"
concept: "A constraint is a rule the database enforces on every row. Adding one fails if existing rows already break it, so you fix the data first."
drop_table:
what: "Remove a table and all of its rows."
example: "drop table Customers"
concept: "If other tables reference this one through a relationship, drop those relationships (or their child rows) first — the database won't orphan them."
drop_column:
what: "Remove a column from a table."
example: "drop column Customers: phone"
concept: "The column's values are lost. You can't drop a primary-key column, or one a relationship depends on."
drop_relationship:
what: "Remove a relationship between two tables."
example: "drop relationship customer_orders"
concept: "This drops the foreign-key link and stops the database enforcing it; the tables and their rows stay. The foreign-key column itself remains unless you also drop it."
drop_index:
what: "Remove an index by name."
example: "drop index idx_email"
concept: "Only the lookup shortcut goes — the data is untouched. Queries still work, just without that speed-up."
drop_constraint:
what: "Remove a constraint from a column."
example: "drop constraint not null from Customers.email"
concept: "The rule stops being enforced from now on; rows already stored are left as they are."
rename_column:
what: "Rename a column, keeping its values and type."
example: "rename column Customers: email to contact_email"
concept: "Only the name changes — the stored data is the same. References to the column are reconciled so nothing breaks."
change_column:
what: "Change a column's type, converting the existing values."
example: "change column Customers: status (int)"
concept: "The database converts each stored value to the new type; if a value can't convert it refuses the change, so you don't silently lose data. Flags let you force or skip the conversion."
# DML — querying and changing data (Phase C batch 3).
update:
what: "Change values in the rows that match a condition."
example: "update Customers set email = 'new@example.io' where id = 1"
concept: "The `where` clause picks which rows change, and it's required — pass `--all-rows` to change the whole table on purpose — so you never update more than you meant to."
delete:
what: "Remove the rows that match a condition."
example: "delete from Orders where status = 'cancelled'"
concept: "A `where` is required (use `--all-rows` to clear the table on purpose). Rows a relationship points at may be blocked or cascade-deleted, per its `on delete` action."
show_data:
what: "Show the rows stored in a table."
example: "show data Customers"
concept: "This reads the data and never changes it. Add a `where` to show only matching rows."
show_table:
what: "Show a table's structure — its columns, types, keys, and relationships."
example: "show table Customers"
concept: "Structure, not data: the column definitions and how this table links to others. Use `show data` to see the rows themselves."
show_tables:
what: "List all the tables in the project."
example: "show tables"
show_relationships:
what: "List all the relationships between tables."
example: "show relationships"
concept: "Each relationship is a foreign-key link from a child column to a parent's key, with an `on delete` / `on update` rule."
show_indexes:
what: "List all the indexes in the project."
example: "show indexes"
concept: "Indexes speed up lookups; this shows which columns each one covers and whether it enforces uniqueness."
seed:
what: "Fill a table with generated sample rows, or fill one column on existing rows."
example: "seed Customers 50"
concept: "Seeding invents realistic-looking data so you have something to query. Pin a value with `set col = …`, choose a generator with `as`, or give a numeric range with `between`."
explain:
what: "Show how the database will run a query — without running it."
example: "explain show data Customers where email = 'a@example.io'"
concept: "The plan reveals whether the database scans the whole table or jumps straight to rows through an index — the payoff of `add index`. `explain` never executes, so it's safe even on a delete."
replay:
what: "Re-run the commands recorded in a history file."
example: "replay session.log"
concept: "Every successful command is journalled, so replaying re-applies them in order to reproduce a project's state — handy for scripting or redoing a sequence."
# Advanced-mode SQL forms (Phase C batch 4). Examples are SQL, the
# advanced surface — distinct from their simple-mode siblings.
sql_create_table:
what: "Create a table using SQL syntax (advanced mode)."
example: "create table Customers (id int primary key, name text, email text)"
concept: "Advanced mode speaks SQL: constraints go inline (`primary key`, `not null`, `unique`, `check`). This is the raw form of simple mode's `create table … with pk …`."
sql_alter_table:
what: "Change a table's structure with SQL `alter table` (advanced mode)."
example: "alter table Customers add column phone text"
concept: "`alter table` adds or drops columns, renames, and adds constraints — the SQL equivalent of simple mode's `add column` / `drop column` / `change column`."
sql_create_index:
what: "Create an index with SQL (advanced mode)."
example: "create index ix_email on Customers (email)"
concept: "Add `unique` to also forbid duplicate values. The simple-mode equivalent is `add index`."
sql_drop_index:
what: "Remove an index with SQL (advanced mode)."
example: "drop index ix_email"
concept: "Only the lookup shortcut goes; the data is untouched. Add `if exists` to ignore a missing index."
sql_drop_table:
what: "Remove a table with SQL (advanced mode)."
example: "drop table Customers"
concept: "Add `if exists` to avoid an error when the table might not be there. Relationships pointing at it may block the drop."
sql_insert:
what: "Insert rows with SQL (advanced mode)."
example: "insert into Customers (name, email) values ('Ann', 'ann@example.io')"
concept: "Naming the columns lets you supply them in any order and skip ones that have a default — the SQL form of simple mode's `insert`."
sql_update:
what: "Update rows with SQL (advanced mode)."
example: "update Customers set email = 'new@example.io' where id = 1"
concept: "`set` lists the new values; `where` picks which rows change. The SQL form of simple mode's `update`."
sql_delete:
what: "Delete rows with SQL (advanced mode)."
example: "delete from Orders where status = 'cancelled'"
concept: "`where` picks the rows to remove; foreign-key rules still apply. The SQL form of simple mode's `delete`."
select:
what: "Query rows with SQL `select` (advanced mode)."
example: "select name, email from Customers where id = 1"
concept: "`select` is read-only: choose columns (or `*`), filter with `where`, sort with `order by`, cap with `limit`. This is the heart of SQL — and the reason advanced mode exists."
with:
what: "Name a sub-query (a CTE) and read from it in a `select` (advanced mode)."
example: "with recent as (select * from Orders where id > 100) select * from recent"
concept: "A `with` clause (Common Table Expression) names a query so the main `select` can use it like a temporary table — handy for breaking a complex query into readable steps."
explain_sql:
what: "Show how the database will run a SQL query, without running it (advanced mode)."
example: "explain select * from Customers where email = 'a@example.io'"
concept: "Like simple mode's `explain`, but wraps a raw SQL statement. It reveals whether an index is used, and never executes."
err:
# Runtime error classes (Phase C batch 5), keyed by
# friendly::error_hint_class. `example` is a fix recipe rather than a
# runnable line; `concept` is the relational idea behind the rule.
foreign_key:
child_side:
what: "The value you gave for the child column doesn't match any parent row, so the foreign key has nothing to point at."
example: "First insert the parent (insert into Customers …), then the child that references it."
concept: "A foreign key is a promise that every child points at a real parent, so the parent must exist before a child can reference it. (`on delete` actions like `cascade` or `set null` govern the other direction — what happens to children when their parent is removed — not this one.)"
parent_side:
what: "You're deleting or changing a row that other rows point at, which would orphan those children."
example: "Delete the child rows first, or set the relationship's `on delete` to `cascade` (remove them too) or `set null` (keep them, unlinked)."
concept: "A foreign key guarantees every child has a real parent, so the database won't remove a parent out from under its children unless the relationship says what should happen to them."
unique:
what: "A value you're inserting — or updating to — already exists in a column that must be unique."
example: "Pick a different value, or update the existing row instead of inserting a new one."
concept: "A unique constraint (and every primary key) forbids duplicates, so each value identifies at most one row."
not_null:
what: "You left a column empty that is required to have a value."
example: "Supply a value for the column, or give it a default so new rows fill it automatically."
concept: "A `not null` constraint means every row must have a value there — it's how you mark a fact as mandatory."
check:
what: "A value broke a `check` rule defined on the column."
example: "Use a value the rule allows — for example a positive number, or one of the permitted options."
concept: "A `check` constraint is a condition every row must satisfy, so the database enforces business rules like \"price ≥ 0\" for you."
type_mismatch:
what: "A value doesn't fit the column's type — for instance text where a number is expected."
example: "Give a value of the right type: a number for `int`/`real`, a quoted string for `text`, true/false for `bool`."
concept: "Every column has a type, and the database rejects values that don't fit, so a column's data stays consistent and comparable."
not_found:
what: "You named a table or column that doesn't exist."
example: "Check the spelling, or run `show tables` (or `show table <name>`) to see what's there."
concept: "A command can only refer to tables and columns that already exist — create them first if you need them."
already_exists:
what: "You tried to create a table, column, relationship, or index whose name is already taken."
example: "Pick a different name, or drop the existing one first if you meant to replace it."
concept: "Names must be unique within their kind so a command is never ambiguous about what it refers to."
generic:
what: "The database refused the command for the reason shown above."
example: "Read that message for the specifics, adjust the command, and try again."
invalid_value:
what: "A value or option in the command wasn't valid for where it was used."
example: "Check the value against the column's type and the command's accepted options."
# Invalid identifier in a schema slot (ADR-0022 stage 8e # Invalid identifier in a schema slot (ADR-0022 stage 8e
# + the user's #5). Voice mirrors ADR-0019's "no such # + the user's #5). Voice mirrors ADR-0019's "no such
# {kind}" wording for consistency with engine errors. # {kind}" wording for consistency with engine errors.
@@ -617,6 +873,7 @@ parse:
# description. # description.
quit: "quit" quit: "quit"
help: "help [<command>]" help: "help [<command>]"
hint: "hint"
rebuild: "rebuild" rebuild: "rebuild"
save: "save | save as" save: "save | save as"
new: "new" new: "new"
@@ -916,6 +1173,7 @@ shortcut:
browse: "browse" browse: "browse"
clear: "clear" clear: "clear"
complete: "complete" complete: "complete"
hint: "hint"
history: "history" history: "history"
home_end: "home/end" home_end: "home/end"
del_word: "del word" del_word: "del word"
+153
View File
@@ -253,6 +253,73 @@ pub fn translate(error: &DbError, ctx: &TranslateContext) -> FriendlyError {
fe fe
} }
/// The tier-3 hint class (`hint.err.<class>`) for an error.
///
/// The same classification [`translate`] performs, surfaced as a
/// stable key for the contextual `hint` (H2 / ADR-0053 D5). Returns
/// `None` for internal / fatal errors that carry no learner-facing
/// hint (persistence, IO, worker-gone).
///
/// **Keep in sync with [`translate`] / `translate_sqlite` /
/// `translate_constraint` / `translate_foreign_key`** — the unit tests
/// below pin each class.
#[must_use]
pub fn error_hint_class(error: &DbError, ctx: &TranslateContext) -> Option<&'static str> {
match error {
DbError::Sqlite { message, kind } => sqlite_hint_class(message, *kind, ctx),
DbError::Unsupported(_) | DbError::InvalidValue(_) => Some("invalid_value"),
DbError::PersistenceFatal { .. }
| DbError::RebuildRowFailed { .. }
| DbError::Io(_)
| DbError::WorkerGone => None,
}
}
fn sqlite_hint_class(
message: &str,
kind: SqliteErrorKind,
ctx: &TranslateContext,
) -> Option<&'static str> {
if matches!(ctx.operation, Some(Operation::ChangeColumnType)) {
return Some("type_mismatch");
}
Some(match kind {
SqliteErrorKind::NoSuchTable | SqliteErrorKind::NoSuchColumn => "not_found",
SqliteErrorKind::AlreadyExists => "already_exists",
SqliteErrorKind::UniqueViolation => constraint_hint_class(message, ctx),
SqliteErrorKind::Other => "generic",
})
}
fn constraint_hint_class(message: &str, ctx: &TranslateContext) -> &'static str {
let lower = message.to_ascii_lowercase();
if lower.contains("unique constraint failed") {
"unique"
} else if lower.contains("foreign key constraint failed") {
fk_hint_class(ctx)
} else if lower.contains("not null constraint failed") {
"not_null"
} else if lower.contains("check constraint failed") {
"check"
} else {
"generic"
}
}
const fn fk_hint_class(ctx: &TranslateContext) -> &'static str {
// Mirrors `translate_foreign_key`'s side disambiguation.
if ctx.parent_table.is_some() {
return "foreign_key.child_side";
}
if ctx.child_table.is_some() {
return "foreign_key.parent_side";
}
match ctx.operation {
Some(Operation::Delete) => "foreign_key.parent_side",
_ => "foreign_key.child_side",
}
}
fn translate_sqlite( fn translate_sqlite(
message: &str, message: &str,
kind: SqliteErrorKind, kind: SqliteErrorKind,
@@ -798,6 +865,92 @@ mod tests {
} }
} }
// ── H2 / ADR-0053: error → tier-3 hint class ────────────────
#[test]
fn hint_class_maps_runtime_error_kinds() {
use crate::db::{DbError, SqliteErrorKind};
let sqlite = |kind, msg: &str| DbError::Sqlite {
message: msg.to_string(),
kind,
};
let d = TranslateContext::default;
assert_eq!(
error_hint_class(&sqlite(SqliteErrorKind::NoSuchTable, "no such table: X"), &d()),
Some("not_found")
);
assert_eq!(
error_hint_class(&sqlite(SqliteErrorKind::NoSuchColumn, "no such column: X"), &d()),
Some("not_found")
);
assert_eq!(
error_hint_class(&sqlite(SqliteErrorKind::AlreadyExists, "already exists"), &d()),
Some("already_exists")
);
assert_eq!(
error_hint_class(&sqlite(SqliteErrorKind::Other, "boom"), &d()),
Some("generic")
);
// Constraint-violation message splitting.
let cv = |msg: &str| sqlite(SqliteErrorKind::UniqueViolation, msg);
assert_eq!(
error_hint_class(&cv("UNIQUE constraint failed: T.c"), &d()),
Some("unique")
);
assert_eq!(
error_hint_class(&cv("NOT NULL constraint failed: T.c"), &d()),
Some("not_null")
);
assert_eq!(
error_hint_class(&cv("CHECK constraint failed: T"), &d()),
Some("check")
);
// change-column op routes any engine error to type_mismatch.
assert_eq!(
error_hint_class(
&sqlite(SqliteErrorKind::Other, "x"),
&ctx_with(Operation::ChangeColumnType)
),
Some("type_mismatch")
);
// App-level refusals and internal/fatal errors.
assert_eq!(
error_hint_class(&DbError::InvalidValue("bad".to_string()), &d()),
Some("invalid_value")
);
assert_eq!(error_hint_class(&DbError::WorkerGone, &d()), None);
}
#[test]
fn hint_class_resolves_foreign_key_sides() {
use crate::db::{DbError, SqliteErrorKind};
let fk = || DbError::Sqlite {
message: "FOREIGN KEY constraint failed".to_string(),
kind: SqliteErrorKind::UniqueViolation,
};
// Enrichment: parent_table populated → child-side.
let ctx = TranslateContext {
parent_table: Some("Parent".to_string()),
..TranslateContext::default()
};
assert_eq!(error_hint_class(&fk(), &ctx), Some("foreign_key.child_side"));
// child_table populated → parent-side.
let ctx = TranslateContext {
child_table: Some("Child".to_string()),
..TranslateContext::default()
};
assert_eq!(error_hint_class(&fk(), &ctx), Some("foreign_key.parent_side"));
// No enrichment: operation is the tiebreaker.
assert_eq!(
error_hint_class(&fk(), &ctx_with(Operation::Delete)),
Some("foreign_key.parent_side")
);
assert_eq!(
error_hint_class(&fk(), &ctx_with(Operation::Insert)),
Some("foreign_key.child_side")
);
}
fn sqlite(message: &str, kind: SqliteErrorKind) -> DbError { fn sqlite(message: &str, kind: SqliteErrorKind) -> DbError {
DbError::Sqlite { DbError::Sqlite {
message: message.to_string(), message: message.to_string(),
+13 -13
View File
@@ -1190,7 +1190,7 @@ async fn build_schema_cache(database: &Database) -> crate::completion::SchemaCac
// miss leaves that table's columns unpopulated and the // miss leaves that table's columns unpopulated and the
// walker falls back to the schemaless value-literal list. // walker falls back to the schemaless value-literal list.
for name in cache.tables.clone() { for name in cache.tables.clone() {
if let Ok(desc) = database.describe_table(name.clone(), None).await { if let Ok(desc) = database.describe_table(name.clone()).await {
// Per-table indexes for the items panel (S2, ADR-0025). // Per-table indexes for the items panel (S2, ADR-0025).
// Carry uniqueness so the panel can mark a UNIQUE index // Carry uniqueness so the panel can mark a UNIQUE index
// (ADR-0035 §4d). Captured before `desc.columns` is // (ADR-0035 §4d). Captured before `desc.columns` is
@@ -1650,7 +1650,7 @@ async fn build_show_data_echo(
limit: Some(_), limit: Some(_),
.. ..
} => database } => database
.describe_table(name.clone(), None) .describe_table(name.clone())
.await .await
.map(|desc| { .map(|desc| {
desc.columns desc.columns
@@ -1732,7 +1732,7 @@ async fn collect_echo_lookups(
Command::DropIndex { Command::DropIndex {
selector: IndexSelector::Columns { table, columns }, selector: IndexSelector::Columns { table, columns },
} => { } => {
if let Ok(desc) = database.describe_table(table.clone(), None).await if let Ok(desc) = database.describe_table(table.clone()).await
&& let Some(idx) = desc.indexes.iter().find(|i| i.columns == *columns) && let Some(idx) = desc.indexes.iter().find(|i| i.columns == *columns)
{ {
out.drop_index_name = Some(idx.name.clone()); out.drop_index_name = Some(idx.name.clone());
@@ -1747,7 +1747,7 @@ async fn collect_echo_lookups(
child_column, child_column,
}, },
} => { } => {
if let Ok(desc) = database.describe_table(child_table.clone(), None).await if let Ok(desc) = database.describe_table(child_table.clone()).await
&& let Some(rel) = desc.outbound_relationships.iter().find(|r| { && let Some(rel) = desc.outbound_relationships.iter().find(|r| {
// The Endpoints drop selector is single-column // The Endpoints drop selector is single-column
// (ADR-0043 keeps DROP by-endpoints single-column; // (ADR-0043 keeps DROP by-endpoints single-column;
@@ -1771,7 +1771,7 @@ async fn collect_echo_lookups(
// resolver API would be the next step if schemas grow. // resolver API would be the next step if schemas grow.
if let Ok(tables) = database.list_tables().await { if let Ok(tables) = database.list_tables().await {
for table in tables { for table in tables {
if let Ok(desc) = database.describe_table(table.clone(), None).await if let Ok(desc) = database.describe_table(table.clone()).await
&& desc.outbound_relationships.iter().any(|r| r.name == *name) && desc.outbound_relationships.iter().any(|r| r.name == *name)
{ {
out.drop_relationship = Some((name.clone(), table.clone())); out.drop_relationship = Some((name.clone(), table.clone()));
@@ -1795,8 +1795,8 @@ async fn collect_echo_lookups(
// *before* execution to know which `ADD COLUMN` lines to // *before* execution to know which `ADD COLUMN` lines to
// emit. The parent columns here are the explicit DSL list, // emit. The parent columns here are the explicit DSL list,
// paired positionally with the child list. // paired positionally with the child list.
let parent_desc = database.describe_table(parent_table.clone(), None).await; let parent_desc = database.describe_table(parent_table.clone()).await;
let child_desc = database.describe_table(child_table.clone(), None).await; let child_desc = database.describe_table(child_table.clone()).await;
if let (Ok(parent_desc), Ok(child_desc)) = (parent_desc, child_desc) { if let (Ok(parent_desc), Ok(child_desc)) = (parent_desc, child_desc) {
let mut new_columns: Vec<(String, crate::dsl::types::Type)> = Vec::new(); let mut new_columns: Vec<(String, crate::dsl::types::Type)> = Vec::new();
for (child_col, parent_col) in child_columns.iter().zip(parent_columns) { for (child_col, parent_col) in child_columns.iter().zip(parent_columns) {
@@ -2064,7 +2064,7 @@ async fn enrich_check_violation(
.await .await
.map(|v| v.to_string()); .map(|v| v.to_string());
// The rule itself — the column's compiled CHECK expression. // The rule itself — the column's compiled CHECK expression.
if let Ok(desc) = database.describe_table(table.to_string(), None).await if let Ok(desc) = database.describe_table(table.to_string()).await
&& let Some(col) = desc.columns.iter().find(|c| c.name == column) && let Some(col) = desc.columns.iter().find(|c| c.name == column)
{ {
facts.check_rule.clone_from(&col.check); facts.check_rule.clone_from(&col.check);
@@ -2272,7 +2272,7 @@ async fn user_value_for_column_with_schema(
} = command } = command
{ {
let desc = database let desc = database
.describe_table(table.to_string(), None) .describe_table(table.to_string())
.await .await
.ok()?; .ok()?;
// Build the natural-order column list the same way // Build the natural-order column list the same way
@@ -2311,7 +2311,7 @@ async fn user_value_for_column_with_schema(
&& literal_rows.len() == 1 && literal_rows.len() == 1
{ {
let desc = database let desc = database
.describe_table(table.to_string(), None) .describe_table(table.to_string())
.await .await
.ok()?; .ok()?;
let idx = desc.columns.iter().position(|c| c.name == column)?; let idx = desc.columns.iter().position(|c| c.name == column)?;
@@ -2930,7 +2930,7 @@ async fn execute_command_typed(
.await .await
.map(|d| CommandOutcome::Schema(Some(d))), .map(|d| CommandOutcome::Schema(Some(d))),
Command::ShowTable { name } => database Command::ShowTable { name } => database
.describe_table(name, src) .describe_table(name)
.await .await
.map(|d| CommandOutcome::Schema(Some(d))), .map(|d| CommandOutcome::Schema(Some(d))),
// ADR-0044: a named relationship renders as a diagram (App-side), // ADR-0044: a named relationship renders as a diagram (App-side),
@@ -2983,14 +2983,14 @@ async fn execute_command_typed(
filter, filter,
limit, limit,
} => database } => database
.query_data(name, filter, limit, src) .query_data(name, filter, limit)
.await .await
.map(CommandOutcome::Query), .map(CommandOutcome::Query),
// A SQL `SELECT` (advanced mode; ADR-0030 §6, ADR-0031). // A SQL `SELECT` (advanced mode; ADR-0030 §6, ADR-0031).
// The grammar walker has already validated `sql` is in // The grammar walker has already validated `sql` is in
// the supported subset; the worker runs it as text. // the supported subset; the worker runs it as text.
Command::Select { sql } => database Command::Select { sql } => database
.run_select(sql, src) .run_select(sql)
.await .await
.map(CommandOutcome::Query), .map(CommandOutcome::Query),
// A SQL `INSERT` (advanced mode; ADR-0033 §1). Grammar-as- // A SQL `INSERT` (advanced mode; ADR-0033 §1). Grammar-as-
@@ -0,0 +1,9 @@
---
source: src/app.rs
assertion_line: 5844
expression: block
---
Hint
What: Add one or more rows to a table.
Example: insert into Customers values ('Ann', 'ann@example.io')
Concept: A row is one record; each value lines up with a column, in order. Columns typed `serial`/`shortid` fill themselves — leave them out.
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 2836 assertion_line: 2839
expression: snapshot expression: snapshot
--- ---
╭ Output ──────────────────────────────────────────────────────────────────────╮ ╭ Output ──────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│ │ │ │
╰──────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 2819 assertion_line: 2822
expression: snapshot expression: snapshot
--- ---
╭ Output ──────────────────────────────────────────────────────────────────────╮ ╭ Output ──────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│for SQL │ │for SQL │
╰──────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 2827 assertion_line: 2830
expression: snapshot expression: snapshot
--- ---
╭ Output ──────────────────────────────────────────────────────────────────────╮ ╭ Output ──────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│for SQL │ │for SQL │
╰──────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 3442 assertion_line: 3445
expression: snapshot expression: snapshot
--- ---
╭ Output ────────────────────────────────────────────────────────────────────────────────╮ ╭ Output ────────────────────────────────────────────────────────────────────────────────╮
@@ -28,4 +28,4 @@ expression: snapshot
│ │ │ │
╰────────────────────────────────────────────────────────────────────────────────────────╯ ╰────────────────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 3388 assertion_line: 3391
expression: snapshot expression: snapshot
--- ---
╭ Output ────────────────────────────────────────────────────────────────────────────────╮ ╭ Output ────────────────────────────────────────────────────────────────────────────────╮
@@ -28,4 +28,4 @@ expression: snapshot
│ │ │ │
╰────────────────────────────────────────────────────────────────────────────────────────╯ ╰────────────────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 3378 assertion_line: 3381
expression: snapshot expression: snapshot
--- ---
╭ Output ────────────────────────────────────────────────────────────────────────────────╮ ╭ Output ────────────────────────────────────────────────────────────────────────────────╮
@@ -28,4 +28,4 @@ expression: snapshot
│ │ │ │
╰────────────────────────────────────────────────────────────────────────────────────────╯ ╰────────────────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 3431 assertion_line: 3434
expression: snapshot expression: snapshot
--- ---
╭ Output ────────────────────────────────────────────────────────────────────────────────╮ ╭ Output ────────────────────────────────────────────────────────────────────────────────╮
@@ -28,4 +28,4 @@ expression: snapshot
│ │ │ │
╰────────────────────────────────────────────────────────────────────────────────────────╯ ╰────────────────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 3457 assertion_line: 3460
expression: snapshot expression: snapshot
--- ---
╭ Output ────────────────────────────────────────────────────────────────────────────────╮ ╭ Output ────────────────────────────────────────────────────────────────────────────────╮
@@ -28,4 +28,4 @@ expression: snapshot
│ │ │ │
╰────────────────────────────────────────────────────────────────────────────────────────╯ ╰────────────────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 2880 assertion_line: 2882
expression: snapshot expression: snapshot
--- ---
╭ Output ──────────────────────────────────────────────────────────────────────╮ ╭ Output ──────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│insert into <Table> [(<col>[, ...])] [values] (<value>[, ...]) │ │insert into <Table> [(<col>[, ...])] [values] (<value>[, ...]) │
╰──────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Esc clear · Ctrl-A/E home/end · Ctrl-W del word · Enter run F1 hint · Esc clear · Ctrl-A/E home/end · Ctrl-W del word · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 2896 assertion_line: 2898
expression: snapshot expression: snapshot
--- ---
╭ Output ──────────────────────────────────────────────────────────────────────╮ ╭ Output ──────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│ │ │ │
╰──────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Esc clear · Ctrl-A/E home/end · Ctrl-W del word · Enter run F1 hint · Esc clear · Ctrl-A/E home/end · Ctrl-W del word · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 3099 assertion_line: 3102
expression: snapshot expression: snapshot
--- ---
╭ Tables ──────────────────╮╭ Output ────────────────────────────────────────────────────────────────────────╮ ╭ Tables ──────────────────╮╭ Output ────────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│ ││for SQL │ │ ││for SQL │
╰──────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 2909 assertion_line: 2912
expression: snapshot expression: snapshot
--- ---
╭ Output ──────────────────────────────────────────────────────────────────────╮ ╭ Output ──────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│for SQL │ │for SQL │
╰──────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -1,6 +1,6 @@
--- ---
source: src/ui.rs source: src/ui.rs
assertion_line: 3209 assertion_line: 3212
expression: snapshot expression: snapshot
--- ---
╭ Tables ──────────────────╮╭ Output ────────────────────────────────────────────────────────────────────────╮ ╭ Tables ──────────────────╮╭ Output ────────────────────────────────────────────────────────────────────────╮
@@ -26,4 +26,4 @@ expression: snapshot
│ Orders.customer_id ││for SQL │ │ Orders.customer_id ││for SQL │
╰──────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Ctrl-O sidebar · Tab complete · ↑ history · Enter run Ctrl-O sidebar · Tab complete · ↑ history · F1 hint · Enter run
@@ -46,4 +46,4 @@ expression: snapshot
│with `mode advanced`, or prefix the line with `:` to run… │ │with `mode advanced`, or prefix the line with `:` to run… │
╰──────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────╯
Project: Term Planner Project: Term Planner
Esc clear · Ctrl-A/E home/end · Ctrl-W del word · Ente F1 hint · Esc clear · Ctrl-A/E home/end · Ctrl-W del w
+9 -6
View File
@@ -1894,22 +1894,25 @@ fn status_bar_bindings(app: &App) -> Vec<(&'static str, String)> {
("Enter", crate::t!("shortcut.run")), ("Enter", crate::t!("shortcut.run")),
]; ];
} }
// 4. Editing — the input has text: surface the readline edit keys // 4. Editing — the input has text: F1 (the contextual hint for what
// (ADR-0049). The highest-value subset stays within the width // you're typing, ADR-0053) leads, then the readline edit keys
// budget; Ctrl-K/U remain unadvertised muscle memory. // (ADR-0049). Ctrl-K/U remain unadvertised muscle memory.
if !app.input.is_empty() { if !app.input.is_empty() {
return vec![ return vec![
("F1", crate::t!("shortcut.hint")),
("Esc", crate::t!("shortcut.clear")), ("Esc", crate::t!("shortcut.clear")),
("Ctrl-A/E", crate::t!("shortcut.home_end")), ("Ctrl-A/E", crate::t!("shortcut.home_end")),
("Ctrl-W", crate::t!("shortcut.del_word")), ("Ctrl-W", crate::t!("shortcut.del_word")),
("Enter", crate::t!("shortcut.run")), ("Enter", crate::t!("shortcut.run")),
]; ];
} }
// 5. Default — empty input, Input focus. // 5. Default — empty input, Input focus. F1 here expands on the most
// recent error, or points the user at getting started (ADR-0053).
vec![ vec![
("Ctrl-O", crate::t!("shortcut.nav")), ("Ctrl-O", crate::t!("shortcut.nav")),
("Tab", crate::t!("shortcut.complete")), ("Tab", crate::t!("shortcut.complete")),
("", crate::t!("shortcut.history")), ("", crate::t!("shortcut.history")),
("F1", crate::t!("shortcut.hint")),
("Enter", crate::t!("shortcut.run")), ("Enter", crate::t!("shortcut.run")),
] ]
} }
@@ -2664,7 +2667,7 @@ mod tests {
#[test] #[test]
fn strip_default_state_is_nav_complete_history_run() { fn strip_default_state_is_nav_complete_history_run() {
let app = App::new(); let app = App::new();
assert_eq!(strip_keys(&app), vec!["Ctrl-O", "Tab", "", "Enter"]); assert_eq!(strip_keys(&app), vec!["Ctrl-O", "Tab", "", "F1", "Enter"]);
} }
#[test] #[test]
@@ -2675,7 +2678,7 @@ mod tests {
app.input.push_str("create ta"); app.input.push_str("create ta");
assert_eq!( assert_eq!(
strip_keys(&app), strip_keys(&app),
vec!["Esc", "Ctrl-A/E", "Ctrl-W", "Enter"], vec!["F1", "Esc", "Ctrl-A/E", "Ctrl-W", "Enter"],
); );
} }
+5 -5
View File
@@ -93,7 +93,7 @@ fn rename_column_with_case_variant_table_keeps_metadata_in_step() {
.expect("rename column via a case-variant table name"); .expect("rename column via a case-variant table name");
let desc = r let desc = r
.block_on(db.describe_table("Items".to_string(), None)) .block_on(db.describe_table("Items".to_string()))
.expect("describe Items"); .expect("describe Items");
let amount = desc let amount = desc
.columns .columns
@@ -126,7 +126,7 @@ fn insert_with_case_variant_table_persists_and_survives_rebuild() {
let db = fresh_rebuild(db, &project, &r); let db = fresh_rebuild(db, &project, &r);
let rows = r let rows = r
.block_on(db.query_data("Items".to_string(), None, None, None)) .block_on(db.query_data("Items".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows.len(), 1, "the wrong-case insert survived the rebuild (no data loss)"); assert_eq!(rows.len(), 1, "the wrong-case insert survived the rebuild (no data loss)");
@@ -146,7 +146,7 @@ fn add_column_with_case_variant_table_survives_rebuild() {
); );
let db = fresh_rebuild(db, &project, &r); let db = fresh_rebuild(db, &project, &r);
let desc = r.block_on(db.describe_table("Items".to_string(), None)).expect("describe"); let desc = r.block_on(db.describe_table("Items".to_string())).expect("describe");
let qty = desc.columns.iter().find(|c| c.name == "qty").expect("qty added"); let qty = desc.columns.iter().find(|c| c.name == "qty").expect("qty added");
assert_eq!(qty.user_type, Some(Type::Int), "qty's user-type survived the rebuild"); assert_eq!(qty.user_type, Some(Type::Int), "qty's user-type survived the rebuild");
// The CHECK is intact too (a negative qty is refused under the real table). // The CHECK is intact too (a negative qty is refused under the real table).
@@ -224,12 +224,12 @@ fn add_relationship_with_case_variant_tables_survives_rebuild() {
add 1:n relationship from parent.id to child.parent_id\n", add 1:n relationship from parent.id to child.parent_id\n",
); );
// The parent's inbound relationship is visible under the stored case. // The parent's inbound relationship is visible under the stored case.
let p = r.block_on(db.describe_table("Parent".to_string(), None)).expect("describe Parent"); let p = r.block_on(db.describe_table("Parent".to_string())).expect("describe Parent");
assert_eq!(p.inbound_relationships.len(), 1, "relationship recorded under the stored case"); assert_eq!(p.inbound_relationships.len(), 1, "relationship recorded under the stored case");
assert_eq!(p.inbound_relationships[0].other_table, "Child"); assert_eq!(p.inbound_relationships[0].other_table, "Child");
let db = fresh_rebuild(db, &project, &r); let db = fresh_rebuild(db, &project, &r);
let p = r.block_on(db.describe_table("Parent".to_string(), None)).expect("describe Parent"); let p = r.block_on(db.describe_table("Parent".to_string())).expect("describe Parent");
assert_eq!(p.inbound_relationships.len(), 1, "relationship survived the rebuild"); assert_eq!(p.inbound_relationships.len(), 1, "relationship survived the rebuild");
assert_eq!(p.inbound_relationships[0].other_table, "Child"); assert_eq!(p.inbound_relationships[0].other_table, "Child");
} }
+5 -5
View File
@@ -276,7 +276,7 @@ fn compound_fk_declares_enforces_and_round_trips() {
); );
// describe shows the compound endpoints symmetrically. // describe shows the compound endpoints symmetrically.
let city = db.describe_table("City".to_string(), None).await.unwrap(); let city = db.describe_table("City".to_string()).await.unwrap();
let outbound = &city.outbound_relationships[0]; let outbound = &city.outbound_relationships[0];
assert_eq!( assert_eq!(
outbound.local_columns, outbound.local_columns,
@@ -329,7 +329,7 @@ fn compound_fk_create_fk_makes_both_child_columns() {
) )
.await .await
.expect("add compound relationship with --create-fk"); .expect("add compound relationship with --create-fk");
let city = db.describe_table("City".to_string(), None).await.unwrap(); let city = db.describe_table("City".to_string()).await.unwrap();
for col in ["c_country", "c_code"] { for col in ["c_country", "c_code"] {
assert!( assert!(
city.columns.iter().any(|c| c.name == col), city.columns.iter().any(|c| c.name == col),
@@ -527,7 +527,7 @@ fn compound_fk_survives_rebuild_from_text() {
.await; .await;
assert!(bad.is_err(), "compound FK still enforced after rebuild from text"); assert!(bad.is_err(), "compound FK still enforced after rebuild from text");
// Endpoints survived the round-trip intact. // Endpoints survived the round-trip intact.
let city = db.describe_table("City".to_string(), None).await.unwrap(); let city = db.describe_table("City".to_string()).await.unwrap();
assert_eq!( assert_eq!(
city.outbound_relationships[0].other_columns, city.outbound_relationships[0].other_columns,
vec!["country".to_string(), "code".to_string()], vec!["country".to_string(), "code".to_string()],
@@ -563,7 +563,7 @@ fn compound_fk_undo_removes_the_relationship() {
.await .await
.expect("add compound relationship"); .expect("add compound relationship");
assert_eq!( assert_eq!(
db.describe_table("City".to_string(), None) db.describe_table("City".to_string())
.await .await
.unwrap() .unwrap()
.outbound_relationships .outbound_relationships
@@ -573,7 +573,7 @@ fn compound_fk_undo_removes_the_relationship() {
// One undo step removes the whole relationship (ADR-0013/0006). // One undo step removes the whole relationship (ADR-0013/0006).
db.undo().await.unwrap().expect("undo applied"); db.undo().await.unwrap().expect("undo applied");
assert!( assert!(
db.describe_table("City".to_string(), None) db.describe_table("City".to_string())
.await .await
.unwrap() .unwrap()
.outbound_relationships .outbound_relationships
+4 -4
View File
@@ -76,7 +76,7 @@ fn rebuild_restores_schema_only_project() {
// Phase 4: confirm Customers exists with the right shape. // Phase 4: confirm Customers exists with the right shape.
let desc = rt() let desc = rt()
.block_on(async { db.describe_table("Customers".to_string(), None).await }) .block_on(async { db.describe_table("Customers".to_string()).await })
.expect("describe_table"); .expect("describe_table");
assert_eq!(desc.name, "Customers"); assert_eq!(desc.name, "Customers");
let cols: Vec<&str> = desc.columns.iter().map(|c| c.name.as_str()).collect(); let cols: Vec<&str> = desc.columns.iter().map(|c| c.name.as_str()).collect();
@@ -143,7 +143,7 @@ fn rebuild_restores_rows_from_csv() {
}); });
let rows = rt() let rows = rt()
.block_on(async { db.query_data("Customers".to_string(), None, None, None).await }) .block_on(async { db.query_data("Customers".to_string(), None, None).await })
.expect("query_data"); .expect("query_data");
assert_eq!(rows.rows.len(), 2); assert_eq!(rows.rows.len(), 2);
let names: Vec<Option<String>> = rows.rows.iter().map(|r| r[1].clone()).collect(); let names: Vec<Option<String>> = rows.rows.iter().map(|r| r[1].clone()).collect();
@@ -371,7 +371,7 @@ fn rebuild_preserves_created_at_from_yaml() {
// Trigger any successful command so project.yaml is // Trigger any successful command so project.yaml is
// rewritten from the now-rebuilt db state. // rewritten from the now-rebuilt db state.
rt().block_on(async { rt().block_on(async {
db.describe_table("T".to_string(), Some("show table T".to_string())) db.describe_table("T".to_string())
.await .await
.unwrap(); .unwrap();
// describe is read-only; force a rewrite by adding a column. // describe is read-only; force a rewrite by adding a column.
@@ -451,7 +451,7 @@ fn rebuild_restores_indexes() {
}); });
let desc = rt() let desc = rt()
.block_on(async { db.describe_table("Customers".to_string(), None).await }) .block_on(async { db.describe_table("Customers".to_string()).await })
.expect("describe_table"); .expect("describe_table");
assert_eq!(desc.indexes.len(), 1, "index should survive rebuild"); assert_eq!(desc.indexes.len(), 1, "index should survive rebuild");
assert_eq!(desc.indexes[0].name, "idx_email"); assert_eq!(desc.indexes[0].name, "idx_email");
+1 -1
View File
@@ -173,7 +173,7 @@ fn rebuild_against_populated_db_wipes_and_reloads() {
.expect("rebuild"); .expect("rebuild");
}); });
let rows = rt() let rows = rt()
.block_on(async { db.query_data("Customers".to_string(), None, None, None).await }) .block_on(async { db.query_data("Customers".to_string(), None, None).await })
.unwrap(); .unwrap();
assert_eq!(rows.rows.len(), 1); assert_eq!(rows.rows.len(), 1);
assert_eq!(rows.rows[0][1].as_deref(), Some("Edna")); assert_eq!(rows.rows[0][1].as_deref(), Some("Edna"));
+1 -1
View File
@@ -362,7 +362,7 @@ fn end_to_end_export_then_import_real_project() {
// Round-trip: the inserted row is back. // Round-trip: the inserted row is back.
let data_view = rt() let data_view = rt()
.block_on(async { imported_db.query_data("Customers".to_string(), None, None, None).await }) .block_on(async { imported_db.query_data("Customers".to_string(), None, None).await })
.expect("query data"); .expect("query data");
assert_eq!(data_view.rows.len(), 1); assert_eq!(data_view.rows.len(), 1);
// Serial id auto-filled to 1; Name was the inserted value. // Serial id auto-filled to 1; Name was the inserted value.
+6 -6
View File
@@ -107,7 +107,7 @@ fn generates_junction_with_compound_pk_and_two_enforced_fks() {
assert!(tables.contains(&"Students_Courses".to_string()), "tables: {tables:?}"); assert!(tables.contains(&"Students_Courses".to_string()), "tables: {tables:?}");
// Two FK columns, both part of the compound PK. // Two FK columns, both part of the compound PK.
let desc = db.describe_table("Students_Courses".to_string(), None).await.unwrap(); let desc = db.describe_table("Students_Courses".to_string()).await.unwrap();
let cols: Vec<(&str, bool)> = let cols: Vec<(&str, bool)> =
desc.columns.iter().map(|c| (c.name.as_str(), c.primary_key)).collect(); desc.columns.iter().map(|c| (c.name.as_str(), c.primary_key)).collect();
assert_eq!( assert_eq!(
@@ -191,7 +191,7 @@ fn compound_parent_pk_contributes_one_fk_column_each() {
.await .await
.expect("create m:n"); .expect("create m:n");
let desc = db.describe_table("Students_Sections".to_string(), None).await.unwrap(); let desc = db.describe_table("Students_Sections".to_string()).await.unwrap();
let names: Vec<&str> = desc.columns.iter().map(|c| c.name.as_str()).collect(); let names: Vec<&str> = desc.columns.iter().map(|c| c.name.as_str()).collect();
assert_eq!(names, vec!["Students_id", "Sections_course_id", "Sections_term"]); assert_eq!(names, vec!["Students_id", "Sections_course_id", "Sections_term"]);
// All three form the compound PK. // All three form the compound PK.
@@ -221,7 +221,7 @@ fn deleting_a_parent_cascades_to_the_junction() {
// Deleting the student cascades to the junction (ON DELETE CASCADE). // Deleting the student cascades to the junction (ON DELETE CASCADE).
db.delete("Students".to_string(), RowFilter::AllRows, None).await.unwrap(); db.delete("Students".to_string(), RowFilter::AllRows, None).await.unwrap();
let rows = db.query_data("Students_Courses".to_string(), None, None, None).await.unwrap(); let rows = db.query_data("Students_Courses".to_string(), None, None).await.unwrap();
assert!(rows.rows.is_empty(), "junction rows should cascade-delete, got {:?}", rows.rows); assert!(rows.rows.is_empty(), "junction rows should cascade-delete, got {:?}", rows.rows);
}); });
} }
@@ -249,7 +249,7 @@ fn create_m2n_is_one_undo_step() {
let tables = db.list_tables().await.unwrap(); let tables = db.list_tables().await.unwrap();
assert!(!tables.contains(&"Students_Courses".to_string()), "undo should remove the junction: {tables:?}"); assert!(!tables.contains(&"Students_Courses".to_string()), "undo should remove the junction: {tables:?}");
// The parents' relationships are gone too (the junction held them). // The parents' relationships are gone too (the junction held them).
let students = db.describe_table("Students".to_string(), None).await.unwrap(); let students = db.describe_table("Students".to_string()).await.unwrap();
assert!(students.inbound_relationships.is_empty(), "no leftover relationship after undo"); assert!(students.inbound_relationships.is_empty(), "no leftover relationship after undo");
}); });
} }
@@ -321,7 +321,7 @@ fn the_junction_can_be_renamed() {
assert!(tables.contains(&"Enrollments".to_string()), "tables: {tables:?}"); assert!(tables.contains(&"Enrollments".to_string()), "tables: {tables:?}");
assert!(!tables.contains(&"Students_Courses".to_string())); assert!(!tables.contains(&"Students_Courses".to_string()));
// Both relationships survive the rename (rebuild-preserving). // Both relationships survive the rename (rebuild-preserving).
let desc = db.describe_table("Enrollments".to_string(), None).await.unwrap(); let desc = db.describe_table("Enrollments".to_string()).await.unwrap();
assert_eq!(desc.outbound_relationships.len(), 2, "FKs preserved across rename"); assert_eq!(desc.outbound_relationships.len(), 2, "FKs preserved across rename");
}); });
} }
@@ -362,7 +362,7 @@ fn junction_survives_save_and_rebuild() {
db.rebuild_from_text(project.path().to_path_buf(), None).await.expect("rebuild"); db.rebuild_from_text(project.path().to_path_buf(), None).await.expect("rebuild");
let tables = db.list_tables().await.unwrap(); let tables = db.list_tables().await.unwrap();
assert!(tables.contains(&"Students_Courses".to_string()), "junction survived: {tables:?}"); assert!(tables.contains(&"Students_Courses".to_string()), "junction survived: {tables:?}");
let desc = db.describe_table("Students_Courses".to_string(), None).await.unwrap(); let desc = db.describe_table("Students_Courses".to_string()).await.unwrap();
assert_eq!(desc.outbound_relationships.len(), 2, "both FKs reconstructed"); assert_eq!(desc.outbound_relationships.len(), 2, "both FKs reconstructed");
assert!(desc.columns.iter().all(|c| c.primary_key), "compound PK reconstructed"); assert!(desc.columns.iter().all(|c| c.primary_key), "compound PK reconstructed");
}); });
+9 -9
View File
@@ -108,13 +108,13 @@ fn replay_runs_advanced_sql_create_table_as_a_write() {
// The SQL DDL line actually created the structural table… // The SQL DDL line actually created the structural table…
let desc = rt() let desc = rt()
.block_on(async { db.describe_table("Widget".to_string(), None).await }) .block_on(async { db.describe_table("Widget".to_string()).await })
.expect("describe"); .expect("describe");
let names: Vec<String> = desc.columns.iter().map(|c| c.name.clone()).collect(); let names: Vec<String> = desc.columns.iter().map(|c| c.name.clone()).collect();
assert_eq!(names, vec!["id".to_string(), "name".to_string()]); assert_eq!(names, vec!["id".to_string(), "name".to_string()]);
// …and the following insert (serial id auto-filled) ran against it. // …and the following insert (serial id auto-filled) ran against it.
let rows = rt() let rows = rt()
.block_on(async { db.query_data("Widget".to_string(), None, None, None).await }) .block_on(async { db.query_data("Widget".to_string(), None, None).await })
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows.len(), 1); assert_eq!(rows.len(), 1);
@@ -139,7 +139,7 @@ fn replay_three_lines_dispatches_three_commands() {
// The dispatched commands actually mutated state. // The dispatched commands actually mutated state.
let data_result = rt() let data_result = rt()
.block_on(async { db.query_data("T".to_string(), None, None, None).await }) .block_on(async { db.query_data("T".to_string(), None, None).await })
.expect("query_data"); .expect("query_data");
assert_eq!(data_result.rows.len(), 1, "row inserted"); assert_eq!(data_result.rows.len(), 1, "row inserted");
assert_eq!(data_result.rows[0][1].as_deref(), Some("Alice")); assert_eq!(data_result.rows[0][1].as_deref(), Some("Alice"));
@@ -174,7 +174,7 @@ fn replay_of_actual_history_log_runs_ok_commands_and_skips_err() {
assert_completed(&events, 3); assert_completed(&events, 3);
let data_result = rt() let data_result = rt()
.block_on(async { db.query_data("T".to_string(), None, None, None).await }) .block_on(async { db.query_data("T".to_string(), None, None).await })
.expect("query_data"); .expect("query_data");
assert_eq!(data_result.rows.len(), 1, "only the ok INSERT applied"); assert_eq!(data_result.rows.len(), 1, "only the ok INSERT applied");
assert_eq!(data_result.rows[0][1].as_deref(), Some("alpha")); assert_eq!(data_result.rows[0][1].as_deref(), Some("alpha"));
@@ -227,7 +227,7 @@ fn replay_skips_app_lifecycle_commands_silently() {
other => panic!("expected ReplayCompleted, got {other:?}"), other => panic!("expected ReplayCompleted, got {other:?}"),
} }
let data_result = rt() let data_result = rt()
.block_on(async { db.query_data("T".to_string(), None, None, None).await }) .block_on(async { db.query_data("T".to_string(), None, None).await })
.expect("query_data"); .expect("query_data");
assert!( assert!(
data_result.columns.iter().any(|c| c == "v"), data_result.columns.iter().any(|c| c == "v"),
@@ -401,14 +401,14 @@ fn replay_aborts_on_first_parse_failure_and_reports_line() {
// but earlier commands stayed applied (table T exists with // but earlier commands stayed applied (table T exists with
// the `name` column). // the `name` column).
let desc = rt() let desc = rt()
.block_on(async { db.describe_table("T".to_string(), None).await }) .block_on(async { db.describe_table("T".to_string()).await })
.expect("describe_table"); .expect("describe_table");
assert!( assert!(
desc.columns.iter().any(|c| c.name == "name"), desc.columns.iter().any(|c| c.name == "name"),
"earlier add column should have stayed applied" "earlier add column should have stayed applied"
); );
let data_result = rt() let data_result = rt()
.block_on(async { db.query_data("T".to_string(), None, None, None).await }) .block_on(async { db.query_data("T".to_string(), None, None).await })
.expect("query_data"); .expect("query_data");
assert!( assert!(
data_result.rows.is_empty(), data_result.rows.is_empty(),
@@ -467,7 +467,7 @@ fn replay_rejects_wrong_type_value_in_a_hand_built_script() {
// The earlier two lines stayed applied; the failing insert // The earlier two lines stayed applied; the failing insert
// did not run — state is intact. // did not run — state is intact.
let data_result = rt() let data_result = rt()
.block_on(async { db.query_data("T".to_string(), None, None, None).await }) .block_on(async { db.query_data("T".to_string(), None, None).await })
.expect("query_data"); .expect("query_data");
assert!( assert!(
data_result.rows.is_empty(), data_result.rows.is_empty(),
@@ -527,7 +527,7 @@ fn replay_skips_nested_replay_with_a_warning() {
other => panic!("expected ReplayCompleted (nested replay skipped), got {other:?}"), other => panic!("expected ReplayCompleted (nested replay skipped), got {other:?}"),
} }
// The nested file's table was NOT created (the replay was skipped). // The nested file's table was NOT created (the replay was skipped).
let cols = rt().block_on(async { db.query_data("T".to_string(), None, None, None).await }); let cols = rt().block_on(async { db.query_data("T".to_string(), None, None).await });
assert!(cols.is_err(), "inner.commands' table T must not exist (nested replay skipped)"); assert!(cols.is_err(), "inner.commands' table T must not exist (nested replay skipped)");
} }
+1 -1
View File
@@ -462,7 +462,7 @@ fn app_show_table_renders_relationships_as_compact_diagrams() {
rt.block_on(seed_schema(&db)); rt.block_on(seed_schema(&db));
// Orders holds the FK to Customers — an outbound relationship. // Orders holds the FK to Customers — an outbound relationship.
let desc = rt let desc = rt
.block_on(db.describe_table("Orders".to_string(), None)) .block_on(db.describe_table("Orders".to_string()))
.expect("describe Orders"); .expect("describe Orders");
let mut app = App::new(); let mut app = App::new();
+17 -17
View File
@@ -111,7 +111,7 @@ fn e2e_alter_drop_compound_primary_key_member_is_refused() {
/// The current user-facing type of column `name` in table `T`. /// The current user-facing type of column `name` in table `T`.
fn col_type(db: &Database, r: &tokio::runtime::Runtime, name: &str) -> Option<Type> { fn col_type(db: &Database, r: &tokio::runtime::Runtime, name: &str) -> Option<Type> {
r.block_on(db.describe_table("T".to_string(), None)) r.block_on(db.describe_table("T".to_string()))
.expect("describe") .expect("describe")
.columns .columns
.into_iter() .into_iter()
@@ -120,7 +120,7 @@ fn col_type(db: &Database, r: &tokio::runtime::Runtime, name: &str) -> Option<Ty
} }
fn column_names(db: &Database, r: &tokio::runtime::Runtime) -> Vec<String> { fn column_names(db: &Database, r: &tokio::runtime::Runtime) -> Vec<String> {
r.block_on(db.describe_table("T".to_string(), None)) r.block_on(db.describe_table("T".to_string()))
.expect("describe") .expect("describe")
.columns .columns
.into_iter() .into_iter()
@@ -163,7 +163,7 @@ fn e2e_alter_table_add_rename_drop_and_raw_default_check() {
// The DEFAULT backfilled the pre-existing row to qty = 0. // The DEFAULT backfilled the pre-existing row to qty = 0.
let rows = r let rows = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows.len(), 1); assert_eq!(rows.len(), 1);
@@ -252,7 +252,7 @@ fn e2e_alter_column_type_clean_and_lossy_convert() {
} }
let rows = r let rows = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows.len(), 1); assert_eq!(rows.len(), 1);
@@ -292,7 +292,7 @@ fn e2e_alter_column_type_int_to_serial_is_allowed() {
} }
assert_eq!(col_type(&db, &r, "n"), Some(Type::Serial), "int→serial converted the column"); assert_eq!(col_type(&db, &r, "n"), Some(Type::Serial), "int→serial converted the column");
let rows = r let rows = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows[0][1].as_deref(), Some("100"), "the existing value is preserved"); assert_eq!(rows[0][1].as_deref(), Some("100"), "the existing value is preserved");
@@ -635,7 +635,7 @@ fn e2e_drop_composite_unique_is_one_undo_step() {
.expect("write"); .expect("write");
r.block_on(run_replay(&db, project.path(), "u.commands")); r.block_on(run_replay(&db, project.path(), "u.commands"));
let has_unique = || { let has_unique = || {
!r.block_on(db.describe_table("T".to_string(), None)) !r.block_on(db.describe_table("T".to_string()))
.expect("describe") .expect("describe")
.unique_constraints .unique_constraints
.is_empty() .is_empty()
@@ -878,7 +878,7 @@ fn e2e_describe_shows_table_level_constraints() {
"events: {events:?}" "events: {events:?}"
); );
let desc = r.block_on(db.describe_table("T".to_string(), None)).expect("describe"); let desc = r.block_on(db.describe_table("T".to_string())).expect("describe");
assert_eq!( assert_eq!(
desc.unique_constraints, desc.unique_constraints,
vec![vec!["a".to_string(), "b".to_string()]], vec![vec!["a".to_string(), "b".to_string()]],
@@ -976,7 +976,7 @@ fn e2e_rename_table_with_rows_csv_follows_and_survives_rebuild() {
assert!(!csv_path(&project, "Orders").exists(), "data/Orders.csv removed"); assert!(!csv_path(&project, "Orders").exists(), "data/Orders.csv removed");
let rows = r let rows = r
.block_on(db.query_data("Purchases".to_string(), None, None, None)) .block_on(db.query_data("Purchases".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows.len(), 2); assert_eq!(rows.len(), 2);
@@ -991,7 +991,7 @@ fn e2e_rename_table_with_rows_csv_follows_and_survives_rebuild() {
"Purchases round-tripped through a fresh rebuild: {tables:?}" "Purchases round-tripped through a fresh rebuild: {tables:?}"
); );
let rows = r let rows = r
.block_on(db.query_data("Purchases".to_string(), None, None, None)) .block_on(db.query_data("Purchases".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows.len(), 2); assert_eq!(rows.len(), 2);
@@ -1077,7 +1077,7 @@ fn e2e_rename_fk_parent_updates_metadata_and_still_enforces() {
); );
// The child's outbound relationship now points at the new parent name. // The child's outbound relationship now points at the new parent name.
let c = r.block_on(db.describe_table("C".to_string(), None)).expect("describe C"); let c = r.block_on(db.describe_table("C".to_string())).expect("describe C");
assert_eq!(c.outbound_relationships.len(), 1); assert_eq!(c.outbound_relationships.len(), 1);
assert_eq!(c.outbound_relationships[0].other_table, "Parent"); assert_eq!(c.outbound_relationships[0].other_table, "Parent");
@@ -1129,7 +1129,7 @@ fn e2e_rename_fk_child_updates_metadata_and_still_enforces() {
); );
// The parent's inbound relationship now names the renamed child. // The parent's inbound relationship now names the renamed child.
let p = r.block_on(db.describe_table("P".to_string(), None)).expect("describe P"); let p = r.block_on(db.describe_table("P".to_string())).expect("describe P");
assert_eq!(p.inbound_relationships.len(), 1); assert_eq!(p.inbound_relationships.len(), 1);
assert_eq!(p.inbound_relationships[0].other_table, "Child"); assert_eq!(p.inbound_relationships[0].other_table, "Child");
@@ -1168,7 +1168,7 @@ fn e2e_rename_self_referential_table_updates_both_ends() {
); );
// Both ends of the self-reference now name `Tree`. // Both ends of the self-reference now name `Tree`.
let t = r.block_on(db.describe_table("Tree".to_string(), None)).expect("describe Tree"); let t = r.block_on(db.describe_table("Tree".to_string())).expect("describe Tree");
assert_eq!(t.outbound_relationships[0].other_table, "Tree"); assert_eq!(t.outbound_relationships[0].other_table, "Tree");
assert_eq!(t.inbound_relationships[0].other_table, "Tree"); assert_eq!(t.inbound_relationships[0].other_table, "Tree");
@@ -1216,7 +1216,7 @@ fn e2e_rename_table_keeps_its_index_with_a_stale_name() {
"events: {events:?}" "events: {events:?}"
); );
let u = r.block_on(db.describe_table("Users".to_string(), None)).expect("describe Users"); let u = r.block_on(db.describe_table("Users".to_string())).expect("describe Users");
assert_eq!(u.indexes.len(), 1, "the index followed the rename"); assert_eq!(u.indexes.len(), 1, "the index followed the rename");
assert_eq!( assert_eq!(
u.indexes[0].name, "T_email_idx", u.indexes[0].name, "T_email_idx",
@@ -1226,7 +1226,7 @@ fn e2e_rename_table_keeps_its_index_with_a_stale_name() {
// Survives a fresh rebuild (recreated from IndexSchema on table Users). // Survives a fresh rebuild (recreated from IndexSchema on table Users).
let db = fresh_rebuild(db, &project, &r); let db = fresh_rebuild(db, &project, &r);
let u = r.block_on(db.describe_table("Users".to_string(), None)).expect("describe Users"); let u = r.block_on(db.describe_table("Users".to_string())).expect("describe Users");
assert_eq!(u.indexes.len(), 1); assert_eq!(u.indexes.len(), 1);
assert_eq!(u.indexes[0].name, "T_email_idx"); assert_eq!(u.indexes[0].name, "T_email_idx");
} }
@@ -1255,7 +1255,7 @@ fn e2e_rename_table_is_one_undo_step() {
"undo restored the old table name: {tables:?}" "undo restored the old table name: {tables:?}"
); );
assert_eq!( assert_eq!(
r.block_on(db.query_data("Orders".to_string(), None, None, None)).expect("query").rows.len(), r.block_on(db.query_data("Orders".to_string(), None, None)).expect("query").rows.len(),
1, 1,
"the row is back under the old name" "the row is back under the old name"
); );
@@ -1427,7 +1427,7 @@ fn e2e_alter_column_set_default_applies() {
)) ))
.expect("insert omitting qty"); .expect("insert omitting qty");
let rows = r let rows = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!( assert_eq!(
@@ -1473,7 +1473,7 @@ fn e2e_alter_column_drop_default_removes_it() {
)) ))
.expect("insert omitting qty"); .expect("insert omitting qty");
let rows = r let rows = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!( assert_eq!(
+1 -1
View File
@@ -55,7 +55,7 @@ fn insert_row(db: &Database, r: &tokio::runtime::Runtime, id: i64, email: &str)
} }
fn index(db: &Database, r: &tokio::runtime::Runtime, name: &str) -> Option<(Vec<String>, bool)> { fn index(db: &Database, r: &tokio::runtime::Runtime, name: &str) -> Option<(Vec<String>, bool)> {
r.block_on(db.describe_table("T".to_string(), None)) r.block_on(db.describe_table("T".to_string()))
.expect("describe") .expect("describe")
.indexes .indexes
.into_iter() .into_iter()
+18 -18
View File
@@ -64,7 +64,7 @@ fn created_table_appears_with_playground_types() {
assert!(tables.contains(&"Widget".to_string())); assert!(tables.contains(&"Widget".to_string()));
let desc = r let desc = r
.block_on(db.describe_table("Widget".to_string(), None)) .block_on(db.describe_table("Widget".to_string()))
.expect("describe"); .expect("describe");
let types: Vec<(String, Option<Type>)> = desc let types: Vec<(String, Option<Type>)> = desc
.columns .columns
@@ -98,7 +98,7 @@ fn integer_primary_key_is_plain_int() {
)) ))
.expect("create"); .expect("create");
let desc = r let desc = r
.block_on(db.describe_table("T".to_string(), None)) .block_on(db.describe_table("T".to_string()))
.expect("describe"); .expect("describe");
assert_eq!(desc.columns[0].user_type, Some(Type::Int)); assert_eq!(desc.columns[0].user_type, Some(Type::Int));
} }
@@ -137,7 +137,7 @@ fn serial_pk_autoincrements_in_multi_column_table() {
} }
let data = r let data = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query"); .expect("query");
let id_idx = data let id_idx = data
.columns .columns
@@ -220,7 +220,7 @@ fn table_without_primary_key_is_allowed() {
)) ))
.expect("insert into PK-less table"); .expect("insert into PK-less table");
let data = r let data = r
.block_on(db.query_data("Notes".to_string(), None, None, None)) .block_on(db.query_data("Notes".to_string(), None, None))
.expect("query"); .expect("query");
assert_eq!(data.rows.len(), 1); assert_eq!(data.rows.len(), 1);
} }
@@ -299,7 +299,7 @@ fn default_is_applied_when_column_omitted() {
)) ))
.expect("insert"); .expect("insert");
let data = r let data = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query"); .expect("query");
let n_idx = data.columns.iter().position(|c| c == "n").expect("n column"); let n_idx = data.columns.iter().position(|c| c == "n").expect("n column");
assert_eq!(data.rows[0][n_idx].as_deref(), Some("7"), "DEFAULT 7 applied"); assert_eq!(data.rows[0][n_idx].as_deref(), Some("7"), "DEFAULT 7 applied");
@@ -381,7 +381,7 @@ fn check_default_and_composite_unique_survive_rebuild() {
// A valid row inserts; DEFAULT n=7 survived. // A valid row inserts; DEFAULT n=7 survived.
r.block_on(ins("1", "1", "5")).expect("valid row"); r.block_on(ins("1", "1", "5")).expect("valid row");
let data = r let data = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query"); .expect("query");
let n_idx = data.columns.iter().position(|c| c == "n").expect("n column"); let n_idx = data.columns.iter().position(|c| c == "n").expect("n column");
assert_eq!(data.rows[0][n_idx].as_deref(), Some("7"), "DEFAULT survived rebuild"); assert_eq!(data.rows[0][n_idx].as_deref(), Some("7"), "DEFAULT survived rebuild");
@@ -679,7 +679,7 @@ fn sql_create_table_is_one_undo_step() {
/// Sorted `id` column values of table `T`. /// Sorted `id` column values of table `T`.
fn ids(db: &Database, r: &tokio::runtime::Runtime) -> Vec<Option<String>> { fn ids(db: &Database, r: &tokio::runtime::Runtime) -> Vec<Option<String>> {
let d = r let d = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query"); .expect("query");
let idx = d.columns.iter().position(|c| c == "id").expect("id column"); let idx = d.columns.iter().position(|c| c == "id").expect("id column");
let mut v: Vec<Option<String>> = d.rows.iter().map(|row| row[idx].clone()).collect(); let mut v: Vec<Option<String>> = d.rows.iter().map(|row| row[idx].clone()).collect();
@@ -801,7 +801,7 @@ fn dropping_a_column_a_table_check_references_fails_cleanly() {
// The table is intact: both columns survive (rollback) ... // The table is intact: both columns survive (rollback) ...
let desc = r let desc = r
.block_on(db.describe_table("T".to_string(), None)) .block_on(db.describe_table("T".to_string()))
.expect("describe still works"); .expect("describe still works");
assert_eq!( assert_eq!(
desc.columns.iter().map(|c| c.name.clone()).collect::<Vec<_>>(), desc.columns.iter().map(|c| c.name.clone()).collect::<Vec<_>>(),
@@ -925,14 +925,14 @@ fn foreign_key_creates_named_relationship_visible_in_describe() {
.expect("create child with FK"); .expect("create child with FK");
// The child has an outbound relationship; the parent an inbound one. // The child has an outbound relationship; the parent an inbound one.
let child = r.block_on(db.describe_table("child".to_string(), None)).expect("describe child"); let child = r.block_on(db.describe_table("child".to_string())).expect("describe child");
assert_eq!(child.outbound_relationships.len(), 1, "child references parent"); assert_eq!(child.outbound_relationships.len(), 1, "child references parent");
let rel = &child.outbound_relationships[0]; let rel = &child.outbound_relationships[0];
assert_eq!(rel.name, "parent_id_to_child_pid", "auto-named per ADR-0013"); assert_eq!(rel.name, "parent_id_to_child_pid", "auto-named per ADR-0013");
assert_eq!(rel.other_table, "parent"); assert_eq!(rel.other_table, "parent");
assert_eq!(rel.local_columns, vec!["pid".to_string()]); assert_eq!(rel.local_columns, vec!["pid".to_string()]);
let parent = r.block_on(db.describe_table("parent".to_string(), None)).expect("describe parent"); let parent = r.block_on(db.describe_table("parent".to_string())).expect("describe parent");
assert_eq!(parent.inbound_relationships.len(), 1, "parent is referenced by child"); assert_eq!(parent.inbound_relationships.len(), 1, "parent is referenced by child");
} }
@@ -954,7 +954,7 @@ fn explicit_constraint_name_is_used() {
Some("create table child (id serial primary key, pid int, constraint child_to_parent foreign key (pid) references parent(id))".to_string()), Some("create table child (id serial primary key, pid int, constraint child_to_parent foreign key (pid) references parent(id))".to_string()),
)) ))
.expect("create child with named FK"); .expect("create child with named FK");
let child = r.block_on(db.describe_table("child".to_string(), None)).expect("describe"); let child = r.block_on(db.describe_table("child".to_string())).expect("describe");
assert_eq!(child.outbound_relationships[0].name, "child_to_parent"); assert_eq!(child.outbound_relationships[0].name, "child_to_parent");
} }
@@ -974,7 +974,7 @@ fn bare_references_resolves_to_parent_single_column_pk() {
Some("create table child (id serial primary key, pid int references parent)".to_string()), Some("create table child (id serial primary key, pid int references parent)".to_string()),
)) ))
.expect("create child with bare REFERENCES"); .expect("create child with bare REFERENCES");
let child = r.block_on(db.describe_table("child".to_string(), None)).expect("describe"); let child = r.block_on(db.describe_table("child".to_string())).expect("describe");
assert_eq!(child.outbound_relationships[0].other_columns, vec!["id".to_string()], "resolved to parent PK"); assert_eq!(child.outbound_relationships[0].other_columns, vec!["id".to_string()], "resolved to parent PK");
} }
@@ -1108,7 +1108,7 @@ fn create_table_with_fk_is_one_undo_step() {
// parent (now un-referenced) can be described without a dangling rel. // parent (now un-referenced) can be described without a dangling rel.
r.block_on(db.undo()).expect("undo").expect("a step was undone"); r.block_on(db.undo()).expect("undo").expect("a step was undone");
assert!(!r.block_on(db.list_tables()).unwrap().contains(&"child".to_string())); assert!(!r.block_on(db.list_tables()).unwrap().contains(&"child".to_string()));
let parent = r.block_on(db.describe_table("parent".to_string(), None)).expect("describe parent"); let parent = r.block_on(db.describe_table("parent".to_string())).expect("describe parent");
assert!(parent.inbound_relationships.is_empty(), "the relationship was undone with the table"); assert!(parent.inbound_relationships.is_empty(), "the relationship was undone with the table");
} }
@@ -1152,7 +1152,7 @@ fn foreign_key_on_delete_cascade_takes_effect() {
)) ))
.expect("delete parent"); .expect("delete parent");
let child_rows = r let child_rows = r
.block_on(db.query_data("child".to_string(), None, None, None)) .block_on(db.query_data("child".to_string(), None, None))
.expect("query child"); .expect("query child");
assert!(child_rows.rows.is_empty(), "ON DELETE CASCADE removed the child row"); assert!(child_rows.rows.is_empty(), "ON DELETE CASCADE removed the child row");
} }
@@ -1232,7 +1232,7 @@ fn fk_survives_a_rebuild_triggering_column_add() {
.expect("add column via rebuild"); .expect("add column via rebuild");
// The relationship still exists after the rebuild. // The relationship still exists after the rebuild.
let child = r.block_on(db.describe_table("child".to_string(), None)).expect("describe"); let child = r.block_on(db.describe_table("child".to_string())).expect("describe");
assert_eq!(child.outbound_relationships.len(), 1, "FK survived the column-add rebuild"); assert_eq!(child.outbound_relationships.len(), 1, "FK survived the column-add rebuild");
// And the engine still enforces it (now and after a fresh rebuild). // And the engine still enforces it (now and after a fresh rebuild).
insert_parent_row(&db, &r); insert_parent_row(&db, &r);
@@ -1275,7 +1275,7 @@ fn fk_referential_actions_survive_rebuild() {
)) ))
.expect("create"); .expect("create");
r.block_on(db.rebuild_from_text(p.path().to_path_buf(), None)).expect("rebuild"); r.block_on(db.rebuild_from_text(p.path().to_path_buf(), None)).expect("rebuild");
let child = r.block_on(db.describe_table("child".to_string(), None)).expect("describe"); let child = r.block_on(db.describe_table("child".to_string())).expect("describe");
let rel = &child.outbound_relationships[0]; let rel = &child.outbound_relationships[0];
assert_eq!(rel.on_delete, ReferentialAction::Cascade, "ON DELETE survived rebuild"); assert_eq!(rel.on_delete, ReferentialAction::Cascade, "ON DELETE survived rebuild");
assert_eq!(rel.on_update, ReferentialAction::SetNull, "ON UPDATE survived rebuild"); assert_eq!(rel.on_update, ReferentialAction::SetNull, "ON UPDATE survived rebuild");
@@ -1299,7 +1299,7 @@ fn dropping_the_child_clears_the_fk_relationship() {
.expect("create"); .expect("create");
r.block_on(db.drop_table("child".to_string(), Some("drop table child".to_string()))) r.block_on(db.drop_table("child".to_string(), Some("drop table child".to_string())))
.expect("drop child"); .expect("drop child");
let parent = r.block_on(db.describe_table("parent".to_string(), None)).expect("describe parent"); let parent = r.block_on(db.describe_table("parent".to_string())).expect("describe parent");
assert!(parent.inbound_relationships.is_empty(), "dropping the child cleared the relationship"); assert!(parent.inbound_relationships.is_empty(), "dropping the child cleared the relationship");
} }
@@ -1341,7 +1341,7 @@ fn bare_self_reference_resolves_to_own_pk() {
Some("create table emp (id int primary key, mgr int references emp)".to_string()), Some("create table emp (id int primary key, mgr int references emp)".to_string()),
)) ))
.expect("create self-referential emp with a bare reference"); .expect("create self-referential emp with a bare reference");
let emp = r.block_on(db.describe_table("emp".to_string(), None)).expect("describe"); let emp = r.block_on(db.describe_table("emp".to_string())).expect("describe");
assert_eq!(emp.outbound_relationships[0].other_columns, vec!["id".to_string()], "bare self-ref resolved to own PK"); assert_eq!(emp.outbound_relationships[0].other_columns, vec!["id".to_string()], "bare self-ref resolved to own PK");
// Enforced: a non-existent manager is rejected. // Enforced: a non-existent manager is rejected.
r.block_on(db.insert( r.block_on(db.insert(
+4 -4
View File
@@ -154,7 +154,7 @@ fn delete_without_where_runs_across_all_rows() {
let csv = read_csv(&project, "t").unwrap_or_default(); let csv = read_csv(&project, "t").unwrap_or_default();
assert!(!csv.contains('a') && !csv.contains('b') && !csv.contains('c'), "no rows left: {csv:?}"); assert!(!csv.contains('a') && !csv.contains('b') && !csv.contains('c'), "no rows left: {csv:?}");
let remaining = rt let remaining = rt
.block_on(db.query_data("t".to_string(), None, None, None)) .block_on(db.query_data("t".to_string(), None, None))
.expect("query t"); .expect("query t");
assert!(remaining.rows.is_empty(), "table empty after unfiltered delete"); assert!(remaining.rows.is_empty(), "table empty after unfiltered delete");
} }
@@ -302,8 +302,8 @@ fn cascade_to_two_children_reports_both() {
assert_eq!(by_child.get("Orders"), Some(&2), "two orders cascaded"); assert_eq!(by_child.get("Orders"), Some(&2), "two orders cascaded");
assert_eq!(by_child.get("Reviews"), Some(&1), "one review cascaded"); assert_eq!(by_child.get("Reviews"), Some(&1), "one review cascaded");
// Both child CSVs re-persisted to the post-cascade (empty) state. // Both child CSVs re-persisted to the post-cascade (empty) state.
let orders = rt.block_on(db.query_data("Orders".to_string(), None, None, None)).unwrap(); let orders = rt.block_on(db.query_data("Orders".to_string(), None, None)).unwrap();
let reviews = rt.block_on(db.query_data("Reviews".to_string(), None, None, None)).unwrap(); let reviews = rt.block_on(db.query_data("Reviews".to_string(), None, None)).unwrap();
assert!(orders.rows.is_empty() && reviews.rows.is_empty(), "both children emptied"); assert!(orders.rows.is_empty() && reviews.rows.is_empty(), "both children emptied");
let _ = &project; let _ = &project;
} }
@@ -361,7 +361,7 @@ fn delete_violating_fk_fails_and_persists_nothing() {
let result = run_delete(&db, &rt, input); let result = run_delete(&db, &rt, input);
assert!(result.is_err(), "delete of a referenced parent must be rejected"); assert!(result.is_err(), "delete of a referenced parent must be rejected");
// Rolled back: Alice survives. // Rolled back: Alice survives.
let customers = rt.block_on(db.query_data("Customers".to_string(), None, None, None)).unwrap(); let customers = rt.block_on(db.query_data("Customers".to_string(), None, None)).unwrap();
assert_eq!(customers.rows.len(), 1, "parent row preserved after rejected delete"); assert_eq!(customers.rows.len(), 1, "parent row preserved after rejected delete");
// No history line for the failed statement (written only on success). // No history line for the failed statement (written only on success).
let history = std::fs::read_to_string(project.path().join("history.log")).unwrap_or_default(); let history = std::fs::read_to_string(project.path().join("history.log")).unwrap_or_default();
+1 -1
View File
@@ -149,7 +149,7 @@ fn seed(db: &Database, rt: &tokio::runtime::Runtime, sql: &str) {
} }
fn query(db: &Database, rt: &tokio::runtime::Runtime, table: &str) -> Vec<Vec<Option<String>>> { fn query(db: &Database, rt: &tokio::runtime::Runtime, table: &str) -> Vec<Vec<Option<String>>> {
rt.block_on(db.query_data(table.to_string(), None, None, None)) rt.block_on(db.query_data(table.to_string(), None, None))
.unwrap_or_else(|e| panic!("query_data {table}: {e:?}")) .unwrap_or_else(|e| panic!("query_data {table}: {e:?}"))
.rows .rows
} }
+1 -1
View File
@@ -55,7 +55,7 @@ fn make_t_with_index(db: &Database, r: &tokio::runtime::Runtime) -> String {
} }
fn index_names(db: &Database, r: &tokio::runtime::Runtime) -> Vec<String> { fn index_names(db: &Database, r: &tokio::runtime::Runtime) -> Vec<String> {
r.block_on(db.describe_table("T".to_string(), None)) r.block_on(db.describe_table("T".to_string()))
.expect("describe") .expect("describe")
.indexes .indexes
.into_iter() .into_iter()
+1 -1
View File
@@ -150,7 +150,7 @@ fn drop_table_is_one_undo_step_and_restores_data() {
assert!(r.block_on(db.undo()).expect("undo").is_some(), "the drop was one undo step"); assert!(r.block_on(db.undo()).expect("undo").is_some(), "the drop was one undo step");
assert!(r.block_on(db.list_tables()).unwrap().contains(&"T".to_string())); assert!(r.block_on(db.list_tables()).unwrap().contains(&"T".to_string()));
let data = r let data = r
.block_on(db.query_data("T".to_string(), None, None, None)) .block_on(db.query_data("T".to_string(), None, None))
.expect("query"); .expect("query");
assert_eq!(data.rows.len(), 1, "the dropped row was restored by undo"); assert_eq!(data.rows.len(), 1, "the dropped row was restored by undo");
} }
+10 -16
View File
@@ -215,7 +215,7 @@ fn decimal_aggregation_display_trims_ieee754_noise() {
// The reported case: the aggregate no longer leaks float noise. // The reported case: the aggregate no longer leaks float noise.
let agg = rt let agg = rt
.block_on(db.run_select("select sum(price * qty) from Products".to_string(), None)) .block_on(db.run_select("select sum(price * qty) from Products".to_string()))
.expect("aggregate select"); .expect("aggregate select");
assert_eq!( assert_eq!(
agg.rows[0][0].as_deref(), agg.rows[0][0].as_deref(),
@@ -226,7 +226,7 @@ fn decimal_aggregation_display_trims_ieee754_noise() {
// Raw decimal column is still exact — TEXT storage preserves // Raw decimal column is still exact — TEXT storage preserves
// the input string verbatim, including the trailing zero. // the input string verbatim, including the trailing zero.
let raw = rt let raw = rt
.block_on(db.run_select("select price from Products".to_string(), None)) .block_on(db.run_select("select price from Products".to_string()))
.expect("raw decimal select"); .expect("raw decimal select");
let prices: Vec<&str> = raw.rows.iter().map(|r| r[0].as_deref().unwrap()).collect(); let prices: Vec<&str> = raw.rows.iter().map(|r| r[0].as_deref().unwrap()).collect();
assert_eq!( assert_eq!(
@@ -240,10 +240,7 @@ fn decimal_aggregation_display_trims_ieee754_noise() {
fn database_run_select_constant_returns_a_single_row() { fn database_run_select_constant_returns_a_single_row() {
let (_p, db, _dir) = open_project_db(); let (_p, db, _dir) = open_project_db();
let data = rt() let data = rt()
.block_on(db.run_select( .block_on(db.run_select("select 1".to_string()))
"select 1".to_string(),
Some("select 1".to_string()),
))
.expect("`select 1` runs clean"); .expect("`select 1` runs clean");
assert_eq!(data.rows.len(), 1, "one result row"); assert_eq!(data.rows.len(), 1, "one result row");
assert_eq!(data.rows[0].len(), 1, "one column"); assert_eq!(data.rows[0].len(), 1, "one column");
@@ -288,7 +285,7 @@ fn database_run_select_from_user_table_returns_inserted_rows() {
.expect("insert row"); .expect("insert row");
}); });
let data = rt let data = rt
.block_on(db.run_select("select Name from T".to_string(), None)) .block_on(db.run_select("select Name from T".to_string()))
.expect("SELECT runs"); .expect("SELECT runs");
assert_eq!(data.rows.len(), 1); assert_eq!(data.rows.len(), 1);
assert_eq!(data.rows[0][0].as_deref(), Some("Ada")); assert_eq!(data.rows[0][0].as_deref(), Some("Ada"));
@@ -336,7 +333,7 @@ fn database_run_select_recovers_bool_column_type() {
.expect("insert row"); .expect("insert row");
}); });
let data = rt let data = rt
.block_on(db.run_select("select Active from Products".to_string(), None)) .block_on(db.run_select("select Active from Products".to_string()))
.expect("SELECT runs"); .expect("SELECT runs");
assert_eq!(data.rows.len(), 2); assert_eq!(data.rows.len(), 2);
assert_eq!(data.column_types, vec![Some(Type::Bool)]); assert_eq!(data.column_types, vec![Some(Type::Bool)]);
@@ -374,7 +371,7 @@ fn database_run_select_recovers_text_type_through_alias() {
// playground type is recovered. // playground type is recovered.
let data = rt let data = rt
.block_on( .block_on(
db.run_select("select Name as n from Users".to_string(), None), db.run_select("select Name as n from Users".to_string()),
) )
.expect("SELECT runs"); .expect("SELECT runs");
assert_eq!(data.columns, vec!["n".to_string()]); assert_eq!(data.columns, vec!["n".to_string()]);
@@ -402,7 +399,7 @@ fn database_run_select_computed_expression_stays_typeless() {
.expect("insert"); .expect("insert");
}); });
let data = rt let data = rt
.block_on(db.run_select("select Score + 1 from T".to_string(), None)) .block_on(db.run_select("select Score + 1 from T".to_string()))
.expect("SELECT runs"); .expect("SELECT runs");
assert_eq!(data.column_types, vec![None]); assert_eq!(data.column_types, vec![None]);
} }
@@ -439,7 +436,6 @@ fn engine_aggregate_in_where_routes_through_catalog() {
let err = rt let err = rt
.block_on(db.run_select( .block_on(db.run_select(
"select id from T where count(score) > 0".to_string(), "select id from T where count(score) > 0".to_string(),
None,
)) ))
.expect_err("engine should reject aggregate in WHERE"); .expect_err("engine should reject aggregate in WHERE");
let DbError::Sqlite { .. } = &err else { let DbError::Sqlite { .. } = &err else {
@@ -512,7 +508,6 @@ fn engine_group_by_missing_routes_through_catalog() {
let _ = rt let _ = rt
.block_on(db.run_select( .block_on(db.run_select(
"select category, count(*) from T group by category".to_string(), "select category, count(*) from T group by category".to_string(),
None,
)) ))
.expect("benign GROUP BY query runs"); .expect("benign GROUP BY query runs");
// Direct unit test on the matcher: ensure a message that // Direct unit test on the matcher: ensure a message that
@@ -574,7 +569,6 @@ fn engine_scalar_subquery_too_many_rows_routes_through_catalog() {
let _ = rt let _ = rt
.block_on(db.run_select( .block_on(db.run_select(
"select (select v from T) from T".to_string(), "select (select v from T) from T".to_string(),
None,
)) ))
.expect("benign scalar subquery query runs"); .expect("benign scalar subquery query runs");
let synthetic = DbError::Sqlite { let synthetic = DbError::Sqlite {
@@ -624,13 +618,13 @@ fn database_run_select_type_recovery_works_on_empty_table() {
}); });
// No INSERT — the table is empty. // No INSERT — the table is empty.
let data_text = rt let data_text = rt
.block_on(db.run_select("select col_text from Empty".to_string(), None)) .block_on(db.run_select("select col_text from Empty".to_string()))
.expect("SELECT runs even on empty table"); .expect("SELECT runs even on empty table");
assert!(data_text.rows.is_empty()); assert!(data_text.rows.is_empty());
assert_eq!(data_text.column_types, vec![Some(Type::Text)]); assert_eq!(data_text.column_types, vec![Some(Type::Text)]);
let data_blob = rt let data_blob = rt
.block_on(db.run_select("select col_blob from Empty".to_string(), None)) .block_on(db.run_select("select col_blob from Empty".to_string()))
.expect("SELECT runs even on empty table"); .expect("SELECT runs even on empty table");
assert!(data_blob.rows.is_empty()); assert!(data_blob.rows.is_empty());
assert_eq!( assert_eq!(
@@ -723,7 +717,7 @@ fn database_run_select_recovers_all_ten_playground_types() {
for (col, expected_type) in cases { for (col, expected_type) in cases {
let sql = format!("select {col} from AllTypes"); let sql = format!("select {col} from AllTypes");
let data = rt let data = rt
.block_on(db.run_select(sql.clone(), None)) .block_on(db.run_select(sql.clone()))
.expect("SELECT runs"); .expect("SELECT runs");
assert_eq!( assert_eq!(
data.column_types, data.column_types,
+1 -1
View File
@@ -501,7 +501,7 @@ fn update_all_rows_flag_in_advanced_updates_every_row() {
"the --all-rows update replays through the DSL fall-back; events: {events:?}" "the --all-rows update replays through the DSL fall-back; events: {events:?}"
); );
let rows = rt let rows = rt
.block_on(db.query_data("t".to_string(), None, None, None)) .block_on(db.query_data("t".to_string(), None, None))
.expect("query") .expect("query")
.rows; .rows;
assert_eq!(rows.len(), 2, "both rows present"); assert_eq!(rows.len(), 2, "both rows present");
+3 -3
View File
@@ -63,7 +63,7 @@ async fn insert_named(db: &Database, name: &str) {
} }
async fn row_count(db: &Database) -> usize { async fn row_count(db: &Database) -> usize {
db.query_data("Customers".to_string(), None, None, None) db.query_data("Customers".to_string(), None, None)
.await .await
.unwrap() .unwrap()
.rows .rows
@@ -306,7 +306,7 @@ async fn sql_delete(db: &Database, input: &str) {
} }
async fn count_t(db: &Database) -> usize { async fn count_t(db: &Database) -> usize {
db.query_data("T".to_string(), None, None, None) db.query_data("T".to_string(), None, None)
.await .await
.unwrap() .unwrap()
.rows .rows
@@ -378,7 +378,7 @@ fn undo_restores_db_and_csv_consistently() {
// Both the database read model and the on-disk CSV are // Both the database read model and the on-disk CSV are
// restored — the (db, csv) pair stays consistent. // restored — the (db, csv) pair stays consistent.
assert_eq!( assert_eq!(
db.query_data("T".to_string(), None, None, None) db.query_data("T".to_string(), None, None)
.await .await
.unwrap() .unwrap()
.rows .rows
+1
View File
@@ -250,6 +250,7 @@ fn command_kind_label(cmd: &rdbms_playground::dsl::Command) -> String {
App(app) => match app { App(app) => match app {
AppCommand::Quit => "App(Quit)".into(), AppCommand::Quit => "App(Quit)".into(),
AppCommand::Help { .. } => "App(Help)".into(), AppCommand::Help { .. } => "App(Help)".into(),
AppCommand::Hint => "App(Hint)".into(),
AppCommand::Rebuild => "App(Rebuild)".into(), AppCommand::Rebuild => "App(Rebuild)".into(),
AppCommand::Save => "App(Save)".into(), AppCommand::Save => "App(Save)".into(),
AppCommand::SaveAs => "App(SaveAs)".into(), AppCommand::SaveAs => "App(SaveAs)".into(),
+21
View File
@@ -0,0 +1,21 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
+4
View File
@@ -0,0 +1,4 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}
+11
View File
@@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}
+49
View File
@@ -0,0 +1,49 @@
# Starlight Starter Kit: Basics
[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)
```
pnpm create astro@latest -- --template starlight
```
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files:
```
.
├── public/
├── src/
│ ├── assets/
│ ├── content/
│ │ └── docs/
│ └── content.config.ts
├── astro.config.mjs
├── package.json
└── tsconfig.json
```
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.
Images can be added to `src/assets/` and embedded in Markdown with a relative link.
Static assets, like favicons, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `pnpm install` | Installs dependencies |
| `pnpm dev` | Starts local dev server at `localhost:4321` |
| `pnpm build` | Build your production site to `./dist/` |
| `pnpm preview` | Preview your build locally, before deploying |
| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` |
| `pnpm astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [Starlights docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).
+254
View File
@@ -0,0 +1,254 @@
# Documentation style guide (living)
This is the **living** home for documentation authoring conventions for the
RDBMS Playground website. It grows as we write.
- **Binding rules** come from
[ADR-website-001 §7](../docs/website/adr/20260604-adr-website-001.md);
this guide must not contradict them. If a convention is significant,
durable, or contested, it is decided in an **ADR** (new or amended), and
this guide references it. Finer, settled conventions live here directly.
- **Open decisions** (not yet settled) are tracked at the bottom so we
decide them deliberately rather than re-deciding per page. When one
settles, move it up into the body (and to an ADR if it's significant).
Status tags used below: **[DECIDED]** (binding or settled) ·
**[OPEN]** (to be decided — see the log).
---
## Terminology & wording [DECIDED — ADR-website-001 §7]
- **No "DSL".** It is internal jargon. Use **simple mode** (the playground's
keyword command language) and **advanced mode** (SQL).
- **No engine name.** Never name SQLite / STRICT / rusqlite / PRAGMA in
user-facing copy. Say **"the database"** or **"the engine"**. (Continues
the user-facing posture of ADR-0002.)
- Preferred terms (extend as we go): "command", "project", "table",
"column", "relationship" (the user-facing word for a declared foreign-key
link), "constraint", "index".
- Add new banned/preferred terms here as they come up, with a one-line
reason.
## Voice & tone [DECIDED, refine as needed]
- **Teaching-first.** Pedagogy wins ties (CLAUDE.md). Explain the *why*, not
just the *how*; the audience spans beginners through learners ready for
raw SQL.
- Second person ("you"), present tense. Imperative mood for step
instructions ("Create a table…").
- Prefer short sentences and concrete examples over abstract prose.
## Structure [DECIDED]
Pragmatic, Diátaxis-influenced split (five top-level sidebar sections,
autogenerated per directory under `src/content/docs/`):
- **Getting started** — install, first project, simple vs. advanced, the
example database.
- **Using the playground***the application you drive*, kept distinct from
the database-language Reference: command-line options, the assistive editor
(completion / highlighting / `[ERR]`/`[WRN]` indicator / hints / in-line
editing), the output pane (scrolling), projects (save/load/new/rebuild),
undo & history, export & import, clipboard, getting help. (ADR-0003's
"app-level commands" + ADR-0022/0027 typing assistance + the CLI.)
- **Guides** — task-oriented how-tos. *These are the most important didactic
content and will be iterated for teaching quality before publication.*
- **Reference** — the exhaustive command/SQL/type surface. **Page
granularity: one page per topic / command-family** (Tables, Columns,
Relationships, Indexes, Constraints, Inserting & editing data, Querying,
Types, …), each covering the simple-mode and advanced-mode forms where
both apply. Hand-written now (the command surface is settled bar H1a
output); small post-release adjustments are expected and fine.
- **Concepts** — the "why": projects & storage, undo & history, etc.
Ground every reference page in source — `parse.usage.*` and `help.*` in
`src/friendly/strings/en-US.yaml`, `src/dsl/command.rs`, `src/dsl/types.rs`
— never paraphrase grammar from memory.
## "Planned / not yet available" callouts [DECIDED — ADR-website-001 §7]
Any capability that is not yet fully implemented is **omitted** or carries a
clear callout — never presented as shipped. Standard form: a Starlight aside
```md
:::caution[Planned]
This is planned and not yet available.
:::
```
## Examples & code [DECIDED]
- **Shared example database: a small library**`authors`, `books`,
`members`, `loans` (see the canonical schema below). Reuse it across all
pages so readers build familiarity; it models 1:n (an author has many
books) and m:n (books ↔ members, through loans).
- Where both modes apply, show the **simple-mode** form and its
**advanced-mode (SQL)** equivalent — the in-app teaching echo already
pairs these, so docs mirror it.
- Prefer **worked examples** (a real command on the library schema) over
abstract prose, and **always cross-link** the related reference/guide
pages (use stubs so links resolve before a page is written).
- Code blocks for exact input/output; reserve casts for motion/flow.
### Code-block fences
- **Simple-mode commands → ` ```rdbms `** — custom highlight grammar in
`src/grammars/rdbms.mjs`, registered with Expressive Code in
`astro.config.mjs` (keywords + types coloured).
- **Advanced-mode SQL → ` ```sql `**; shell / install → ` ```sh `.
- A decorative `> ` prompt is prepended to `rdbms` lines via CSS
(`src/styles/global.css`) — **do not type `>` in the fence**. It is
copy-safe (Expressive Code's copy button uses `data-code`) and
`user-select:none`.
- **One command per line** in an `rdbms` block; a multi-line single
statement (e.g. advanced `CREATE TABLE`) belongs in a ` ```sql ` block,
where no prompt is added.
- **Command output → a plain unlabelled ` ``` ` fence** placed immediately
after the command block (no language, so no `> ` prompt and no
highlighting). Output must be **captured from the real app**, never
hand-drawn — box-drawing diagrams, query-plan trees, and data tables are
copied verbatim (trailing padding spaces trimmed). The capture method: a
throwaway in-crate test that builds the canonical library schema and prints
the rendered output (`render_structure_with_diagrams`,
`render_relationship_diagram`, `render_data_table`, `render_explain_plan`,
`show_list`), removed once the output is pasted. Colour is lost in a static
block (the structure still reads); the coloured/animated rendering is
earmarked for casts.
### Canonical library schema (source of truth for examples)
Use these exact names/types in every example:
| Table | Columns (playground types) |
|-----------|---------------------------------------------------------------------------------------------|
| `authors` | `author_id` serial (pk) · `name` text (not null) · `birth_year` int |
| `books` | `book_id` serial (pk) · `title` text (not null) · `author_id` int (→ authors) · `published` int · `isbn` text (unique) |
| `members` | `member_id` serial (pk) · `name` text (not null) · `joined` date |
| `loans` | `loan_id` serial (pk) · `book_id` int (→ books) · `member_id` int (→ members) · `loaned_on` date · `returned_on` date |
Relationships: `books.author_id → authors.author_id` (1:n); `loans` joins
`books` and `members` (the m:n bridge). Show `shortid` on the Types page via
a small standalone example, not by complicating this schema.
## asciinema casts [DECIDED]
- Casts show *flow/motion*; static code blocks show *exact input/output*.
Prefer a code block when a still example suffices.
- Pair a hero/landing cast with a text transcript or the equivalent docs
snippet (accessibility + SEO).
### Where to use a cast [DECIDED 2026-06-10; stance revised 2026-06-12]
**Default to a cast; justify its _absence_, not its presence.** A cast at the
top of a page gives the reader the *shape* of what the page describes —
quickly and visually — with the detailed text below for when they need it. It
earns its place two ways, both observed in real use: it helps **visual
learners** grasp a flow at a glance, and it gives **advanced learners a fast
entry point and overview** — skim the motion, then drop into the prose only
where needed. So the question for each page is not "does this deserve a cast?"
but "is there a good reason *not* to have one?"
This is **not** a mandate for a cast on every page, still less several per
page: a page wants a cast only where the app *does something* worth seeing, and
one well-chosen cast is almost always enough. Concretely:
- **Expect a cast** on any page where the app *does or shows* something: the
landing, **Getting started**, **Using the playground**, **Guides**, and the
**Reference** command pages (a command being run, a diagram drawn, a query
plan or a table of generated rows appearing).
- **Justify the absence** on the rest — pure-lookup or conceptual pages with
nothing to animate (e.g. the Types table, prose Concepts pages). "Nothing
moves here" is a fine reason to record on; "I didn't think about it" is not.
- Reference pages keep their **captured static output** regardless; a cast
complements it, never replaces it.
- A cast is **selective**: it shows a chosen, representative slice of what the
page documents — it need not exercise every command on the page.
- **Autoplay only the landing hero**; elsewhere casts are click-to-play (a
poster frame) so they don't all clamor at once. All casts re-record in one
`pnpm casts` run, so breadth stays maintainable.
### Cast pacing & clarity [DECIDED 2026-06-11]
- **Give the viewer a beat before a command is submitted.** A command that is
typed and `Enter`-ed in the same instant vanishes before the viewer can read
it. Type, **pause**, then submit — especially for **modal confirmations**
(e.g. the `save as` name prompt) and short commands (`new`): script the text
and the `Enter` as *separate* steps with a pause between (`{ type: 'x',
enter: false, after: … }` then `{ key: 'Enter', after: … }`).
- **Surface state where the schema sidebar would.** At the cast width (90 cols)
the schema sidebar is hidden (ADR-0046 hides it at ≤90 cols), so the viewer
can't see tables/relationships appear and disappear. Insert `show tables` /
`show table <T>` / `show data <T>` at the points where state **changes**, so
a sequence reads clearly (e.g. the projects cast shows `show tables` before
saving, after `new`, and after loading — table present → none → present).
- **Driver: `autocast`** (ADR-website-001 §2; chosen by the 2026-06-10
spike). `autocast`'s `!Interactive` feeds keys to the running TUI and
captures the redraw — the correct model for a full-screen crossterm app.
`asciinema-automation` was rejected: it assumes *shell* semantics (Enter as
`\n`, and an `expect()` echo-check per keystroke), which a redrawing TUI
breaks — it produced a garbled cast.
- **Authoring workflow.** Source command-lists live in `casts-src/casts.mjs`
(human-readable steps: `type` / `wait` / `key`). `pnpm casts` runs
`casts-src/generate.mjs`, which expands them to autocast YAML (one key per
character; Enter = `^M`) and records to `public/casts/<name>.cast`. The
command-lists are the durable source; **`.cast` files are regenerable** —
re-run `pnpm casts` to re-record as the app evolves (a final sweep is due
once the app is locked). Needs a `cargo build` binary at `../target/debug`.
- **Embedding.** `Demo.astro` (the WASM-swap seam, ADR-website-001 §3) wraps
`Cast.astro` (asciinema-player island). Call sites use `Demo`.
- **Conventions.** Terminal geometry per cast (default 90×26); file name =
cast `name`; player theme `asciinema`. **Cast theme — fixed dark for launch
(DECIDED 2026-06-11).** Casts bake the app's dark theme into the recording as
RGB SGR codes, so the player theme can't recolour them; true light/dark would
require recording light-theme cast variants and swapping via the `Demo` seam.
Deferred as not worth the doubled asset/recording cost for launch; revisit
with the eventual full re-record.
## Formatting [DECIDED, refine]
- Starlight asides for notes/tips/cautions; tables for reference matrices
(types, constraints, referential actions).
- Keyboard keys rendered consistently (e.g. <kbd>Ctrl</kbd>+<kbd>Z</kbd>).
- Cross-link related pages; never expose ADR numbers or internal jargon to
the reader (ADRs are for us, not the docs audience).
---
## Open decisions log
Decide these as we write; record the outcome (and escalate to an ADR if
significant).
**Resolved (2026-06-10):**
9. ~~Cast scripting toolchain~~**`autocast`**, proven by spike over
`asciinema-automation` (which can't drive a full-screen TUI). Source
command-lists in `casts-src/`, `pnpm casts` to record. See the *asciinema
casts* section above. (Remaining sub-item: light/dark player theme sync —
folded into #8 / Phase B.)
**Resolved (2026-06-05):**
1. ~~Depth / organising spine~~**Pragmatic** four-section split (see
Structure above).
2. ~~Page granularity~~**one page per topic / command-family**, both
modes per page (see Structure).
3. ~~Standard example dataset~~**the library** (schema above).
4. ~~Simple-vs-advanced pairing~~**show both where both apply** (see
Examples).
5. ~~"Planned" callout~~ → standard `:::caution[Planned]` aside (see above).
6. ~~Reference generation vs hand-writing~~**hand-write now** (command
surface is settled bar H1a output; small later adjustments expected).
**Resolved (2026-06-11):**
7. ~~Versioning~~**single-version for launch.** No version selector; one can
be added at/after v1 if the docs ever need to diverge by version.
Cast light/dark → **fixed dark for launch** (see *asciinema casts* above).
`site` set to **`https://relplay.org`** (apex) — enables sitemap, canonical,
and Open Graph URL resolution; a `www` host, if used, 301-redirects to apex.
**Still open:**
8. **SEO/meta — remaining.** Per-page titles/descriptions are set; canonical +
basic Open Graph (`og:title`/`og:url`) now auto-generate from `site`. What
remains: **Open Graph social-card images** (`og:image`) — needs a card
design, so it travels with the branding work (logo + palette, TBD with the
user; the existing favicon is *not* a brand guideline).
+81
View File
@@ -0,0 +1,81 @@
// @ts-check
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import tailwindcss from '@tailwindcss/vite';
// Custom highlight grammar for the playground's simple-mode command language
// (advanced-mode examples use the built-in `sql` grammar). Fence with ```rdbms.
import rdbmsLang, { rdbmsSyntax } from './src/grammars/rdbms.mjs';
// https://astro.build/config
export default defineConfig({
// Production origin (apex domain). Enables the sitemap, canonical URLs, and
// Open Graph `og:url`/`og:image` resolution. A `www` host, if used, should
// 301-redirect here so a single canonical origin is advertised. Local dev is
// unaffected — this only changes *generated absolute* URLs, not where the
// dev/preview server binds.
site: 'https://relplay.org',
// Bind the dev/preview server to IPv4 loopback. Astro/Vite's default
// `localhost` bind resolves to IPv6 `::1` here, which breaks SSH
// `-L 4321:127.0.0.1:4321` tunnels (they target IPv4). Pinning 127.0.0.1
// keeps loopback-only access and makes tunnelling unambiguous.
server: { host: '127.0.0.1' },
integrations: [
starlight({
title: 'RDBMS Playground',
tagline: 'Learn relational databases by doing.',
// Header logo: a database-table glyph with a teal primary-key cell.
// Separate light/dark files so the outline adapts to the theme;
// `replacesTitle: false` keeps the "RDBMS Playground" wordmark beside it.
logo: {
light: './src/assets/relplay-logo-light.svg',
dark: './src/assets/relplay-logo-dark.svg',
replacesTitle: false,
},
// Footer override: Starlight's default footer + a small company/source line.
components: {
Footer: './src/components/Footer.astro',
},
// TODO(Phase B): a header social link to the repo is deliberately omitted
// — the source/issues link lives understated in the footer instead.
customCss: ['./src/styles/global.css'],
// Open Graph / Twitter social card. Starlight emits og:title/url/type
// from `site`, but not an image, so add a single site-wide card.
// Source: src/assets/og-card.svg → public/og-card.png (rasterise with
// sharp; see the SVG header for the one-liner). Absolute URL required
// by scrapers — derived from the `site` origin.
head: [
{ tag: 'meta', attrs: { property: 'og:image', content: 'https://relplay.org/og-card.png' } },
{ tag: 'meta', attrs: { property: 'og:image:width', content: '1200' } },
{ tag: 'meta', attrs: { property: 'og:image:height', content: '630' } },
{
tag: 'meta',
attrs: {
property: 'og:image:alt',
content: 'RDBMS Playground — learn relational databases by doing.',
},
},
{ tag: 'meta', attrs: { name: 'twitter:card', content: 'summary_large_image' } },
{ tag: 'meta', attrs: { name: 'twitter:image', content: 'https://relplay.org/og-card.png' } },
],
// Register the simple-mode command grammar with Expressive Code (Shiki).
expressiveCode: { shiki: { langs: [rdbmsLang, rdbmsSyntax] } },
// Pragmatic structure (ADR-website-001 §7 / website/STYLE.md): Getting
// started, Guides, Reference, Concepts. Autogenerated per directory;
// in-section order is controlled by each page's `sidebar.order`
// frontmatter.
sidebar: [
{ label: 'Getting started', items: [{ autogenerate: { directory: 'getting-started' } }] },
{ label: 'Using the playground', items: [{ autogenerate: { directory: 'using-the-playground' } }] },
{ label: 'Guides', items: [{ autogenerate: { directory: 'guides' } }] },
{ label: 'Reference', items: [{ autogenerate: { directory: 'reference' } }] },
{ label: 'Concepts', items: [{ autogenerate: { directory: 'concepts' } }] },
],
}),
],
vite: {
plugins: [tailwindcss()],
},
});
+318
View File
@@ -0,0 +1,318 @@
/**
* Cast source definitions the durable, human-readable source for the
* asciinema demos (ADR-website-001 §2). `pnpm casts` runs `generate.mjs`,
* which turns each definition into an autocast YAML and records it to
* `public/casts/<name>.cast`. Edit these and re-run to re-record as the app
* evolves; the `.cast` files are regenerable artifacts.
*
* Step kinds:
* { wait: ms } pause (shown in the recording)
* { type: 'text', after: ms } type the text + press Enter, then pause
* { type: 'text', enter: false } type without pressing Enter
* { key: 'Tab'|'Enter'|'CtrlC'|'CtrlO'|'Esc', after } press a single named key
* { caption: 'text', after: ms } pop a demo caption (ADR-0047) bottom-right,
* then hold it (it clears on the next key)
*
* Every cast must end by quitting the app so the driver returns to the shell
* prompt use `{ key: 'CtrlC' }` (Ctrl-C quit), NOT a typed `quit`: Ctrl-C
* is invisible, so the trim ends the cast on the last content frame instead of
* a dangling `quit`.
*/
/** The shared library narrative, trimmed per cast. */
export const casts = [
{
name: 'schema-sidebar',
title: 'Bring up the schema sidebar and step through tables and relationships',
width: 90,
height: 26,
typeSpeed: '45ms',
steps: [
{ wait: 1000 },
// A small two-table schema with one relationship, so both sidebar
// panels have something to show.
{ type: 'create table authors with pk author_id(serial)', after: 650 },
{ type: 'add column to authors: name (text)', after: 650 },
{ type: 'create table books with pk book_id(serial)', after: 650 },
{ type: 'add column to books: title (text)', after: 650 },
{ type: 'add column to books: author_id (int)', after: 700 },
{
type: 'add 1:n relationship as books_author from authors.author_id to books.author_id on delete cascade',
after: 1400,
},
// The sidebar is hidden at 90 cols; Ctrl-O reveals it and focuses the
// Tables panel (the [CTRL-O] badge shows the otherwise-invisible key).
{ key: 'CtrlO', after: 2600 },
// Ctrl-O again moves focus to the Relationships panel.
{ key: 'CtrlO', after: 2800 },
// Esc leaves navigation mode — the sidebar re-hides.
{ key: 'Esc', after: 1300 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'sql-echo',
title: 'Run simple-mode commands in advanced mode and watch the SQL they map to',
width: 90,
// Taller than the other casts (26): the m:n command's echo + the junction
// structure it prints are long, and at 26 rows the head of the `Executing
// SQL:` echo — the payoff — scrolled off the top. The extra rows all go to
// the output pane (the surrounding panels are fixed-height), keeping the
// whole echo visible. Stays < 40 so the compact 1-row-input layout holds.
height: 34,
typeSpeed: '45ms',
steps: [
{ wait: 1000 },
{ type: 'mode advanced', after: 1300 },
// Each simple-mode command, run in advanced mode, echoes the equivalent
// SQL beneath it (the ADR-0038 teaching echo).
{ type: 'create table books with pk', after: 1700 },
{ type: 'add column to books: title (text)', after: 1800 },
{ type: 'create table tags with pk', after: 1600 },
{ type: 'add column to tags: label (text)', after: 1900 },
// The crescendo: one m:n command expands to a whole junction table —
// split type + Enter so the command reads before the long echo lands.
{ type: 'create m:n relationship from books to tags', enter: false, after: 1700 },
{ key: 'Enter', after: 3200 },
{ caption: 'One command builds an entire junction table.', after: 3200 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'seed',
title: 'Fill a table with realistic, ready-to-query data in one command',
width: 90,
// Two seeds: a people table (`name` → real names, `joined` → recent dates)
// and a tickets table mixing a free-text column (`subject`), an
// auto-detected `priority` (a built-in low/medium/high set, #34), and a
// `status` pinned via `set status in (...)` to show the override clause.
height: 28,
typeSpeed: '45ms',
steps: [
{ wait: 1000 },
// A people table — seed reads the column names to choose what to make.
{ type: 'create table members with pk member_id(serial)', after: 650 },
{ type: 'add column to members: name (text)', after: 650 },
{ type: 'add column to members: joined (date)', after: 800 },
// The payoff: one line, eight believable rows. Split type + Enter so the
// command reads before the table lands.
{ type: 'seed members 8', enter: false, after: 1500 },
{ key: 'Enter', after: 2800 },
{ caption: 'One line fills a table with realistic, ready-to-query data.', after: 3000 },
// A second table: a free-text column (`subject`), an auto-detected one
// (`priority`), and `status` pinned to a value set with `set`.
{ type: 'create table tickets with pk ticket_id(serial)', after: 650 },
{ type: 'add column to tickets: subject (text)', after: 650 },
{ type: 'add column to tickets: status (text)', after: 650 },
{ type: 'add column to tickets: priority (text)', after: 800 },
// `subject` and `priority` are generated; `status` is pinned to a set.
{ type: "seed tickets 8 set status in ('open', 'pending', 'closed')", enter: false, after: 1600 },
{ key: 'Enter', after: 2800 },
{ caption: 'Generate most columns — and pin one to your own values with set.', after: 3000 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'projects',
title: 'Save a project, start fresh, then load it back',
width: 90,
height: 26,
typeSpeed: '45ms',
dataDir: true, // isolated data root → picker lists only this cast's projects
steps: [
{ wait: 1000 },
{ type: 'create table books with pk', after: 600 },
{ type: 'add column to books: title (text)', after: 700 },
{ type: "insert into books (title) values ('A Wizard of Earthsea')", after: 800 },
{ type: 'show tables', after: 2000 }, // the project has a "books" table
// save-as: type the name, PAUSE so the viewer reads it, then confirm.
{ type: 'save as', after: 1100 }, // opens the name prompt
{ type: 'library', enter: false, after: 1500 }, // type the name (no Enter yet)
{ key: 'Enter', after: 1600 }, // confirm → saved as "library"
// new: type it, pause, then run — so "new" registers before it executes.
{ type: 'new', enter: false, after: 1100 },
{ key: 'Enter', after: 1500 },
{ type: 'show tables', after: 2200 }, // fresh project — no tables
{ type: 'load', after: 1300 }, // opens the project picker
{ type: 'j', enter: false, after: 1100 }, // move the selection to "library"
{ key: 'Enter', after: 1800 }, // load it
{ type: 'show tables', after: 2200 }, // "books" is back
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'modes',
title: 'Simple mode, then advanced — with the SQL the playground runs for you',
width: 90,
height: 26,
typeSpeed: '45ms',
steps: [
{ wait: 1000 },
{ type: 'create table books with pk', after: 700 },
{ type: 'add column to books: title (text)', after: 800 },
{ type: "insert into books (title) values ('A Wizard of Earthsea')", after: 650 },
{ type: "insert into books (title) values ('Invisible Cities')", after: 1100 },
{ type: 'show data books', after: 1600 }, // simple mode — no SQL echo
// Split the mode switch (type → beat → submit) so the short, pivotal
// command reads before the screen changes.
{ type: 'mode advanced', enter: false, after: 1100 },
{ key: 'Enter', after: 1300 },
{ type: 'show data books', after: 2400 }, // advanced — shows "Executing SQL: …"
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'undo-redo',
title: 'Undo a change — then redo it — each with a confirmation',
width: 90,
height: 26,
typeSpeed: '45ms',
steps: [
{ wait: 1000 },
{ type: 'create table books with pk', after: 700 },
{ type: 'add column to books: title (text)', after: 800 },
{ type: "insert into books (title) values ('A Wizard of Earthsea')", after: 650 },
{ type: "insert into books (title) values ('Invisible Cities')", after: 1100 },
{ type: 'show data books', after: 1500 }, // two rows
// Split the short command from its submit so `undo` reads before the
// confirmation modal pops over it.
{ type: 'undo', enter: false, after: 1000 },
{ key: 'Enter', after: 1300 }, // submit → opens the confirmation modal
{ type: 'y', enter: false, after: 1600 }, // Y confirms
{ type: 'show data books', after: 1500 }, // one row
{ type: 'redo', enter: false, after: 1000 },
{ key: 'Enter', after: 1300 },
{ type: 'y', enter: false, after: 1600 },
{ type: 'show data books', after: 1700 }, // two rows again
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'joins',
title: 'Switch to advanced mode and join across tables',
width: 90,
height: 26,
typeSpeed: '42ms',
steps: [
{ wait: 900 },
// minimal two-table schema + a few rows to join
{ type: 'create table authors with pk author_id(serial)', after: 650 },
{ type: 'add column to authors: name (text)', after: 650 },
{ type: 'create table books with pk book_id(serial)', after: 650 },
{ type: 'add column to books: title (text)', after: 650 },
{ type: 'add column to books: author_id (int)', after: 800 },
{ type: "insert into authors (name) values ('Ursula K. Le Guin')", after: 600 },
{ type: "insert into authors (name) values ('Italo Calvino')", after: 700 },
{ type: "insert into books (title, author_id) values ('A Wizard of Earthsea', 1)", after: 600 },
{ type: "insert into books (title, author_id) values ('The Left Hand of Darkness', 1)", after: 600 },
{ type: "insert into books (title, author_id) values ('Invisible Cities', 2)", after: 900 },
// Surface the two source tables before joining them — at 90 cols the
// schema sidebar is hidden, so this is how the viewer sees what's there.
{ type: 'show data authors', after: 1600 },
{ type: 'show data books', after: 1900 },
// switch to SQL and join (split the mode switch for a readable beat)
{ type: 'mode advanced', enter: false, after: 1100 },
{ key: 'Enter', after: 1300 },
{
type: 'select authors.name, books.title from books join authors on books.author_id = authors.author_id order by authors.name',
after: 2600,
},
{ caption: 'Each book paired with its author, joined across the two tables.', after: 3200 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'relationship-diagram',
title: 'Declare a relationship and see it drawn',
width: 90,
height: 26,
typeSpeed: '45ms',
steps: [
{ wait: 900 },
{ type: 'create table authors with pk author_id(serial)', after: 800 },
{ type: 'add column to authors: name (text)', after: 900 },
{ type: 'create table books with pk book_id(serial)', after: 800 },
{ type: 'add column to books: title (text)', after: 700 },
{ type: 'add column to books: author_id (int)', after: 1000 },
{
type: 'add 1:n relationship as books_author from authors.author_id to books.author_id on delete cascade',
after: 1400,
},
// the money shot: the two-table connector diagram
{ type: 'show relationship books_author', after: 2600 },
{ caption: 'Many books, each pointing at one author.', after: 3200 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'assistive-editor',
title: 'The input field helps as you type — completion and a live validity indicator',
width: 90,
height: 26,
typeSpeed: '55ms',
steps: [
{ wait: 1100 },
{ type: 'create table books with pk', after: 850 },
{ type: 'add column to books: title (text)', after: 1100 },
// Completion: type a partial table name, press Tab to complete it.
{ type: 'show data bo', enter: false, after: 1100 },
{ key: 'Tab', after: 1400 },
{ key: 'Enter', after: 1600 },
// Validity indicator: a misspelled table flags [ERR] before you submit.
{ type: 'show data boook', enter: false, after: 1900 },
{ key: 'Enter', after: 1700 },
// The corrected command runs cleanly.
{ type: 'show data books', after: 1600 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'hint',
title: 'Ask for a hint — on the command you are typing, or on the last error',
width: 90,
// Taller: the tier-3 hint blocks (What / Example / Concept) plus the command
// echoes need the room. The live-input hint is opened with Ctrl-G, which in
// --demo mode aliases F1 and badges AS [F1] (ADR-0047 Amendment 1) — autocast
// can't send F1 (an escape sequence), so this control byte stands in for it.
height: 30,
typeSpeed: '45ms',
steps: [
{ wait: 1000 },
{ type: 'create table customers with pk id(serial)', after: 850 },
// Live-input hint, mid-command (how you'd really use it): you start
// `add column`, pause unsure of the exact form, and press F1 (Ctrl-G in
// demo mode, badged [F1]) to remind yourself — then finish the command
// from the example it shows, without losing what you'd typed.
{ type: 'add column ', enter: false, after: 1700 },
{ key: 'CtrlG', after: 3400 }, // [F1] badge + the add-column hint — hold to read
{ type: 'customers: email (text)', enter: false, after: 1600 }, // finish it off
{ key: 'Enter', after: 2000 }, // submit — the column is added
// Error-recovery hint: a command that fails, then `hint` explains it.
{ type: 'show data orders', after: 2200 }, // no such table → friendly error
{ type: 'hint', enter: false, after: 1200 },
{ key: 'Enter', after: 3400 }, // the error hint block — hold to read
{ caption: 'A hint for what you are typing, or for the last error.', after: 3200 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
{
name: 'quickstart',
title: 'RDBMS Playground — first table to first query',
width: 90,
height: 26,
typeSpeed: '45ms',
holdEnd: 2.5, // landing cast loops — pause on the final frame before restart
steps: [
{ wait: 1100 },
{ type: 'create table authors with pk', after: 1000 },
{ type: 'add column to authors: name (text)', after: 850 },
{ type: 'add column to authors: birth_year (int)', after: 900 },
{
type: "insert into authors (name, birth_year) values ('Ursula K. Le Guin', 1929)",
after: 1300,
},
{ type: 'show data authors', after: 1800 },
{ key: 'CtrlC' }, // quit invisibly (Ctrl-C) — cast ends on the last content frame
],
},
];
+211
View File
@@ -0,0 +1,211 @@
#!/usr/bin/env node
/**
* generate.mjs turn the cast definitions in `casts.mjs` into asciinema
* `.cast` recordings under `public/casts/`, using autocast (ADR-website-001
* §2; driver chosen by the 2026-06-10 spike autocast drives the full-screen
* TUI correctly, asciinema-automation does not).
*
* Usage:
* pnpm casts # regenerate every cast
* pnpm casts quickstart # regenerate just one
*
* Requires `autocast` on PATH (cargo install autocast) and a built
* `rdbms-playground` binary at ../target/debug (run `cargo build` at the repo
* root first). The binary's dir is added to PATH for the autocast child so the
* recording shows a clean `$ rdbms-playground` launch line.
*/
import { spawnSync } from 'node:child_process';
import { mkdirSync, writeFileSync, readFileSync, rmSync } from 'node:fs';
import { dirname, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import os from 'node:os';
import { casts } from './casts.mjs';
const here = dirname(fileURLToPath(import.meta.url));
const websiteRoot = resolve(here, '..');
const repoRoot = resolve(websiteRoot, '..');
const binDir = resolve(repoRoot, 'target', 'debug');
const outDir = resolve(websiteRoot, 'public', 'casts');
const cargoBin = resolve(os.homedir(), '.cargo', 'bin');
/** YAML-escape a single character for a double-quoted scalar. */
function charKey(ch) {
if (ch === '\\') return '"\\\\"';
if (ch === '"') return '"\\""';
return `"${ch}"`;
}
/** Named single keys → autocast control codes. */
const NAMED_KEYS = {
Enter: '^M',
Tab: '^I',
// Ctrl-C quits the app (Action::Quit). Used to end a cast *invisibly* — no
// `quit` command typed into the input — so the recording ends on the last
// content frame rather than a dangling, payoff-less `quit`.
CtrlC: '^C',
// Ctrl-O cycles the ADR-0046 schema-sidebar navigation focus
// (Input → Tables → Relationships → Input); the only way to reveal the
// sidebar in a 90-column cast (it auto-hides at that width).
CtrlO: '^O',
// Esc leaves navigation mode directly (back to the input field).
Esc: '^[',
// Ctrl-G: in demo mode the app aliases this to F1 (the contextual-hint key,
// ADR-0053) and badges it AS [F1] (ADR-0047 Amendment 1). autocast can't emit
// F1 (an escape sequence), but it can send this single control byte — so a
// cast can show the live-input hint exactly as a real F1 press would.
CtrlG: '^G',
};
/** Build the autocast `keys:` list (one entry per line) for a cast's steps. */
function keysFor(steps) {
const keys = [];
for (const step of steps) {
if (step.wait != null) {
keys.push(`${step.wait}ms`);
continue;
}
if (step.key != null) {
const code = NAMED_KEYS[step.key];
if (!code) throw new Error(`unknown key: ${step.key}`);
// Quote the control code so YAML-special bytes (`^[` ESC, `^]`) stay
// valid scalars; `^M`/`^I`/`^C` are unaffected by the quoting.
keys.push(JSON.stringify(code));
if (step.after != null) keys.push(`${step.after}ms`);
continue;
}
if (step.type != null) {
for (const ch of step.type) keys.push(charKey(ch));
if (step.enter !== false) keys.push('^M'); // Enter = CR (the TUI submits on \r)
if (step.after != null) keys.push(`${step.after}ms`);
continue;
}
if (step.caption != null) {
// Demo step caption (ADR-0047 D3): `Ctrl+]` opens a stealth capture
// buffer, the characters accumulate invisibly (they don't touch the
// input line), and a second `Ctrl+]` commits them to the floating
// caption box. The caption persists until the next keystroke, so the
// trailing wait holds it on screen before the cast ends. Keep caption
// text plain ASCII — it is typed character-by-character like any input.
keys.push(JSON.stringify('^]')); // open capture
for (const ch of step.caption) keys.push(charKey(ch));
keys.push(JSON.stringify('^]')); // commit the caption
if (step.after != null) keys.push(`${step.after}ms`);
continue;
}
throw new Error(`unrecognised step: ${JSON.stringify(step)}`);
}
return keys;
}
/**
* Trim a recorded cast to just the in-app portion and (optionally) hold the
* final frame. The app enters the alternate screen (`?1049h`) right after
* launch and leaves it (`?1049l`) on quit, so keeping the events between those
* drops the shell prompt, the `$ rdbms-playground` launch line, and the
* return-to-shell frame the cast starts with the app already running and
* ends on the last in-app frame (no stray cursor-under-prompt frame).
* `holdEnd` re-emits the final frame after a pause so a looping cast lingers
* before restarting.
*/
function trimCast(outPath, { holdEnd = 1.5 } = {}) {
const lines = readFileSync(outPath, 'utf8').split('\n').filter(Boolean);
const header = JSON.parse(lines[0]);
const events = lines.slice(1).map((l) => JSON.parse(l));
const isOut = (e) => Array.isArray(e) && e[1] === 'o' && typeof e[2] === 'string';
const start = events.findIndex((e) => isOut(e) && e[2].includes('?1049h'));
let end = -1;
for (let i = events.length - 1; i >= 0; i--) {
if (isOut(events[i]) && events[i][2].includes('?1049l')) {
end = i;
break;
}
}
const kept = events.slice(start < 0 ? 0 : start, end < 0 ? events.length : end);
if (kept.length === 0) return; // nothing matched — leave the cast untouched
const t0 = kept[0][0];
const rebased = kept.map((e) => [Number((e[0] - t0).toFixed(6)), e[1], e[2]]);
if (holdEnd > 0) {
const lastT = rebased[rebased.length - 1][0];
rebased.push([Number((lastT + holdEnd).toFixed(6)), 'o', '']); // hold final frame
}
delete header.duration; // let the player recompute from events
writeFileSync(
outPath,
[JSON.stringify(header), ...rebased.map((e) => JSON.stringify(e))].join('\n') + '\n'
);
}
function yamlFor(cast, dataDir) {
const keys = keysFor(cast.steps)
.map((k) => ` - ${k}`)
.join('\n');
// Build the launch command. `--demo` turns on the demonstration overlay
// (ADR-0047): automatic keystroke badges (so otherwise-invisible keys like
// `j` / Tab / Enter are shown) plus `Ctrl+]`-delimited step captions.
// `--data-dir` isolates the recording from the user's real projects (and
// keeps the load picker listing only this cast's projects).
const cmd = ['rdbms-playground'];
if (cast.demo !== false) cmd.push('--demo'); // on for all casts (opt out with demo:false)
if (dataDir) cmd.push('--data-dir', dataDir);
return [
'settings:',
` width: ${cast.width ?? 90}`,
` height: ${cast.height ?? 26}`,
` title: ${JSON.stringify(cast.title ?? cast.name)}`,
` type_speed: ${cast.typeSpeed ?? '45ms'}`,
' timeout: 90s',
' prompt: "$ "',
'instructions:',
' - !Interactive',
` command: ${cmd.join(' ')}`,
' keys:',
keys,
'',
].join('\n');
}
const only = process.argv[2];
const selected = only ? casts.filter((c) => c.name === only) : casts;
if (only && selected.length === 0) {
console.error(`no cast named "${only}". Known: ${casts.map((c) => c.name).join(', ')}`);
process.exit(1);
}
mkdirSync(outDir, { recursive: true });
const env = { ...process.env, PATH: `${binDir}:${cargoBin}:${process.env.PATH}` };
let failures = 0;
for (const cast of selected) {
const yamlPath = resolve(os.tmpdir(), `autocast-${cast.name}.yaml`);
const outPath = resolve(outDir, `${cast.name}.cast`);
// Per-cast isolated data root (so the load picker lists only this cast's
// projects and nothing touches the user's real data dir). Wiped fresh each
// run for a deterministic picker order.
let dataDir = null;
if (cast.dataDir) {
dataDir = resolve(os.tmpdir(), `rdbms-cast-data-${cast.name}`);
rmSync(dataDir, { recursive: true, force: true });
mkdirSync(dataDir, { recursive: true });
}
writeFileSync(yamlPath, yamlFor(cast, dataDir));
console.log(`▶ recording ${cast.name} → public/casts/${cast.name}.cast`);
const res = spawnSync('autocast', ['--overwrite', yamlPath, outPath], {
env,
stdio: 'inherit',
});
rmSync(yamlPath, { force: true });
if (res.status !== 0) {
console.error(`${cast.name} failed (autocast exit ${res.status})`);
failures += 1;
} else {
// Trim the shell launch/quit so the cast starts with the app already
// running (the default; opt out with `keepShell: true` for casts that
// deliberately document the CLI launch).
if (!cast.keepShell) trimCast(outPath, { holdEnd: cast.holdEnd ?? 1.5 });
console.log(`${cast.name}`);
}
}
if (failures) process.exit(1);
console.log(`Done — ${selected.length} cast(s).`);
+24
View File
@@ -0,0 +1,24 @@
{
"name": "rdbms-playground-website",
"private": true,
"type": "module",
"version": "0.0.1",
"packageManager": "pnpm@10.30.3",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"casts": "node casts-src/generate.mjs",
"astro": "astro"
},
"dependencies": {
"@astrojs/starlight": "^0.40.0",
"@astrojs/starlight-tailwind": "^5.0.0",
"@tailwindcss/vite": "^4.3.0",
"asciinema-player": "^3.15.1",
"astro": "^6.4.5",
"sharp": "^0.34.5",
"tailwindcss": "^4.3.0"
}
}
+4447
View File
File diff suppressed because it is too large Load Diff
+156
View File
@@ -0,0 +1,156 @@
{"version":2,"width":90,"height":26,"timestamp":1781556663,"title":"The input field helps as you type — completion and a live validity indicator","env":{"TERM":"tmux-256color","SHELL":"/usr/bin/bash"}}
[0,"o","\u001b[?1049h"]
[0.00545,"o","\u001b[1;1H\u001b[38;2;74;82;101;48;2;24;27;34m╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Output \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m────────────────────────────────────────────────────────────────────────────────╮\u001b[2;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[3;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[4;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[5;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[6;"]
[0.00549,"o","1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[7;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[8;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[9;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[10;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[11;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[12;1H│\u001b[38;2;230;230;230;48;2;24;27;34"]
[0.005618,"o","m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[13;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[14;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[15;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[16;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[17;1H╰─────────────────────────────────────────────────────────────────────────────"]
[0.005685,"o","───────────╯\u001b[18;1H╭ \u001b[1m\u001b[38;2;110;196;255;48;2;24;27;34mSIMPLE\u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m ────────────────────────────────────────────────────────────────────────────────╮\u001b[19;1H│\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[20;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[21;1H╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Hint \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m──────────────────────────────────────"]
[0.005762,"o","────────────────────────────────────────────╮\u001b[22;1H│\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[23;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[24;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[25;1H\u001b[38;2;139;144;154;48;2;24;27;34mProject: \u001b[1m[TEMP] \u001b[38;2;230;230;230;48;2;24;27;34mFjord Watching Amber\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m complete · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m run \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.007557,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.009356,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.011103,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.166282,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcopy\u001b[22;7Hchange\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.221699,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.276898,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.331804,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.387235,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.441796,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.496806,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;110;196;255;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mm:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.551501,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.60719,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.661943,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.716163,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.77186,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.826494,"o","\u001b[19;14H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.881231,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.936764,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.991682,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.046596,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.101893,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.156912,"o","\u001b[19;20H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.211691,"o","\u001b[19;21H\u001b[38;2;255;107;107;48;2;24;27;34mw\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.26689,"o","\u001b[19;22H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.322131,"o","\u001b[19;23H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.376801,"o","\u001b[19;21H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.431598,"o","\u001b[19;25H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.486455,"o","\u001b[19;26H\u001b[38;2;255;107;107;48;2;24;27;34mp\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.541781,"o","\u001b[19;26H\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.597404,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[2;20H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[2;27Htable\u001b[2;33H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[2;39H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[2;44Hpk\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;15H \u001b[19;21H \u001b[19;26H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.616813,"o","\u001b[2;11H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtabl\u001b[2;23H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[2;44H \u001b[3;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks\u001b[4;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌──────┬────────┬─────────────┐\u001b[5;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[5;13HName\u001b[5;18H│\u001b[5;20HType\u001b[5;27H│\u001b[5;29HConstraints\u001b[5;41H│\u001b[6;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├──────┼────────┼─────────────┤\u001b[7;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[7;13Hid\u001b[7;18H│\u001b[7;20Hserial\u001b[7;27H│\u001b[7;29HPK\u001b[7;41H│\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└──────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.620142,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.622856,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.62565,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.557004,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.612094,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.666996,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.72284,"o","\u001b[19;5H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mconstraint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m1:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.777663,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mconstrai\u001b[22;18Ht\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.832929,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.886986,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.942008,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.997009,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.051757,"o","\u001b[19;6H\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.097648,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.106455,"o","\u001b[19;12H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.162185,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.21731,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.271996,"o","\u001b[19;13H\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.326836,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;7H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.381632,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.436926,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.491787,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.546623,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.602362,"o","\u001b[19;21H\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name, then `(`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.656814,"o","\u001b[19;22H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.712212,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.76694,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.823773,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.876612,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.932046,"o","\u001b[19;27H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.987427,"o","\u001b[19;28H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.04228,"o","\u001b[19;29H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.097516,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.152007,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.210388,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mx\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.261688,"o","\u001b[19;30H\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.319214,"o","\u001b[19;34H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.374088,"o","\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[9;20H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[9;24Hcolumn\u001b[9;31Hto\u001b[9;34H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[9;41H\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[9;47H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;6H \u001b[19;13H \u001b[19;16H \u001b[19;23H \u001b[19;29H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.391451,"o","\u001b[9;11H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;47H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks\u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────┬────────┬─────────────┐\u001b[12;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[12;13HName\u001b[12;19H│\u001b[12;21HType\u001b[12;28H│\u001b[12;30HConstraints\u001b[12;42H│\u001b[13;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├───────┼────────┼─────────────┤\u001b[14;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[14;13Hid\u001b[14;19H│\u001b[14;21Hserial\u001b[14;28H│\u001b[14;30HPK\u001b[14;42H│\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[15;13Htitle\u001b[15;19H│\u001b[15;21Htext\u001b[15;28H│\u001b[15;42H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.394119,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.396793,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.399387,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.404434,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.582191,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.637491,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.692754,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.748108,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.803054,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.859446,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.87469,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.913278,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.969412,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.022691,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.077968,"o","\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.133384,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.187967,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.189074,"o","\u001b[19;85H\u001b[1m\u001b[38;2;255;107;107;48;2;24;27;34m[ERR]\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.397804,"o","\u001b[13;82H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;82H [TAB] \u001b[15;82H \u001b[19;12H\u001b[22m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[19;18H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;85H\u001b[27m \u001b[22;2H\u001b[38;2;199;146;234;48;2;24;27;34mwhere\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mlimit\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.399898,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.900013,"o","\u001b[13;82H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;82H \u001b[15;82H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.90716,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;18H \u001b[2;24H \u001b[2;30H \u001b[2;35H \u001b[3;11H┌──────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├──────┼────────┼─────────────┤\u001b[6;11H│ id │ serial │ PK │\u001b[7;11H└──────┴────────┴─────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[9;22H \u001b[9;25H \u001b[9;32H \u001b[9;38H \u001b[10;11H┌───────┬────────┬─────────────┐\u001b[11;11H│ Name │ Type │ Constraints │\u001b[12;11H├───────┼────────┼─────────────┤\u001b[13;11H│ id │ serial │ PK │\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;13H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mtitle\u001b[14;21Ht\u001b[14;23Hxt \u001b[14;30H \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;"]
[9.907212,"o","199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[19;12H \u001b[19;18H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.912015,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m└──────┴────────┴─────────────┘\u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[4;18H \u001b[4;20H \u001b[4;27H \u001b[4;29H \u001b[4;41H \u001b[5;11H┌\u001b[5;18H─┬\u001b[5;27H─┬\u001b[5;41H─┐\u001b[6;13HName\u001b[6;18H │ Type \u001b[6;27H │ Constraints │\u001b[7;11H├\u001b[7;18H─┼\u001b[7;27H─┼\u001b[7;41H─┤\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;"]
[9.912119,"o","230;230;48;2;24;27;34m│ id │ serial │ PK \u001b[8;38H │ \u001b[9;11H│ title\u001b[9;19H│\u001b[9;21Htext\u001b[9;28H│\u001b[9;42H│\u001b[10;11H└\u001b[10;19H┴\u001b[10;28H┴\u001b[10;42H┘\u001b[11;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[11;21H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;30H \u001b[11;42H \u001b[12;11H┌\u001b[12;19H─\u001b[12;23H┬\u001b[12;28H─\u001b[12;31H┐ \u001b[13;13H \u001b[13;19H id │ title │\u001b[13;42H \u001b[14;11H├───────────┼───────┤\u001b[14;42H \u001b[15;11H│ (no rows) │ │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────┘ \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.915515,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.918395,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.92161,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.924583,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.409477,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.617986,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.672877,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.727786,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.783244,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.83832,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.892818,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.947931,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.002736,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.058516,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.112078,"o","\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.1676,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.222679,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.277066,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.332723,"o","\u001b[19;15H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mno such table: `booo`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.387983,"o","\u001b[19;16H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;22H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mk`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.389622,"o","\u001b[19;85H\u001b[1m\u001b[38;2;255;107;107;48;2;24;27;34m[ERR]\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.398062,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[3;22H \u001b[3;25H \u001b[3;32H \u001b[3;38H \u001b[4;11H┌───────┬────────┬─────────────┐\u001b[5;11H│ Name │ Type │ Constraints │\u001b[6;11H├───────┼────────┼─────────────┤\u001b[7;11H│ id │ serial │ PK │\u001b[8;13Htitle\u001b[8;21Ht\u001b[8;23Hxt \u001b[8;30H \u001b[9;11H└───────┴────────┴─────────────┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────┐\u001b[12;11H│ id │ title │\u001b[13;11H├───────────┼───────┤\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ (no rows) │ │\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;"]
[14.398203,"o","27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mboook\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;7H \u001b[19;12H \u001b[19;85H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command\u001b[22;17H— press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.404421,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;22H \u001b[2;25H \u001b[2;32H \u001b[2;38H \u001b[3;11H┌───────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├───────┼────────┼─────────────┤\u001b[6;11H│ id │ serial │ PK │\u001b[7;13Htitle\u001b[7;21Ht\u001b[7;23Hxt \u001b[7;30H \u001b[8;11H└───────┴────────┴─────────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────┐\u001b[11;11H│ id │ title │\u001b[12;11H├───────────┼───────┤\u001b[13;11H│ (no rows) │ │\u001b[14;11H└───────────┴───────┘\u001b[15;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mboook\u001b[38;2;255;107;107;48;2;24;27;34m ✗\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[16;2H\u001b[38;2;255;107;107;48;2;24;27;34m[error] \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mno such table: `boook`\u001b[22m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.407601,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.410946,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.414123,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.41529,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.900531,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.208351,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.262622,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.317308,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.37317,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.429932,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.483671,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.537446,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.59264,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.64883,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.703736,"o","\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.757739,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.813762,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.868223,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.925182,"o","\u001b[19;15H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.977427,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.033358,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m┌───────┬────────┬─────────────┐\u001b[3;11H│ Name │ Type │ Constraints │\u001b[4;11H├───────┼────────┼─────────────┤\u001b[5;11H│ id │ serial │ PK │\u001b[6;13Htitle\u001b[6;21Ht\u001b[6;23Hxt \u001b[6;30H \u001b[7;11H└───────┴────────┴─────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────┐\u001b[10;11H│ id │ title │\u001b[11;11H├───────────┼───────┤\u001b[12;11H│ (no rows) │ │\u001b[13;11H└───────────┴───────┘\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mboook\u001b[38;2;255;107;107;48;2;24;27;34m ✗\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;2H\u001b[22m\u001b[38;2;255;107;107;48;2;24;27;34m[error] \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mno such table: `boook`\u001b[15;80H\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;7H \u001b[19;12H "]
[17.033402,"o"," \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.036731,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m└\u001b[2;19H┴\u001b[2;28H┴\u001b[2;42H┘\u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[3;21H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[3;30H \u001b[3;42H \u001b[4;11H┌\u001b[4;19H─\u001b[4;23H┬\u001b[4;28H─\u001b[4;31H┐ \u001b[5;13H \u001b[5;19H id │ title │\u001b[5;42H \u001b[6;11H├───────────┼───────┤\u001b[6;42H \u001b[7;11H│ (no rows) │ │ \u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mboook\u001b[38;2;255;107;107;48;2;24;27;34m ✗\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;255;107;107;48;2;24;27;34m[error] \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mno such table: `boook`\u001b[11;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[12;11H┌───────────┬───────┐\u001b[13;11H│ id │ title │\u001b[14;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├───────────┼───────┤\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ (no rows) │ │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────┘ \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.039752,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.042846,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.046042,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.051022,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.534164,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.745766,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.245766,"o",""]
+197
View File
@@ -0,0 +1,197 @@
{"version":2,"width":90,"height":30,"timestamp":1781561938,"title":"Ask for a hint — on the command you are typing, or on the last error","env":{"TERM":"tmux-256color","SHELL":"/usr/bin/bash"}}
[0,"o","\u001b[?1049h"]
[0.006366,"o","\u001b[1;1H\u001b[38;2;74;82;101;48;2;24;27;34m╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Output \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m────────────────────────────────────────────────────────────────────────────────╮\u001b[2;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[3;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[4;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[5;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[6;"]
[0.006457,"o","1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[7;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[8;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[9;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[10;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[11;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[12;1H│\u001b[38;2;230;230;230;48;2;24;27;34"]
[0.006565,"o","m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[13;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[14;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[15;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[16;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[17;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[18;1H│\u001b[38;2;230;230;230;48;2;24;27;34m "]
[0.006668,"o"," \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[19;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[20;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[21;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[22;1H╭ \u001b[1m\u001b[38;2;110;196;255;48;2;24;27;34mSIMPLE\u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m ───────────────────────────────────────────────────────────────────────────────"]
[0.006777,"o","─╮\u001b[23;1H│\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[24;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[25;1H╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Hint \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m──────────────────────────────────────────────────────────────────────────────────╮\u001b[26;1H│\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[27;1H│\u001b[38;2;230;230;230"]
[0.006886,"o",";48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[28;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[29;1H\u001b[38;2;139;144;154;48;2;24;27;34mProject: \u001b[1m[TEMP] \u001b[38;2;230;230;230;48;2;24;27;34mLinen Swimming Ancient\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[30;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m complete · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m run \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.00905,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.011189,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.013228,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.051739,"o","\u001b[23;2H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcopy\u001b[26;7Hchange\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[30;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[30;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[30;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[30;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[30;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[30;60Hword · \u001b[30;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.096918,"o","\u001b[23;3H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.141564,"o","\u001b[23;4H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.186895,"o","\u001b[23;5H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.231779,"o","\u001b[23;6H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.2764,"o","\u001b[23;2H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.321129,"o","\u001b[23;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;110;196;255;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mm:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.367057,"o","\u001b[23;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.413184,"o","\u001b[23;10H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.45713,"o","\u001b[23;11H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.504586,"o","\u001b[23;12H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.548843,"o","\u001b[23;9H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.591309,"o","\u001b[23;14H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.637095,"o","\u001b[23;15H\u001b[38;2;86;182;194;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.6818,"o","\u001b[23;16H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.726332,"o","\u001b[23;17H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.77128,"o","\u001b[23;18H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.816275,"o","\u001b[23;19H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.861428,"o","\u001b[23;20H\u001b[38;2;86;182;194;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.906301,"o","\u001b[23;21H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.951521,"o","\u001b[23;22H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.99628,"o","\u001b[23;23H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.041138,"o","\u001b[23;24H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.086225,"o","\u001b[23;25H\u001b[38;2;255;107;107;48;2;24;27;34mw\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.131386,"o","\u001b[23;26H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.176383,"o","\u001b[23;27H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.222191,"o","\u001b[23;25H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.26635,"o","\u001b[23;29H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.311243,"o","\u001b[23;30H\u001b[38;2;255;107;107;48;2;24;27;34mp\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.356409,"o","\u001b[23;30H\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.401462,"o","\u001b[23;32H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.446713,"o","\u001b[23;33H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext: `(`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.491778,"o","\u001b[23;34H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.536094,"o","\u001b[23;35H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.581485,"o","\u001b[23;36H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34ms\u001b[26;4Hrial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.626076,"o","\u001b[23;37H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.671481,"o","\u001b[23;38H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.71661,"o","\u001b[23;39H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.761276,"o","\u001b[23;40H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.806544,"o","\u001b[23;36H\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.851602,"o","\u001b[23;42H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.896968,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[2;20H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[2;27Htable\u001b[2;33H\u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[2;43H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[2;48Hpk\u001b[2;51H\u001b[38;2;86;182;194;48;2;24;27;34mid\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[17;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[18;80H [ENTER] \u001b[19;80H \u001b[23;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[23;9H \u001b[23;15H \u001b[23;25H \u001b[23;30H \u001b[23;33H \u001b[26;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[30;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[30;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[30;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[30;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[30;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[30;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[30;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.91043,"o","\u001b[2;11H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtabl\u001b[2;23H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mid\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[3;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mcustomers\u001b[4;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌──────┬────────┬─────────────┐\u001b[5;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[5;13HName\u001b[5;18H│\u001b[5;20HType\u001b[5;27H│\u001b[5;29HConstraints\u001b[5;41H│\u001b[6;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├──────┼────────┼─────────────┤\u001b[7;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[7;13Hid\u001b[7;18H│\u001b[7;20Hserial\u001b[7;27H│\u001b[7;29HPK\u001b[7;41H│\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└──────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.913061,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.915516,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.918019,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.837282,"o","\u001b[23;2H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[30;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[30;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[30;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[30;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[30;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[30;60Hword · \u001b[30;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.882074,"o","\u001b[23;3H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.926974,"o","\u001b[23;2H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.971584,"o","\u001b[23;5H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mconstraint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m1:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.017099,"o","\u001b[23;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;9H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mconstrai\u001b[26;18Ht\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.061621,"o","\u001b[23;7H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.106191,"o","\u001b[23;8H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.151892,"o","\u001b[23;9H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.197451,"o","\u001b[23;10H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.244466,"o","\u001b[23;6H\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.286707,"o","\u001b[23;12H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.397871,"o","\u001b[17;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[18;80H \u001b[19;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.288251,"o","\u001b[23;85H\u001b[1m\u001b[38;2;255;107;107;48;2;24;27;34m[ERR]\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.076755,"o","\u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mHint\u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[10;13H\u001b[38;2;230;230;230;48;2;24;27;34mWhat:\u001b[10;22HAdd\u001b[10;26Ha\u001b[10;28Hnew\u001b[10;32Hcolumn\u001b[10;39Hto\u001b[10;42Han\u001b[10;45Hexisting\u001b[10;54Htable.\u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[11;13H\u001b[38;2;230;230;230;48;2;24;27;34mExample:\u001b[11;22Hadd\u001b[11;26Hcolumn\u001b[11;33HCustomers:\u001b[11;44Hphone\u001b[11;50H(text)\u001b[12;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;139;144;154;48;2;24;27;34m Concept: Existing rows take the column's default, or null. A `not null`\u001b[13;2Hcolumn with no default can't be added to a table that already has rows — there'd be\u001b[14;2Hnothing to put in them.\u001b[17;83H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[18;83H [F1] \u001b[19;83H \u001b[23;85H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.079109,"o","\u001b[23;85H\u001b[1m\u001b[38;2;255;107;107;48;2;24;27;34m[ERR]\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.578071,"o","\u001b[17;83H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[18;83H \u001b[19;83H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.567162,"o","\u001b[23;13H\u001b[38;2;86;182;194;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;85H\u001b[27m \u001b[26;11H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.612924,"o","\u001b[23;14H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.657348,"o","\u001b[23;15H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.70209,"o","\u001b[23;16H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.747484,"o","\u001b[23;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.795366,"o","\u001b[23;18H\u001b[38;2;86;182;194;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.837047,"o","\u001b[23;19H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.882022,"o","\u001b[23;20H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.926739,"o","\u001b[23;21H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.972186,"o","\u001b[23;22H\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name, then `(`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.018065,"o","\u001b[23;23H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.062117,"o","\u001b[23;24H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.107576,"o","\u001b[23;25H\u001b[38;2;86;182;194;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.152532,"o","\u001b[23;26H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.197623,"o","\u001b[23;27H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.242451,"o","\u001b[23;28H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.286656,"o","\u001b[23;29H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.332539,"o","\u001b[23;30H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.377545,"o","\u001b[23;31H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.422378,"o","\u001b[23;32H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.466676,"o","\u001b[23;33H\u001b[38;2;86;182;194;48;2;24;27;34mx\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.512389,"o","\u001b[23;31H\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.557171,"o","\u001b[23;35H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.559402,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.247521,"o","\u001b[15;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[15;20H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[15;24Hcolumn\u001b[15;31H\u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[15;42H\u001b[38;2;86;182;194;48;2;24;27;34memail\u001b[15;48H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[17;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[18;80H [ENTER] \u001b[19;80H \u001b[23;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[23;6H \u001b[23;13H \u001b[23;24H \u001b[23;30H \u001b[26;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[30;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[30;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[30;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[30;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[30;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[30;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[30;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.264085,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌──────┬────────┬─────────────┐ \u001b[3;11H│ Name │ Type\u001b[3;27H│\u001b[3;29HConstraints\u001b[3;41H│\u001b[4;11H├\u001b[4;18H┼\u001b[4;27H┼\u001b[4;41H┤\u001b[5;13Hid \u001b[5;20Hserial\u001b[5;29HPK \u001b[6;11H└\u001b[6;18H┴\u001b[6;27H┴\u001b[6;41H┘\u001b[7;11HHint\u001b[7;18H \u001b[7;20H \u001b[7;27H \u001b[7;29H \u001b[7;41H \u001b[8;11H What: Add a new column to an\u001b[8;45Hexisting\u001b[8;54Htable.\u001b[9;11H Example:\u001b[9;22Hadd\u001b[9;26Hcolumn\u001b[9;33HCustomers:\u001b[9;44Hphone\u001b[9;50H(text)\u001b[10;11H\u001b[38;2;139;144;154;48;2;24;27;34m Concept: Existing rows take the column's default, or null. A `not null`\u001b[11;2Hcolumn with no default can't be added to a table that already has rows — there'd be\u001b[12;2Hnothing to\u001b[12;13Hput in them.\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[13;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34memail\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mcustomers \u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────┬────────┬─────────────┐ \u001b[15;48H \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[16;13HName\u001b[16;19H│\u001b[16;21HType\u001b[16;28H│\u001b[16;30HConstraints\u001b[16;42H│\u001b[17;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├────"]
[12.26415,"o","───┼────────┼─────────────┤\u001b[18;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[18;13Hid\u001b[18;19H│\u001b[18;21Hserial\u001b[18;28H│\u001b[18;30HPK\u001b[18;42H│\u001b[19;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[19;13Hemail\u001b[19;19H│\u001b[19;21Htext\u001b[19;28H│\u001b[19;42H│\u001b[20;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.266774,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.269541,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.272085,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.273451,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.752714,"o","\u001b[17;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[18;80H \u001b[19;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.337739,"o","\u001b[23;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[26;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[30;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[30;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[30;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[30;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[30;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[30;60Hword · \u001b[30;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.382757,"o","\u001b[23;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.427483,"o","\u001b[23;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.472538,"o","\u001b[23;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.517298,"o","\u001b[23;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.56253,"o","\u001b[23;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.607371,"o","\u001b[23;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.652525,"o","\u001b[23;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.69759,"o","\u001b[23;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.74233,"o","\u001b[23;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[26;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.787376,"o","\u001b[23;12H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mno such table: `o`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.832805,"o","\u001b[23;13H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;19H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mr`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.878475,"o","\u001b[23;14H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;20H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34md`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.922189,"o","\u001b[23;15H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;21H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34me`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.967745,"o","\u001b[23;16H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;22H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mr`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.012592,"o","\u001b[23;17H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;23H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34ms`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.058302,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m│ Name │ Type │ Constraints │\u001b[3;11H├──────┼────────┼─────────────┤\u001b[4;11H│ id │ serial │ PK │\u001b[5;11H└──────┴────────┴─────────────┘\u001b[6;11HHint \u001b[7;11H What:\u001b[7;22HAdd\u001b[7;26Ha\u001b[7;28Hnew\u001b[7;32Hcolumn\u001b[7;39Hto\u001b[7;42Han\u001b[7;45Hexisting\u001b[7;54Htable.\u001b[8;13HEx\u001b[8;16Hmple:\u001b[8;22Ha\u001b[8;26Hcolumn Customers: phone (tex\u001b[8;55H) \u001b[9;11H\u001b[38;2;139;144;154;48;2;24;27;34m Concept: Existing rows take the column's default, or null. A `not null`\u001b[10;2Hcolumn with no default can't\u001b[10;31Hbe added to a\u001b[10;45Htable that already has rows — there'd be\u001b[11;2Hn\u001b[11;4Hthi\u001b[11;8Hg to put\u001b[11;17Hin them.\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[12;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[12;33H\u001b[38;2;86;182;194;48;2;24;27;34memail\u001b[12;39H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[13;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mcustomers \u001b[13;22H \u001b[13;33H \u001b[13;39H \u001b[14;11H┌───────┬────────┬─────────────┐\u001b[15;11H│ Name │ Type │ Constraints │\u001b[16;11H├───────┼────────┼─────────────┤\u001b[17;11H│ id │ serial │ PK │\u001b[17;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[18;13H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34memail\u001b[18;21Ht\u001b[18;23Hxt \u001b[18;30H \u001b[18;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[19;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴"]
[15.058348,"o","─────────────┘\u001b[19;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[20;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34morders\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H\u001b[7m \u001b[27m \u001b[23;7H \u001b[23;12H \u001b[26;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command\u001b[26;17H— pr\u001b[26;22Hs\u001b[26;24H Tab for options, `help` for a list · `mode advanced` for SQL\u001b[30;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[30;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[30;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[30;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[30;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[30;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[30;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.064122,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m├──────┼────────┼─────────────┤\u001b[3;11H│ id │ serial │ PK │\u001b[4;11H└──────┴────────┴─────────────┘\u001b[5;11HHint \u001b[6;11H What:\u001b[6;22HAdd\u001b[6;26Ha\u001b[6;28Hnew\u001b[6;32Hcolumn\u001b[6;39Hto\u001b[6;42Han\u001b[6;45Hexisting\u001b[6;54Htable.\u001b[7;13HEx\u001b[7;16Hmple:\u001b[7;22Ha\u001b[7;26Hcolumn Customers: phone (tex\u001b[7;55H) \u001b[8;11H\u001b[38;2;139;144;154;48;2;24;27;34m Concept: Existing rows take the column's default, or null. A `not null`\u001b[9;2Hcolumn with no default can't\u001b[9;31Hbe added to a\u001b[9;45Htable that already has rows — there'd be\u001b[10;2Hn\u001b[10;4Hthi\u001b[10;8Hg to put\u001b[10;17Hin them.\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[11;33H\u001b[38;2;86;182;194;48;2;24;27;34memail\u001b[11;39H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[12;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mcustomers \u001b[12;22H \u001b[12;33H \u001b[12;39H \u001b[13;11H┌───────┬────────┬─────────────┐\u001b[14;11H│ Name │ Type │ Constraints │\u001b[15;11H├───────┼────────┼─────────────┤\u001b[16;11H│ id │ serial │ PK │\u001b[17;13Hemail\u001b[17;21Ht\u001b[17;23Hxt \u001b[17;30H \u001b[18;11H└───────┴────────┴─────────────┘\u001b[19;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34morders\u001b[38;2;255;107;107;48;2;24;27;34m ✗\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[20;2H\u001b[38;2;255;107;107;48;2;24;27;34m[error] \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mno such table: `orders`\u001b[22m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.06786,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.071148,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.074906,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.076954,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.559005,"o","\u001b[17;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[18;80H \u001b[19;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.348069,"o","\u001b[23;2H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhelp\u001b[26;7Hhint\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[30;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[30;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[30;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[30;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[30;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[30;60Hword · \u001b[30;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.392956,"o","\u001b[23;3H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.437778,"o","\u001b[23;4H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.483342,"o","\u001b[23;2H\u001b[38;2;199;146;234;48;2;24;27;34mhint\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.483978,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.7725,"o","\u001b[2;11H\u001b[38;2;139;144;154;48;2;24;27;34m Concept: Existing rows take the column's default, or null. A `not null`\u001b[3;2Hcolumn with no default can't be added to a table that already has rows — there'd be\u001b[4;2Hnothing to put in them.\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[5;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[5;22H\u001b[38;2;86;182;194;48;2;24;27;34mcustomers\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[5;33H\u001b[38;2;86;182;194;48;2;24;27;34memail\u001b[5;39H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[6;11H\u001b[38;2;230;230;230;48;2;24;27;34mcustomers\u001b[6;22H \u001b[6;26H \u001b[6;28H \u001b[6;32H \u001b[6;39H \u001b[6;42H \u001b[6;45H \u001b[6;54H \u001b[7;11H┌───────┬────────┬─────────────┐\u001b[7;44H \u001b[7;50H \u001b[8;11H│ Name │ Type │ Constraints │ \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├───────┼────────┼─────────────┤ \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ id │ serial\u001b[10;28H│\u001b[10;30HPK\u001b[10;42H│\u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ email │ text │ \u001b[11;33H \u001b[11;39H │ \u001b[12;11H└───────┴────────┴─────────────┘\u001b[13;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34morders\u001b[38;2;255;107;107;48;2;24;27;34m ✗\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;2H\u001b[38;2;255;107;107;48;2;24;27;34m[error] \u001b[1m\u001b[38;2;230;230;"]
[18.772589,"o","230;48;2;24;27;34mno such table: `orders`\u001b[22m \u001b[14;42H \u001b[15;11HHint \u001b[16;11H \u001b[16;13HWhat:\u001b[16;19H \u001b[16;21H You named a\u001b[16;34Htable\u001b[16;40Hor column\u001b[16;50Hthat\u001b[16;55Hdoesn't\u001b[16;63Hexist.\u001b[17;11H \u001b[17;13HEx\u001b[17;16Hmple: Check\u001b[17;28Hthe\u001b[17;32Hspelling,\u001b[17;42Hor\u001b[17;45Hrun\u001b[17;49H`show\u001b[17;55Htables`\u001b[17;63H(or\u001b[17;67H`show\u001b[17;73Htable\u001b[17;79H<\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mo\u001b[18;2Hsee what's there. \u001b[18;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[19;2H\u001b[22m\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;139;144;154;48;2;24;27;34m Concept: A command can only refer to tables and columns that alread\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[20;2H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcreate them first if you need them.\u001b[23;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[26;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[26;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[30;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[30;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[30;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[30;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[30;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[30;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[30;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[30;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.775075,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.274535,"o","\u001b[17;80H\u001b[38;2;230;230;230;48;2;24;27;34mname>`) t\u001b[18;80H \u001b[19;80H\u001b[38;2;139;144;154;48;2;24;27;34my exist —\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.262177,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.307342,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.353555,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.398541,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.443447,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.486983,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.532753,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.578197,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.622712,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.667217,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.712826,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.758024,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.803668,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.84874,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.892165,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.938347,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.984501,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.027524,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.072281,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.118233,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.16295,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.208885,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.252326,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.297626,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.341754,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.386981,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.432576,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.47771,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.522605,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.567801,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.612588,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.657434,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.702655,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.74768,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.793614,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.83706,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.882331,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.927578,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.97255,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.016625,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.062736,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.10741,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.152879,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.200321,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.245518,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.288124,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.332842,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.378524,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.42321,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.467928,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.514141,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.557755,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.602091,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.647909,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.692837,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.738714,"o","\u001b[16;49H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[17;49H A hint for what you are typing, or for \u001b[18;49H the last error. \u001b[19;49H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.740353,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.029449,"o","\u001b[16;49H\u001b[38;2;230;230;230;48;2;24;27;34m that doesn't exist. \u001b[17;49H`show tables` (or `show table <name>`) t\u001b[18;49H \u001b[19;49H\u001b[38;2;139;144;154;48;2;24;27;34m tables and columns that already exist —\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[29.529449,"o",""]
+864
View File
@@ -0,0 +1,864 @@
{"version":2,"width":90,"height":26,"timestamp":1781556614,"title":"Switch to advanced mode and join across tables","env":{"SHELL":"/usr/bin/bash","TERM":"tmux-256color"}}
[0,"o","\u001b[?1049h"]
[0.005853,"o","\u001b[1;1H\u001b[38;2;74;82;101;48;2;24;27;34m╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Output \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m────────────────────────────────────────────────────────────────────────────────╮\u001b[2;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[3;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[4;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[5;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[6;"]
[0.006024,"o","1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[7;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[8;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[9;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[10;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[11;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[12;1H│\u001b[38;2;230;230;230;48;2;24;27;34"]
[0.006084,"o","m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[13;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[14;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[15;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[16;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[17;1H╰─────────────────────────────────────────────────────────────────────────────"]
[0.006129,"o","───────────╯\u001b[18;1H╭ \u001b[1m\u001b[38;2;110;196;255;48;2;24;27;34mSIMPLE\u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m ────────────────────────────────────────────────────────────────────────────────╮\u001b[19;1H│\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[20;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[21;1H╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Hint \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m──────────────────────────────────────"]
[0.006231,"o","────────────────────────────────────────────╮\u001b[22;1H│\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[23;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[24;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[25;1H\u001b[38;2;139;144;154;48;2;24;27;34mProject: \u001b[1m[TEMP] \u001b[38;2;230;230;230;48;2;24;27;34mTrekking Emerald Delta\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m complete · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m run \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.008016,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.00962,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.011219,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.919403,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcopy\u001b[22;7Hchange\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.959885,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.004989,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.043768,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.085716,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.128469,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.169198,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;110;196;255;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mm:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.211201,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.253424,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.29534,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.338295,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.379125,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.421122,"o","\u001b[19;14H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.462875,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.505046,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.547206,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.589372,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.630973,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.673648,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.714806,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.757105,"o","\u001b[19;22H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.799736,"o","\u001b[19;23H\u001b[38;2;255;107;107;48;2;24;27;34mw\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.841594,"o","\u001b[19;24H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.883831,"o","\u001b[19;25H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.927391,"o","\u001b[19;23H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.968662,"o","\u001b[19;27H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.009053,"o","\u001b[19;28H\u001b[38;2;255;107;107;48;2;24;27;34mp\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.05111,"o","\u001b[19;28H\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.094555,"o","\u001b[19;30H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.135189,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext: `(`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.176996,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.21944,"o","\u001b[19;33H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.261708,"o","\u001b[19;34H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.303051,"o","\u001b[19;35H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.345187,"o","\u001b[19;36H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.386803,"o","\u001b[19;37H\u001b[38;2;86;182;194;48;2;24;27;34m_\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.430863,"o","\u001b[19;38H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.471081,"o","\u001b[19;39H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.512924,"o","\u001b[19;40H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.555048,"o","\u001b[19;41H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34ms\u001b[22;4Hrial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.597408,"o","\u001b[19;42H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.638978,"o","\u001b[19;43H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.682783,"o","\u001b[19;44H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.723408,"o","\u001b[19;45H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.765571,"o","\u001b[19;41H\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.807172,"o","\u001b[19;47H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.849259,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[2;20H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[2;27Htable\u001b[2;33H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[2;41H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[2;46Hpk\u001b[2;49H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;15H \u001b[19;23H \u001b[19;28H \u001b[19;31H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;"]
[2.849277,"o","2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.871935,"o","\u001b[2;11H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtabl\u001b[2;23H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[3;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mauthors\u001b[4;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬────────┬─────────────┐\u001b[5;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[5;13HName\u001b[5;23H│\u001b[5;25HType\u001b[5;32H│\u001b[5;34HConstraints\u001b[5;46H"]
[2.875116,"o","│\u001b[6;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├───────────┼────────┼─────────────┤\u001b[7;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[7;13Hauthor_id\u001b[7;23H│\u001b[7;25Hserial\u001b[7;32H│\u001b[7;34HPK\u001b[7;46H│\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.877514,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.879515,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.881635,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.584478,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.626178,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.67083,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.710354,"o","\u001b[19;5H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mconstraint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m1:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.752461,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mconstrai\u001b[22;18Ht\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.796575,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.836214,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.879796,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.923316,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.964464,"o","\u001b[19;6H\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.003596,"o","\u001b[19;12H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.045833,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.087576,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.133005,"o","\u001b[19;13H\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.172335,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.213278,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.256237,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.297076,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.339417,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.352856,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.383358,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.423809,"o","\u001b[19;22H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.46523,"o","\u001b[19;23H\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name, then `(`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.508366,"o","\u001b[19;24H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.55091,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.591478,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.635388,"o","\u001b[19;27H\u001b[38;2;86;182;194;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.675876,"o","\u001b[19;28H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.71835,"o","\u001b[19;29H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.760004,"o","\u001b[19;30H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.801467,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.846353,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.886125,"o","\u001b[19;33H\u001b[38;2;86;182;194;48;2;24;27;34mx\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.928219,"o","\u001b[19;31H\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.96922,"o","\u001b[19;35H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.013831,"o","\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[9;20H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[9;24Hcolumn\u001b[9;31Hto\u001b[9;34H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[9;43H\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[9;48H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;6H \u001b[19;13H \u001b[19;16H \u001b[19;25H \u001b[19;30H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.033141,"o","\u001b[9;11H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[9;34H\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;48H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mauthors\u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬────────┬─────────────┐\u001b[12;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[12;13HName\u001b[12;23H│\u001b[12;25HType\u001b[12;32H│\u001b[12;34HConstraints\u001b[12;46H│\u001b[13;2H\u001b[38;2;159;216;145;"]
[5.033214,"o","48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├───────────┼────────┼─────────────┤\u001b[14;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[14;13Hauthor_id\u001b[14;23H│\u001b[14;25Hserial\u001b[14;32H│\u001b[14;34HPK\u001b[14;46H│\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[15;13Hname\u001b[15;23H│\u001b[15;25Htext\u001b[15;32H│\u001b[15;46H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.036866,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.039628,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.042553,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.748266,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcopy\u001b[22;7Hchange\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.789005,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.829856,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.871742,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.913922,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.95801,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.99808,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;110;196;255;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mm:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.039813,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.081464,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.125224,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.166712,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.208204,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.250284,"o","\u001b[19;14H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.294247,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.337025,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.377711,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.417971,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.461456,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.501302,"o","\u001b[19;20H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.515108,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.544915,"o","\u001b[19;21H\u001b[38;2;255;107;107;48;2;24;27;34mw\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.588466,"o","\u001b[19;22H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.629414,"o","\u001b[19;23H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.669876,"o","\u001b[19;21H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.711696,"o","\u001b[19;25H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.757238,"o","\u001b[19;26H\u001b[38;2;255;107;107;48;2;24;27;34mp\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.795627,"o","\u001b[19;26H\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.838349,"o","\u001b[19;28H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.8827,"o","\u001b[19;29H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext: `(`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.923167,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.964446,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.00835,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.047662,"o","\u001b[19;33H\u001b[38;2;86;182;194;48;2;24;27;34m_\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.090126,"o","\u001b[19;34H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.132396,"o","\u001b[19;35H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.17344,"o","\u001b[19;36H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.218639,"o","\u001b[19;37H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34ms\u001b[22;4Hrial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.2604,"o","\u001b[19;38H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.300387,"o","\u001b[19;39H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.341684,"o","\u001b[19;40H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.384968,"o","\u001b[19;41H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.426568,"o","\u001b[19;37H\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.467726,"o","\u001b[19;43H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.510816,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mauthors \u001b[2;24H \u001b[2;32H \u001b[2;37H \u001b[2;40H \u001b[3;11H┌───────────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├───────────┼────────┼─────────────┤\u001b[6;11H│ author_id │ serial │ PK │\u001b[7;11H└───────────┴────────┴─────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mauthors \u001b[9;22H \u001b[9;25H \u001b[9;34H \u001b[9;39H \u001b[10;11H┌───────────┬────────┬─────────────┐\u001b[11;11H│ Name │ Type │ Constraints │\u001b[12;11H├───────────┼────────┼─────────────┤\u001b[13;11H│ author_id │ serial │ PK │\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;13H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mname \u001b[14;25Ht\u001b[14;27Hxt \u001b[14;34H \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴────────┴─────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;15H \u001b[19;21H \u001b[19;26H \u001b[19;29H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.536973,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[2;22Hto\u001b[2;25H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[2;34H\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[2;39H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;11H\u001b[38;2;230;230;230;48;2;24;27;34mauthors \u001b[4;11H┌───────────┬────────┬─────────────┐\u001b[5;11H│ Name │ Type │ Constraints │\u001b[6;11H├───────────┼────────┼─────────────┤\u001b[7;11H│ author_id │ serial │ PK │\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ name \u001b[8;22H │\u001b[8;25Htext │\u001b[8;34H \u001b[8;39H │\u001b[9;11H└──────"]
[7.537163,"o","─────┴────────┴─────────────┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[11;23H \u001b[11;25H \u001b[11;32H \u001b[11;34H \u001b[11;46H \u001b[12;11H┌\u001b[12;21H┬\u001b[12;23H─\u001b[12;30H┬\u001b[12;32H─\u001b[12;44H┐ \u001b[13;13HName │\u001b[13;23HTyp\u001b[13;27H │\u001b[13;32HConstraints\u001b[13;44H│\u001b[13;46H \u001b[14;11H├─────────┼────────┼─────────────┤\u001b[14;46H \u001b[15;11H│ book_id │ serial │ PK │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴────────┴─────────────┘ \u001b[16;47H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.540014,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.542843,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.545908,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.247917,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.293027,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.329757,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.373072,"o","\u001b[19;5H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mconstraint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m1:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.412461,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mconstrai\u001b[22;18Ht\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.456009,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.495665,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.540017,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.579915,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.622262,"o","\u001b[19;6H\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.667004,"o","\u001b[19;12H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.705678,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.747691,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.790315,"o","\u001b[19;13H\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.833162,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.880367,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.917124,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.961039,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.002036,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.011279,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.042849,"o","\u001b[19;21H\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name, then `(`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.085436,"o","\u001b[19;22H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.1286,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.171604,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.212452,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.25503,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.293818,"o","\u001b[19;27H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.33642,"o","\u001b[19;28H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.383524,"o","\u001b[19;29H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.424998,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.464744,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.507999,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mx\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.547517,"o","\u001b[19;30H\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.591426,"o","\u001b[19;34H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.633094,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mauthors \u001b[2;22H \u001b[2;25H \u001b[2;34H \u001b[2;39H \u001b[3;11H┌───────────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├───────────┼────────┼─────────────┤\u001b[6;11H│ author_id │ serial │ PK │\u001b[7;13Hname \u001b[7;25Ht\u001b[7;27Hxt \u001b[7;34H \u001b[8;11H└───────────┴────────┴─────────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;"]
[9.633143,"o","2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[10;18H \u001b[10;24H \u001b[10;30H \u001b[10;35H \u001b[10;38H \u001b[11;11H┌─────────┬────────┬─────────────┐\u001b[12;11H│ Name │ Type │ Constraints │\u001b[13;11H├─────────┼────────┼─────────────┤\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ book_id │ serial │ PK │\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴────────┴─────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;"]
[9.633209,"o","2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[16;47H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;6H \u001b[19;13H \u001b[19;16H \u001b[19;23H \u001b[19;29H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.657328,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[2;24H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[2;30H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[2;35Hpk\u001b[2;38H\u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;11H\u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[4;11H┌─────────┬────────┬─────────────┐\u001b[4;46H \u001b[5;11H│ Name │ Type │ Constraints │ \u001b[6;11H├─────────┼────────┼─────────────┤\u001b[6;46H \u001b[7;13Hbook_id\u001b[7;21H│\u001b[7;23Hserial\u001b[7;30H│\u001b[7;32HPK\u001b[7;44H│\u001b[7;46H \u001b[8;21H┴\u001b[8;23H─\u001b[8;30H┴\u001b[8;32H─\u001b[8;44H┘ \u001b[9;11H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146"]
[9.657358,"o",";234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[9;27Hoks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[9;38H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[15;11H│ title │ text │ │\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴────────┴─────────────┘ \u001b[16;47H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.66404,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.666014,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.364063,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.406097,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.450498,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.490476,"o","\u001b[19;5H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mconstraint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m1:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.53624,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mconstrai\u001b[22;18Ht\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.575016,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.616291,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.66095,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.700149,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.745004,"o","\u001b[19;6H\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.786893,"o","\u001b[19;12H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.827034,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.868227,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.909715,"o","\u001b[19;13H\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.954974,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.000002,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.037348,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.080998,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.120914,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.136463,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.164123,"o","\u001b[19;21H\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name, then `(`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.205036,"o","\u001b[19;22H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.246551,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.288932,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.33129,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.372498,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.415685,"o","\u001b[19;27H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.456347,"o","\u001b[19;28H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.498876,"o","\u001b[19;29H\u001b[38;2;86;182;194;48;2;24;27;34m_\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.540544,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.583488,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.625351,"o","\u001b[19;32H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.666944,"o","\u001b[19;33H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.71181,"o","\u001b[19;34H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.75126,"o","\u001b[19;35H\u001b[38;2;86;182;194;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.794939,"o","\u001b[19;34H\u001b[38;2;240;143;192;48;2;24;27;34mint\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.83865,"o","\u001b[19;37H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mno\u001b[22;5H\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.878475,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;18H \u001b[2;24H \u001b[2;30H \u001b[2;35H \u001b[2;38H \u001b[3;11H┌─────────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├─────────┼────────┼─────────────┤\u001b[6;11H│ book_id │ serial │ PK │\u001b[7;11H└─────────┴────────┴─────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[9;22H \u001b[9;25H \u001b[9;32H \u001b[9;38H \u001b[10;11H┌─────────┬────────┬─────────────┐\u001b[11;11H│ Name │ Type │ Constraints │\u001b[12;11H├─────────┼────────┼─────────────┤\u001b[13;11H│ book_id │ serial │ PK │\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;13H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mtitle \u001b[14;23Ht\u001b[14;25Hxt \u001b[14;32H \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴────────┴─────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[16;51H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;6H \u001b[19;13H \u001b[19;16H \u001b[19;23H \u001b[19;33H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.907376,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m┌─────────┬────────┬─────────────┐\u001b[3;11H│ Name │ Type │ Constraints │\u001b[4;11H├─────────┼────────┼─────────────┤\u001b[5;11H│ book_id │ serial │ PK │\u001b[6;13Htitle \u001b[6;23Ht\u001b[6;25Hxt \u001b[6;32H \u001b[8;32H\u001b[38;2;86;182;194;48;2;24;27;34mau\u001b[8;35Hhor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;21H\u001b[38;2;230;230;230;48;2;24;27;34m─\u001b[10;23H┬\u001b[10;30H─\u001b[10;32H┬\u001b[10;44H──┐\u001b[11;21H \u001b[11;23H│ Type\u001b[11;30H \u001b[11;32H│ Constraints\u001b[11;46H│\u001b[12;21H─\u001b[12;23H┼\u001b[12;30H─\u001b[12;32H┼\u001b[12;44H──┤\u001b[13;21H \u001b[13;23H│ serial\u001b[13;32H│ PK\u001b[13;44H \u001b[13;46H│\u001b[14;21H \u001b[14;23H│ text\u001b[14;30H \u001b[14;32H│\u001b[14;44H \u001b[14;46H│\u001b[15;11H│ author_id │ int │ \u001b[15;46"]
[11.907445,"o","H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴────────┴─────────────┘ \u001b[16;51H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.911153,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.915258,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.918564,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.762469,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.803385,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.845494,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.887287,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.933091,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.972755,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.017031,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.055246,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.09666,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.141324,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.180853,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.222541,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.264642,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.307201,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.349383,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.38059,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.392169,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.432722,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.475335,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.519445,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.558349,"o","\u001b[19;21H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.600903,"o","\u001b[19;22H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.647066,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.68652,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.726522,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.768585,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.810719,"o","\u001b[19;27H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.853146,"o","\u001b[19;28H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.895129,"o","\u001b[19;29H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.938471,"o","\u001b[19;30H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.979336,"o","\u001b[19;31H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.022028,"o","\u001b[19;32H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.063889,"o","\u001b[19;33H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.105247,"o","\u001b[19;29H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.147427,"o","\u001b[19;35H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.189503,"o","\u001b[19;36H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `name`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.231788,"o","\u001b[19;37H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.273926,"o","\u001b[19;38H\u001b[38;2;255;107;107;48;2;24;27;34mU\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into\u001b[22;21Ha\u001b[22;23Hthors (name) values (`, expected string literal or `null` —\u001b[23;2Husage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.315974,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.357683,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.400219,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.441482,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.48398,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.525814,"o","\u001b[19;44H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `name`: Type a\u001b[22;21Hq\u001b[22;23Hoted string (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.568129,"o","\u001b[19;45H\u001b[38;2;255;107;107;48;2;24;27;34mK\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into\u001b[22;21Ha\u001b[22;23Hthors (name) values (`, expected string literal or `null` —\u001b[23;2Husage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.609871,"o","\u001b[19;46H\u001b[38;2;255;107;107;48;2;24;27;34m.\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `name`: Type a\u001b[22;21Hq\u001b[22;23Hoted string (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.651714,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.694196,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34mL\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into\u001b[22;21Ha\u001b[22;23Hthors (name) values (`, expected string literal or `null` —\u001b[23;2Husage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.736396,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.778972,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `name`: Type a\u001b[22;21Hq\u001b[22;23Hoted string (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.821179,"o","\u001b[19;51H\u001b[38;2;255;107;107;48;2;24;27;34mG\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into\u001b[22;21Ha\u001b[22;23Hthors (name) values (`, expected string literal or `null` —\u001b[23;2Husage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.8622,"o","\u001b[19;52H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.904525,"o","\u001b[19;53H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.946494,"o","\u001b[19;54H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.988862,"o","\u001b[19;37H\u001b[38;2;195;232;141;48;2;24;27;34m'Ursula K. Le Guin'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.029491,"o","\u001b[19;56H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.073342,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m│ Name │ Type │ Constraints │\u001b[3;11H├─────────┼────────┼─────────────┤\u001b[4;11H│ book_id │ serial │ PK │\u001b[5;13Htitle \u001b[5;23Ht\u001b[5;25Hxt \u001b[5;32H \u001b[6;11H└─────────┴────────┴─────────────┘\u001b[7;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[8;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mbook"]
[15.073438,"o","s \u001b[8;22H \u001b[8;25H \u001b[8;32H \u001b[8;42H \u001b[9;11H┌───────────┬────────┬─────────────┐\u001b[10;11H│ Name │ Type │ Constraints │\u001b[11;11H├───────────┼────────┼─────────────┤\u001b[12;11H│ book_id │ serial │ PK │\u001b[13;13Htitle \u001b[13;25Ht\u001b[13;27Hxt \u001b[13;34H \u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;13H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mau\u001b[14;16Hhor_id\u001b[14;25Hint \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴────────┴─────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;"]
[15.073556,"o","230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[16;54H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Ursula K. Le Guin'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;22H \u001b[19;29H \u001b[19;36H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.092033,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;21H \u001b[2;23H \u001b[2;30H \u001b[2;32H \u001b[2;44H \u001b[3;11H┌\u001b[3;21H─\u001b[3;23H┬\u001b[3;30H─\u001b[3;32H┬\u001b[3;44H──┐\u001b[4;13HName \u001b[4;21H \u001b[4;23H│ Type\u001b[4;30H \u001b[4;32H│ Constraints\u001b[4;46H│\u001b[5;11H├───────────┼────────┼─────────────┤\u001b[6;11H│ book_id │ serial │ PK \u001b[6;46H│\u001b[7;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ title \u001b[7;22H │\u001b[7;25Htext \u001b[7;32H│ \u001b[7;42H │ \u001b[8;11H│ author_id\u001b[8;23H│\u001b[8;25Hint\u001b[8;32H│\u001b[8;46H│\u001b[9;11H└\u001b[9;23H┴\u001b[9;32H┴\u001b[9;46H┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[10;18Hinto\u001b[10;23H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[10;31H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;"]
[15.092133,"o","27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Ursula K. Le Guin'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[12;11H┌───────────┬───────────────────┐\u001b[12;46H \u001b[13;13Hau\u001b[13;16Hhor_id\u001b[13;25Hname\u001b[13;32H \u001b[13;43H│\u001b[13;46H \u001b[14;11H├───────────┼───────────────────┤\u001b[14;46H \u001b[15;11H│ 1 │ Ursula K. Le Guin │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────────┘ \u001b[16;47H \u001b[16;54H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.09766,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.10361,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.108689,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.757541,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.799195,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.841028,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.883013,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.924995,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.96602,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.008663,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.049575,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.091809,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.133103,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.175149,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.216809,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.259083,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.302187,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.3436,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.38623,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.428422,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.468764,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.511605,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.553408,"o","\u001b[19;21H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.575104,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.595659,"o","\u001b[19;22H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.637466,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.679384,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.722744,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.765016,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.804922,"o","\u001b[19;27H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.847487,"o","\u001b[19;28H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.891135,"o","\u001b[19;29H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.931673,"o","\u001b[19;30H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.97342,"o","\u001b[19;31H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.016392,"o","\u001b[19;32H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.057585,"o","\u001b[19;33H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.099036,"o","\u001b[19;29H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.143305,"o","\u001b[19;35H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.183344,"o","\u001b[19;36H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `name`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.225011,"o","\u001b[19;37H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.269307,"o","\u001b[19;38H\u001b[38;2;255;107;107;48;2;24;27;34mI\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into\u001b[22;21Ha\u001b[22;23Hthors (name) values (`, expected string literal or `null` —\u001b[23;2Husage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.30978,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.352105,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.394557,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.435969,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.478497,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `name`: Type a\u001b[22;21Hq\u001b[22;23Hoted string (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.522292,"o","\u001b[19;44H\u001b[38;2;255;107;107;48;2;24;27;34mC\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into\u001b[22;21Ha\u001b[22;23Hthors (name) values (`, expected string literal or `null` —\u001b[23;2Husage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.564049,"o","\u001b[19;45H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.604675,"o","\u001b[19;46H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.646143,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.688415,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.732139,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.772114,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.81562,"o","\u001b[19;37H\u001b[38;2;195;232;141;48;2;24;27;34m'Italo Calvino'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.85806,"o","\u001b[19;52H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.897616,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬────────┬─────────────┐\u001b[3;11H│ Name │ Type │ Constraints │\u001b[4;11H├───────────┼────────┼─────────────┤\u001b[5;11H│ book_id │ serial │ PK │\u001b[6;13Htitle \u001b[6;25Ht\u001b[6;27Hxt \u001b[6;34H \u001b[7;13Hau\u001b[7;16Hhor_id\u001b[7;25Hint \u001b[8;11H└───────────┴────────┴─────────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Ursula K. Le Guin'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted\u001b[10;31H \u001b[10;38H \u001b[10;45H \u001b[11;11H┌───────────┬───────────────────┐\u001b[12;11H│ author_id │ name │\u001b[13;11H├───────────┼───────────────────┤\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ 1 │ Ursula K. Le Guin │\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[16;47H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[16;54H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Italo Calvino'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;22H \u001b[19;29H \u001b[19;36H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.913609,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m└\u001b[2;23H┴\u001b[2;32H┴\u001b[2;46H┘\u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[3;18Hinto\u001b[3;23H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[3;31H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Ursula K. Le Guin'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[5;11H┌───────────┬───────────────────┐\u001b[5;46H \u001b[6;13Hau\u001b[6;16Hhor_id\u001b[6;25Hname\u001b[6;32H \u001b[6;43H│\u001b[6;46H \u001b[7;11H├───────────┼───────────────────┤\u001b[7;46H \u001b[8;11H│ 1 │ Ursula K. Le Guin │ \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────────┘\u001b[9;45H \u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[10;31H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[10;38H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[10;45H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Italo Calvino'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[12;11H┌───────────┬───────────────┐\u001b[12;43H \u001b[13;11H│ author_id │ name │ \u001b[14;11H├───────────┼───────────────┤ \u001b[14;43H \u001b[15;11H│ 2 │ Italo Calvino │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────┘ \u001b[16;47H \u001b[16;54H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.917626,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.921575,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.925475,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.683332,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.725321,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.765664,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.809977,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.851232,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.893343,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.933627,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.975297,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.017448,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.060914,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.101414,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.144577,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.185457,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.233597,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.270385,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.311242,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.353839,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.395441,"o","\u001b[19;19H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.401719,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.438975,"o","\u001b[19;20H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.480162,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mti\u001b[22;5Hle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.523228,"o","\u001b[19;22H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.565337,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.606938,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.648008,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.689742,"o","\u001b[19;26H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mau\u001b[22;5Hhor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.731724,"o","\u001b[19;27H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.774399,"o","\u001b[19;28H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;11H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.817021,"o","\u001b[19;29H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.860425,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.90029,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.942401,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.983851,"o","\u001b[19;33H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.025937,"o","\u001b[19;34H\u001b[38;2;86;182;194;48;2;24;27;34m_\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.067375,"o","\u001b[19;35H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.111099,"o","\u001b[19;36H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.153056,"o","\u001b[19;37H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.195261,"o","\u001b[19;38H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.236684,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.278951,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.319259,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.36334,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.404217,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.445825,"o","\u001b[19;39H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.486862,"o","\u001b[19;45H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.529346,"o","\u001b[19;46H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.573513,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.615986,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34mA\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.657872,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.70009,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34mW\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.740808,"o","\u001b[19;51H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.782591,"o","\u001b[19;52H\u001b[38;2;255;107;107;48;2;24;27;34mz\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.824746,"o","\u001b[19;53H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.866168,"o","\u001b[19;54H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.90918,"o","\u001b[19;55H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.950082,"o","\u001b[19;56H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.993279,"o","\u001b[19;57H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.034415,"o","\u001b[19;58H\u001b[38;2;255;107;107;48;2;24;27;34mf\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.076385,"o","\u001b[19;59H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.119423,"o","\u001b[19;60H\u001b[38;2;255;107;107;48;2;24;27;34mE\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.161365,"o","\u001b[19;61H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.202657,"o","\u001b[19;62H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.244405,"o","\u001b[19;63H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.287343,"o","\u001b[19;64H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.330067,"o","\u001b[19;65H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.369743,"o","\u001b[19;66H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.41219,"o","\u001b[19;67H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.455072,"o","\u001b[19;47H\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H,`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.498062,"o","\u001b[19;69H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `author_id`: Type an integer (e.g. 42, -7) or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.537944,"o","\u001b[19;70H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.58181,"o","\u001b[19;71H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext: `)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.623169,"o","\u001b[19;72H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.666363,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────────────────┐\u001b[3;45H \u001b[4;11H│\u001b[4;13Hauthor_id │ nam\u001b[4;29H \u001b[4;43H│\u001b[5;11H├\u001b[5;23H┼\u001b[5;43H┤\u001b[6;13H 1\u001b[6;25HUrsula\u001b[6;32HK.\u001b[6;35HLe\u001b[6;38HGuin\u001b[7;11H└\u001b[7;23H┴\u001b[7;43H┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[8;18Hinto\u001b[8;23H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[8;38H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[8;45H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Italo Calvino'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[10;2H"]
[21.666478,"o","\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────────────┐ \u001b[10;45H \u001b[11;11H│\u001b[11;13Hauthor_id │ nam\u001b[11;29H \u001b[11;39H│\u001b[12;11H├\u001b[12;23H┼\u001b[12;39H┤\u001b[13;13H 2\u001b[13;25HItalo\u001b[13;31HCalvino\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└\u001b[14;23H┴\u001b[14;39H┘\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[15;20H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[15;46H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[15;57H\u001b[38;2;199;146;234;48;"]
[21.666628,"o","2;24;27;34mvalues\u001b[15;64H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Ea\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;20H \u001b[19;28H \u001b[19;39H \u001b[19;46H \u001b[19;71H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.68698,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────────┘\u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[3;45H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Italo Calvino'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[4;13H1 row(s) insert\u001b[4;29Hd\u001b[4;43H \u001b[5;11H┌\u001b[5;23H┬\u001b[5;39H┐ \u001b[6;13Hauthor_id\u001b[6;25Hname \u001b[6;32H \u001b[6;35H \u001b[6;38H │ \u001b[6;43H \u001b[7;11H├\u001b[7;23H┼\u001b[7;39H┤ \u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ \u001b[8;18H 2\u001b[8;23H│ Italo\u001b[8;31HCalvino │ \u001b[8;45H \u001b[9;11H└───────────┴───────────────┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[10;48H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[10;55H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[10;80H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;13H1 row(s) inser"]
[21.687011,"o","t\u001b[11;29Hd\u001b[11;39H \u001b[12;11H┌\u001b[12;21H┬\u001b[12;23H─\u001b[12;39H─────┬───────────┐\u001b[13;13Hbook_id\u001b[13;21H│\u001b[13;23Htitle \u001b[13;31H \u001b[13;39H \u001b[13;44H│\u001b[13;46Hauthor_id\u001b[13;56H│\u001b[14;11H├\u001b[14;21H┼\u001b[14;23H─\u001b[14;39H─────┼───────────┤\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ 1 │ A Wizard\u001b[15;32Hof Earthsea │\u001b[15;46H 1 │ \u001b[15;64H \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴──────────────────────┴───────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.691286,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.695732,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.699749,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.347888,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.389636,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.432201,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.474803,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.515874,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.557981,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.599788,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.642355,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.684271,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.725878,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.770077,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.810733,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.852171,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.893271,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.935906,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.979024,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.019867,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.061819,"o","\u001b[19;19H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.107571,"o","\u001b[19;20H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.147442,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mti\u001b[22;5Hle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.167875,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.187161,"o","\u001b[19;22H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.229034,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.273085,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.315096,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.356173,"o","\u001b[19;26H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mau\u001b[22;5Hhor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.398014,"o","\u001b[19;27H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.440094,"o","\u001b[19;28H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;11H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.482566,"o","\u001b[19;29H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.524057,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.566129,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.607003,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.649184,"o","\u001b[19;33H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.692882,"o","\u001b[19;34H\u001b[38;2;86;182;194;48;2;24;27;34m_\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.735256,"o","\u001b[19;35H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.776756,"o","\u001b[19;36H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.820088,"o","\u001b[19;37H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.860476,"o","\u001b[19;38H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.902476,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.943109,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.988657,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.029266,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.071128,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.112065,"o","\u001b[19;39H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.155252,"o","\u001b[19;45H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.197729,"o","\u001b[19;46H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.238936,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.281242,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34mT\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.322769,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.366546,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.40731,"o","\u001b[19;51H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.449455,"o","\u001b[19;52H\u001b[38;2;255;107;107;48;2;24;27;34mL\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.491782,"o","\u001b[19;53H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.537852,"o","\u001b[19;54H\u001b[38;2;255;107;107;48;2;24;27;34mf\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.578661,"o","\u001b[19;55H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.617344,"o","\u001b[19;56H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.663641,"o","\u001b[19;57H\u001b[38;2;255;107;107;48;2;24;27;34mH\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.700618,"o","\u001b[19;58H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.742949,"o","\u001b[19;59H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.785342,"o","\u001b[19;60H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.827332,"o","\u001b[19;61H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.869157,"o","\u001b[19;62H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.909884,"o","\u001b[19;63H\u001b[38;2;255;107;107;48;2;24;27;34mf\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.951981,"o","\u001b[19;64H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.994873,"o","\u001b[19;65H\u001b[38;2;255;107;107;48;2;24;27;34mD\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.038447,"o","\u001b[19;66H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.078065,"o","\u001b[19;67H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.121761,"o","\u001b[19;68H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.162829,"o","\u001b[19;69H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.204587,"o","\u001b[19;70H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.247449,"o","\u001b[19;71H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.289622,"o","\u001b[19;72H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.333568,"o","\u001b[19;47H\u001b[38;2;195;232;141;48;2;24;27;34m'The Left Hand of Darkness'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H,`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.372607,"o","\u001b[19;74H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `author_id`: Type an integer (e.g. 42, -7) or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.41551,"o","\u001b[19;75H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.45662,"o","\u001b[19;76H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext: `)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.498356,"o","\u001b[19;77H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.542474,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────────────┐ \u001b[3;45H \u001b[4;11H│\u001b[4;13Hauthor_id │ nam\u001b[4;29H \u001b[4;39H│\u001b[5;11H├\u001b[5;23H┼\u001b[5;39H┤\u001b[6;13H 2\u001b[6;25HItalo\u001b[6;31HCalvino\u001b[7;11H└\u001b[7;23H┴\u001b[7;39H┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[8;18Hinto\u001b[8;23H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[8;48H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[8;55H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[8;80H\u001b[38;2;247;140;108;48;2;24"]
[25.542551,"o",";27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌─────────┬──────────────────────┬───────────┐ \u001b[10;80H \u001b[11;11H│\u001b[11;13Hbook_id │ title \u001b[11;44H│\u001b[11;46Hauthor_id\u001b[11;56H│\u001b[12;11H├\u001b[12;21H┼\u001b[12;44H┼\u001b[12;56H┤\u001b[13;13H 1\u001b[13;23HA Wizard\u001b[13;32Hof\u001b[13;35HEarthsea\u001b[13;46H 1\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└\u001b[14;21H┴\u001b[14;44H┴\u001b[14;56H┘\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[15;32H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b["]
[25.542731,"o","38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[15;46H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[15;64H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'The Left Hand \u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;195;232;141;48;2;24;27;34mDarkness'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;20H \u001b[19;28H \u001b[19;39H \u001b[19;46H \u001b[19;76H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;"]
[25.542845,"o","144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.560726,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────┘\u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[3;48H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[3;55H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[3;80H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[4;13H1 row(s) insert\u001b[4;29Hd\u001b[4;39H \u001b[5;11H┌\u001b[5;21H┬\u001b[5;23H─\u001b[5;39H─────┬───────────┐\u001b[6;13Hbook_id\u001b[6;21H│\u001b[6;23Htitle \u001b[6;31H \u001b[6;39H \u001b[6;44H│\u001b[6;46Hauthor_id\u001b[6;56H│\u001b[7;11H├\u001b[7;21H┼\u001b[7;23H─\u001b[7;39H─────┼───────────┤\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ \u001b[8;18H 1 │\u001b[8;23HA Wizard of Earthsea │ \u001b[8;48H 1 │ \u001b[8;80H \u001b[9;11H└─────────┴──────────────────────┴───────────┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;"]
[25.560832,"o","2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'The Left Hand of Darkness'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[10;85H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;13H1 row(s) inserted\u001b[11;44H \u001b[11;46H \u001b[11;56H \u001b[12;11H┌\u001b[12;21H┬\u001b[12;44H─\u001b[12;49H┬\u001b[12;56H─────┐\u001b[13;13Hbook_id\u001b[13;23Htitle \u001b[13;32H \u001b[13;35H \u001b[13;44H \u001b[13;49H│\u001b[13;51Hauthor_id\u001b[13;61H│\u001b[14;11H├\u001b[14;21H┼\u001b[14;44H─\u001b[14;49H┼\u001b[14;56H─────┤\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ 2 │ The\u001b[15;27HLeft\u001b[15;32HHand of Darkness │ \u001b[15;57H 1 │ \u001b[15;64H \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴───────────────────────────┴───────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.565746,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.571302,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.576105,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.225367,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.26847,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.309658,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.352111,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.394787,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.436285,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.481442,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.523278,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.560425,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.60293,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.644382,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.686973,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.728209,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.769608,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.812799,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.855632,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.896905,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.938499,"o","\u001b[19;19H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.980256,"o","\u001b[19;20H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.022978,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mti\u001b[22;5Hle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.042087,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.064359,"o","\u001b[19;22H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.106249,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.148573,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.189385,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.234237,"o","\u001b[19;26H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mau\u001b[22;5Hhor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.274217,"o","\u001b[19;27H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.319563,"o","\u001b[19;28H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;11H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.36141,"o","\u001b[19;29H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.400535,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.44177,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.483868,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.526861,"o","\u001b[19;33H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.56877,"o","\u001b[19;34H\u001b[38;2;86;182;194;48;2;24;27;34m_\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.610318,"o","\u001b[19;35H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.651884,"o","\u001b[19;36H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.695168,"o","\u001b[19;37H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.735674,"o","\u001b[19;38H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.777935,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.820764,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.862969,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.903914,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.948439,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.990408,"o","\u001b[19;39H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.031749,"o","\u001b[19;45H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.073142,"o","\u001b[19;46H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.115509,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.155898,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34mI\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.199072,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.243484,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.283004,"o","\u001b[19;51H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.324882,"o","\u001b[19;52H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.365978,"o","\u001b[19;53H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.409383,"o","\u001b[19;54H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.451604,"o","\u001b[19;55H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.49323,"o","\u001b[19;56H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.535979,"o","\u001b[19;57H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g. 'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.577086,"o","\u001b[19;58H\u001b[38;2;255;107;107;48;2;24;27;34mC\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle, author_id) values (`, expected string literal or `null`\u001b[23;2H— usage: insert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.623486,"o","\u001b[19;59H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.662642,"o","\u001b[19;60H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.704087,"o","\u001b[19;61H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.746812,"o","\u001b[19;62H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.786215,"o","\u001b[19;63H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.828262,"o","\u001b[19;47H\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H,`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.87093,"o","\u001b[19;65H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `author_id`: Type an integer (e.g. 42, -7) or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.912704,"o","\u001b[19;66H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.957779,"o","\u001b[19;67H\u001b[38;2;247;140;108;48;2;24;27;34m2\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext: `)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.997168,"o","\u001b[19;68H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[29.038707,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[2;48H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[2;55H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[2;80H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;37H \u001b[3;48H \u001b[3;55H \u001b[3;80H \u001b[4;11H┌─────────┬──────────────────────┬───────────┐\u001b[5;11H│ book_id │ title │ author_id │\u001b[6;11H├─────────┼──────────────────────┼───────────┤\u001b[7;11H│ 1 │ A Wizard of Earthsea │ 1 │\u001b[8;11H└─────────┴──────────────────────┴───────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27"]
[29.038826,"o",";34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'The Left Hand of Darkness'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[9;85H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[10;37H \u001b[10;48H \u001b[10;55H \u001b[10;85H \u001b[11;11H┌─────────┬───────────────────────────┬───────────┐\u001b[12;11H│ book_id │ title │ author_id │\u001b[13;11H├─────────┼───────────────────────────┼───────────┤\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ 2 │ The Left Hand of Darkness │ 1 │\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴───────────────────────────┴───────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[16;64H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[16;85H\u001b[38;2;247;140;108;48;2;24;27;34m2\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;"]
[29.038868,"o","230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;20H \u001b[19;28H \u001b[19;39H \u001b[19;46H \u001b[19;67H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[29.059581,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴──────────────────────┴───────────┘ \u001b[2;80H \u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[3;37H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[3;48H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[3;55H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'The Left Hand of Darkness'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[3;85H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;"]
[29.059649,"o","2;24;27;34m 1 row(s) inserted \u001b[5;11H┌─────────┬───────────────────────────┬───────────┐\u001b[6;11H│ book_id │ title │ author_id\u001b[6;61H│\u001b[7;11H├─────────┼───────────────────────────┼───────────┤\u001b[8;11H│ 2 │ The Left Hand of Darkness │ \u001b[8;59H1\u001b[8;61H│\u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴───────────────────────────┴───────────┘ \u001b[9;85H \u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks"]
[29.059744,"o","\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[10;37H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[10;48H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[10;55H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[10;76H\u001b[38;2;247;140;108;48;2;24;27;34m2\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[12;11H┌─────────┬──────────────────┬───────────┐ \u001b[12;61H \u001b[13;11H│ book_id │ title │ author_id │ \u001b[14;11H├─────────┼──────────────────┼───────────┤\u001b[14;59H \u001b[14;61H \u001b[15;11H│ 3 │ Invisible Cities │ 2"]
[29.059787,"o"," │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴──────────────────┴───────────┘ \u001b[16;57H \u001b[16;64H \u001b[16;85H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[29.066553,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[29.073213,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[29.079871,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.022328,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.06409,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.107166,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.149778,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.191423,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.233087,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.274688,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.317686,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.358602,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.401226,"o","\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.443569,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.484874,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.526369,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.540686,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.568123,"o","\u001b[19;15H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.609675,"o","\u001b[19;16H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.653607,"o","\u001b[19;17H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.694795,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.737128,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'The Left Hand of Darkness'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[2;85H\u001b[38;2;247;140;108;48;2;24;27;34m1\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;37H \u001b[3;48H \u001b[3;55H \u001b[3;85H \u001b[4;11H┌─────────┬───────────────────────────┬───────────┐\u001b[5;11H│ book_id │ title │ author_id │\u001b[6;11H├─────────┼───────────────────────────┼───────────┤\u001b[7;11H│ 2 │ The Left Hand of Darkness │ 1 │\u001b[8;11H└─────────┴───────────────────────────┴───────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[9;76H\u001b[38;2;247;140;108;48;2;24;27;34m2\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[10;37H \u001b[10;48H \u001b[10;55H \u001b[10;76H \u001b[11;11H┌─────────┬──────────────────┬───────────┐\u001b[12;11H│ book_id │ title │ author_id │\u001b[13;11H├─────────┼──────────────────┼───────────┤\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ 3 │ Invisible Cities │ 2 │\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22"]
[30.737176,"o","m\u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴──────────────────┴───────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[19;12H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.741763,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴───────────────────────────┴───────────┘ \u001b[2;85H \u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[3;37H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[3;48H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[3;55H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[3;76H\u001b[38;2;247;140;108;48;2;24;27;34m2\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[5;11H┌─────────┬──────────────────┬───────────┐ \u001b[5;61H \u001b[6;11H│ book_id │ title │ author_id │ \u001b[7;11H├─────────┼──────────────────┼───────────┤\u001b[7;59H \u001b[7;61H \u001b[8;11H│ 3 │ Invisible Cities │ 2 │ \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴──────────────────┴───────────┘ \u001b[9;55H \u001b[9;76H \u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;21H\u001b[38;2;230;230;230;48;2;24;27;34m─\u001b[11;23H┬\u001b[11;40H─\u001b[11;43H┐ \u001b[12;13Hauthor_id\u001b[12;23H│ name\u001b[12;40H \u001b[12;42H │ \u001b[12;52H \u001b[13;21H─\u001b[13;23H┼\u001b[13;40H─\u001b[13;43H┤ \u001b[14;19H \u001b[14;21H1\u001b[14;23H│ Ur\u001b[14;28Hula K. Le Guin\u001b[14;43H│\u001b[14;50H \u001b[14;52H \u001b[15;11H│ 2 │ Italo Calvino │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.746052,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.750437,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.754703,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[31.759186,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.237799,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.422521,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.462697,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.505185,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.547976,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.58948,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.631582,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.673002,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.715671,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.75852,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.799773,"o","\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.841331,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.883867,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.924518,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[32.967209,"o","\u001b[19;15H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[33.012391,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[33.055854,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[2;76H\u001b[38;2;247;140;108;48;2;24;27;34m2\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;37H \u001b[3;48H \u001b[3;55H \u001b[3;76H \u001b[4;11H┌─────────┬─────────"]
[33.055925,"o","─────────┬───────────┐\u001b[5;11H│ book_id │ title │ author_id │\u001b[6;11H├─────────┼──────────────────┼───────────┤\u001b[7;11H│ 3 │ Invisible Cities │ 2 │\u001b[8;11H└─────────┴──────────────────┴───────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────────────────┐\u001b[11;11H│ author_id │ name │\u001b[12;11H├─────"]
[33.056092,"o","──────┼───────────────────┤\u001b[13;11H│ 1 │ Ursula K. Le Guin │\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;21H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m2\u001b[14;25HItalo Calvino \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────────┴───────────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[19;12H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O"]
[33.056106,"o","\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[33.065479,"o","\u001b[2;11H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauth\u001b[2;26Hr\u001b[2;28H\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[2;37H \u001b[2;48H \u001b[2;55H \u001b[2;76H \u001b[3;11H┌───────────┬───────────────────┐\u001b[4;11H│ author_id │ name │ \u001b[5;11H├───────────┼───────────────────┤ \u001b[5;52H \u001b[6;11H│ 1 │ Ursula K. Le Guin │ \u001b[7;19H \u001b[7;21H2\u001b[7;23H│ Italo Calvino \u001b[7;40H \u001b[7;43H│\u001b[7;50H \u001b[7;52H \u001b[8;21H─\u001b[8;23H┴\u001b[8;40H─\u001b[8;43H┘ \u001b[9;21H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;21H┬\u001b[10;23H─\u001b[10;43H──────┬───────────┐\u001b[11;13Hbook_id │\u001b[11;23Htitle \u001b[11;43H \u001b[11;49H│\u001b[11;51Hauthor_id\u001b[11;61H│\u001b[12;21H┼\u001b[12;23H─\u001b[12;43H──────┼───────────┤\u001b[13;19H1\u001b[13;21H│\u001b[13;23HA\u001b[13;25HWizard\u001b[13;32Hof\u001b[13;35HEarthsea \u001b[13;49H│\u001b[13;59H1\u001b[13;61H│\u001b[14;19H2\u001b[14;21H│\u001b[14;23HThe Left Hand \u001b[14;38Hf\u001b[14;40HDarkness\u001b[14;49H│\u001b[14;59H1\u001b[14;61H│\u001b[15;11H│ 3 │ Invisible Cities \u001b[15;49H│\u001b[15;59H2\u001b[15;61H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴───────────────────────────┴───────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[33.075,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[33.083839,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[33.092987,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[34.092143,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[34.554655,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.034548,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mmode\u001b[22;7Hmessages\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.079983,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.121258,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.160579,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mmode\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.203156,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msimple\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34madvanced\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.245738,"o","\u001b[19;7H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madvanced\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.287296,"o","\u001b[19;8H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.3291,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.371484,"o","\u001b[19;10H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.413811,"o","\u001b[19;11H\u001b[38;2;86;182;194;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.456143,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.497842,"o","\u001b[19;13H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[35.538482,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34madvanced\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[36.543022,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[36.728338,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────────┬───────────────────┐\u001b[3;11H│ author_id │ name │\u001b[4;11H├───────────┼───────────────────┤\u001b[5;11H│ 1 │ Ursula K. Le Guin │\u001b[6;21H2\u001b[6;25HItalo Calvino \u001b[7;11H└───────────┴───────────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌─────────┬───────────────────────────┬───────────┐\u001b[10;11H│ book_id │ title │ author_id │\u001b[11;11H├─────────┼───────────────────────────┼───────────┤\u001b[12;11H│ 1 │ A Wizard of Earthsea │ 1 │\u001b[13;19H2\u001b[13;23HThe Left\u001b[13;32HHand of Darkness\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;19H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m3\u001b[14;23HInvisible Cities\u001b[14;40H \u001b[14;59H2\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴───────────────────────────┴───────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mmode: advanced \u001b[18;1H\u001b[38;2;224;96;96;48;2;24;27;34m╭ \u001b[1m\u001b[38;2;255;158;107;48;2;24;27;34mADVANCED\u001b[22m\u001b[38;2;224;96;96;48;2;24;27;34m ──────────────────────────────────────────────────────────────────────────────╮\u001b[19;1H│\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;7H \u001b[19;90H\u001b[38;2;224;96;96;48;2;24;27;34m│\u001b[20;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[37.728034,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.108134,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[22;17Hselect\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.148681,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34meed\u001b[22;8Helect\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.191139,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mlect\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.227467,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.2327,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.27885,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.316973,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mselect\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.35962,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnull\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtrue\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfalse\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mexists\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcase\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdistinct\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mall\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mavg\u001b[22;84H\u001b[38;2;230;230;230;48;2;24;27;34m>\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.406223,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;12H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mall\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[22;20Havg\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;84H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.44469,"o","\u001b[19;10H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;11H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.486576,"o","\u001b[19;11H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.527624,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.569001,"o","\u001b[19;13H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.610635,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.660083,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mauthors\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNo such column: `authors`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.694109,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.739486,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mauthors\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mno such table or alias in scope: `authors`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.778978,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.822377,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.864197,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.906388,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[19;21H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[22;25Htitle\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[22;35Hnull\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtrue\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfalse\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mexists\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcase\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mavg\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcoalesce\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcount\u001b[22;86H\u001b[38;2;230;230;230;48;2;24;27;34m>\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.948375,"o","\u001b[19;22H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[38.991115,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mauthors\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mno such table or alias\u001b[22;25Hin scope:\u001b[22;35H`authors`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;86H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.032436,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.074896,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.117168,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.156325,"o","\u001b[19;23H\u001b[38;2;255;107;107;48;2;24;27;34mbooks\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.202292,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[19;23Hbooks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.244691,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mauthors\u001b[19;23Hbooks\u001b[19;29H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mno such table or alias in scope: `authors`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.286547,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.328622,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.370312,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.412576,"o","\u001b[19;33H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.452052,"o","\u001b[19;34H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.492727,"o","\u001b[19;35H\u001b[38;2;86;182;194;48;2;24;27;34mf\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.536977,"o","\u001b[19;36H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.577043,"o","\u001b[19;37H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.620472,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[19;23Hbooks\u001b[19;35H\u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.660677,"o","\u001b[19;39H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.703861,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mauthors\u001b[19;23Hbooks\u001b[19;40Hb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.745006,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.787432,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.830179,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.872185,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[19;40Hbooks\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mno such table or alias in scope: `authors`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.914347,"o","\u001b[19;45H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.956113,"o","\u001b[19;46H\u001b[38;2;86;182;194;48;2;24;27;34mj\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[39.998382,"o","\u001b[19;47H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.040391,"o","\u001b[19;48H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.084832,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[19;46H\u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.125152,"o","\u001b[19;50H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.164971,"o","\u001b[19;51H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.21121,"o","\u001b[19;52H\u001b[38;2;86;182;194;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.252924,"o","\u001b[19;53H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.294917,"o","\u001b[19;54H\u001b[38;2;86;182;194;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.33681,"o","\u001b[19;55H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.376767,"o","\u001b[19;56H\u001b[38;2;86;182;194;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.419096,"o","\u001b[19;57H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.460871,"o","\u001b[19;58H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mas\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.502936,"o","\u001b[19;59H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.54436,"o","\u001b[19;59H\u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.584912,"o","\u001b[19;61H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnull\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtrue\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfalse\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mexists\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcase\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mavg\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcoalesce\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcount\u001b[22;86H\u001b[38;2;230;230;230;48;2;24;27;34m>\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.628201,"o","\u001b[19;62H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;86H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.670559,"o","\u001b[19;63H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.711729,"o","\u001b[19;64H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.756873,"o","\u001b[19;65H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.79882,"o","\u001b[19;66H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m`books` is a table — write `books.<column>` to reference one of its columns\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.836242,"o","\u001b[19;62H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbook_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.879646,"o","\u001b[19;68H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;11H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.924636,"o","\u001b[19;69H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[40.964601,"o","\u001b[19;70H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.006419,"o","\u001b[19;71H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.048441,"o","\u001b[19;72H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.090631,"o","\u001b[19;73H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.130652,"o","\u001b[19;74H\u001b[38;2;255;107;107;48;2;24;27;34m_\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.173324,"o","\u001b[19;75H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.216269,"o","\u001b[19;68H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.258581,"o","\u001b[19;77H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mleft\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mright\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfull\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcross\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minner\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwhere\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mgroup\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mhaving\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munion\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mintersect\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mexcept\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mlimit\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.300286,"o","\u001b[19;78H\u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnull\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtru\u001b[22;41Hfalse\u001b[22;47Hexists\u001b[22;54Hcase\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mavg\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcoalesce\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcount\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mdate\u001b[38;2;230;230;230;48;2;24;27;34m >\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.342743,"o","\u001b[19;79H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.382915,"o","\u001b[19;80H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;20H\u001b[27m\u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mavg\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;87H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.426467,"o","\u001b[19;81H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;19H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.469901,"o","\u001b[19;82H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.510102,"o","\u001b[19;2H\u001b[38;2;139;144;154;48;2;24;27;34m<\u001b[19;4H\u001b[38;2;199;146;234;48;2;24;27;34mct\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mti\u001b[19;30Hle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[19;78H\u001b[38;2;255;107;107;48;2;24;27;34mauth\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.552597,"o","\u001b[19;3H\u001b[38;2;199;146;234;48;2;24;27;34mct\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;23Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;40Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;62Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mautho\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.595928,"o","\u001b[19;3H\u001b[38;2;199;146;234;48;2;24;27;34mt\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;22Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;39Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;61Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mauthor\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.6348,"o","\u001b[19;3H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;21Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;38Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;60Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mauthors\u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34m`authors`\u001b[22;12His a table — write `authors.<column>` to reference one of its columns\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.679178,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;20Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;37Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;59Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[22;2H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[22;12Hname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.720573,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34muthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;19Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;36Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;58Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[22;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.76158,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;18Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;35Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;57Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mau\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.80538,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mhors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;17Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;34Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;56Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34maut\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.846705,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;16Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;33Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;55Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mauth\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.887371,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mrs\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;15Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;32Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;54Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mautho\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.932783,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;14Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;31Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;53Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mauthor\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[41.972676,"o","\u001b[19;3H\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;13Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;30Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;52Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mauthor_\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.016092,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;12Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;29Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;51Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mauthor_i\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.056746,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mame\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;11Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;28Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;50Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.098633,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mme\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;10Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;27Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;49Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[38;2;199;146;234;48;2;24;27;34mleft\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mright\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfull\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcross\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minner\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwhere\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mgroup\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mhaving\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munion\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mintersect\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mexcept\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mlimit\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.141039,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;9Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;26Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;48Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[22;2H\u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.18257,"o","\u001b[19;3H\u001b[38;2;139;144;154;48;2;24;27;34m,\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;8Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;25Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;47Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mor\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.224978,"o","\u001b[19;3H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;7Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;24Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;46Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mord\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.266183,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;6Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;23Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;45Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34morde\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.308285,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[19;5Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;22Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;44Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.350819,"o","\u001b[19;4H\u001b[38;2;86;182;194;48;2;24;27;34mks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;21Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;43Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.392514,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;20Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;42Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.434482,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;19Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;41Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.477105,"o","\u001b[19;3H\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;18Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;40Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mnull\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtrue\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfalse\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mexists\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcase\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mavg\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcoalesce\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mcount\u001b[22;86H\u001b[38;2;230;230;230;48;2;24;27;34m>\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.520316,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;17Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;39Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[22;20H\u001b[38;2;130;207;253;48;2;24;27;34mabs\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;130;207;253;48;2;24;27;34mavg\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;86H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.559547,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;16Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;38Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mau\u001b[22;19H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.602022,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mtle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;15Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;37Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34maut\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.644078,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;14Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;36Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mauth\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.685655,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;13Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;35Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mautho\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.729419,"o","\u001b[19;3H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;12Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;34Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mauthor\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.77221,"o","\u001b[19;3H\u001b[38;2;199;146;234;48;2;24;27;34mfrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;11Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;33Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;255;107;107;48;2;24;27;34mauthors\u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34m`authors`\u001b[22;12His a table — write `authors.<column>` to reference one of its columns\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.812325,"o","\u001b[19;3H\u001b[38;2;199;146;234;48;2;24;27;34mrom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;10Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;32Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[22;2H\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[22;12Hname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.854552,"o","\u001b[19;3H\u001b[38;2;199;146;234;48;2;24;27;34mom\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;9Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;31Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[22;2H\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.899792,"o","\u001b[19;3H\u001b[38;2;199;146;234;48;2;24;27;34mm\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;8Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;30Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mna\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.939569,"o","\u001b[19;3H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;7Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;29Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;255;107;107;48;2;24;27;34mnam\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[42.979652,"o","\u001b[19;3H\u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;6Hks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mjoin\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mon\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbo\u001b[19;28Hks\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m=\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mauthor_id\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34morder\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mby\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mauthors\u001b[38;2;139;144;154;48;2;24;27;34m.\u001b[38;2;86;182;194;48;2;24;27;34mname\u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[43.020671,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m├\u001b[2;23H┼\u001b[2;43H┤\u001b[3;13H 1\u001b[3;25HUrsula\u001b[3;32HK.\u001b[3;35HLe\u001b[3;38HGuin\u001b[4;11H│ 2 │ Italo Calvino │\u001b[5;11H└───────────┴───────────────────┘\u001b[6;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[6;16Hdata\u001b[6;21H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[6;31H \u001b[6;43H \u001b[7;11H┌\u001b[7;21H┬\u001b[7;23H─\u001b[7;43H──────┬───────────┐\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ book_id\u001b[8;21H│ title\u001b[8;49H│\u001b[8;51Hauthor_id\u001b[8;61H│\u001b[9;11H├\u001b[9;21H┼\u001b[9;49H┼\u001b[9;61H┤\u001b[10;13H 1\u001b[10;23HA Wizard\u001b[10;32Hof\u001b[10;35HEarthsea\u001b[10;51H 1\u001b[11;11H│ 2 │ The Left Hand of Darkness │ 1 │\u001b[12;19H3\u001b[12;23HInv\u001b[12;27Hsible Cities \u001b[12;59H2\u001b[13;11H└─────────┴─"]
[43.02073,"o","──────────────────────────┴───────────┘\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mmode:\u001b[14;17Hadvanced \u001b[14;33H \u001b[14;49H \u001b[14;59H \u001b[14;61H \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;2H\u001b[22m\u001b[38;2;255;158;107;48;2;24;27;34m[advanced] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: select authors.name, books.title from books\u001b[15;66Hjoin\u001b[15;71Hauthors\u001b[15;79Ho\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mbooks.auth\u001b[16;13Hr_id = \u001b[16;21Huthors.author_id\u001b[16;38Horder\u001b[16;44Hby\u001b[16;47Hauthors.name\u001b[19;2H\u001b[7m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;22H \u001b[19;25H \u001b[19;41H \u001b[19;43H \u001b[19;61H \u001b[19;67H \u001b[19;70H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[43.026088,"o","\u001b[2;21H\u001b[38;2;230;230;230;48;2;24;27;34m┼\u001b[2;23H─\u001b[2;43H──────┼───────────┤\u001b[3;19H1\u001b[3;21H│\u001b[3;23HA\u001b[3;25HWizard\u001b[3;32Hof\u001b[3;35HEarthsea \u001b[3;49H│\u001b[3;59H1\u001b[3;61H│\u001b[4;19H2\u001b[4;21H│\u001b[4;23HThe Left Hand \u001b[4;38Hf\u001b[4;40HDarkness\u001b[4;49H│\u001b[4;59H1\u001b[4;61H│\u001b[5;11H│ 3 │ Invisible Cities \u001b[5;49H│\u001b[5;59H2\u001b[5;61H│\u001b[6;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└─────────┴───────────────────────────┴───────────┘\u001b[7;11Hmode: advanced \u001b[8;2H\u001b[38;2;255;158;107;48;2;24;27;34m[advanced] \u001b[38;2;230;230;230;48;2;24;27;34mselect authors.name,\u001b[8;34Hbooks.title\u001b[8;46Hfrom\u001b[8;51Hbooks join authors\u001b[8;70Hon\u001b[8;73Hbooks.author_id\u001b[8;89H=\u001b[9;2Hauthors.author_id order by authors.name\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;11H┌──────"]
[43.026168,"o","─────────────┬───────────────────────────┐\u001b[10;61H \u001b[11;13Hname\u001b[11;19H \u001b[11;21H \u001b[11;23H \u001b[11;27H │ title \u001b[11;40H \u001b[11;49H \u001b[11;59H│\u001b[11;61H \u001b[12;11H├───────────────────┼───────────────────────────┤\u001b[12;61H \u001b[13;11H│ Italo Calvino │ Invisible Cities │ \u001b[14;11H│ Ursula K. Le\u001b[14;26HGuin\u001b[14;31H│\u001b[14;33HA\u001b[14;35HWizard\u001b[14;42Hof\u001b[14;45HEarthsea\u001b[14;59H│\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ Ursula K. Le Guin │ The Left Hand of Darkness │ \u001b[15;66H \u001b[15;71H \u001b[15;79H \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────────────────┴───────────────────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[43.031976,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[43.038366,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[43.04363,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[44.045185,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[44.524311,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.705927,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.747694,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.791333,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.834665,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.873633,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.913984,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.958312,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[45.998285,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.041889,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.083461,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.126372,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.167225,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.211976,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.253772,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.295827,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.337806,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.379969,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.422064,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.461147,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.503806,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.548224,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.586372,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.631675,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.670448,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.712332,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.755613,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.79845,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.839475,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.880628,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.922255,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[46.968153,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.010339,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.04926,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.09156,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.136208,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.176722,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.218468,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.260356,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.302206,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.344737,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.387001,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.427075,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.468139,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.510785,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.553831,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.598136,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.640418,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.679706,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.724158,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.76992,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.808188,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.847742,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.88843,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.931564,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[47.974091,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.01635,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.057779,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.100175,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.140233,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.184252,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.224369,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.2681,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.31214,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.354085,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[48.39683,"o","\u001b[12;47H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[13;47H Each book paired with its author, joined \u001b[14;47H across the two tables. \u001b[15;47H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[49.39476,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[51.683843,"o","\u001b[12;47H\u001b[38;2;230;230;230;48;2;24;27;34m────────────┤ \u001b[13;47Hes │ \u001b[14;47Hrthsea │ \u001b[15;47Hof Darkness │ \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[53.183843,"o",""]
+272
View File
@@ -0,0 +1,272 @@
{"version":2,"width":90,"height":26,"timestamp":1781556534,"title":"Simple mode, then advanced — with the SQL the playground runs for you","env":{"TERM":"tmux-256color","SHELL":"/usr/bin/bash"}}
[0,"o","\u001b[?1049h"]
[0.005602,"o","\u001b[1;1H\u001b[38;2;74;82;101;48;2;24;27;34m╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Output \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m────────────────────────────────────────────────────────────────────────────────╮\u001b[2;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[3;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[4;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[5;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[6;"]
[0.005664,"o","1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[7;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[8;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[9;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[10;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[11;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[12;1H│\u001b[38;2;230;230;230;48;2;24;27;34"]
[0.005724,"o","m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[13;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[14;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[15;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[16;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[17;1H╰─────────────────────────────────────────────────────────────────────────────"]
[0.005782,"o","───────────╯\u001b[18;1H╭ \u001b[1m\u001b[38;2;110;196;255;48;2;24;27;34mSIMPLE\u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m ────────────────────────────────────────────────────────────────────────────────╮\u001b[19;1H│\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[20;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[21;1H╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Hint \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m──────────────────────────────────────"]
[0.005876,"o","────────────────────────────────────────────╮\u001b[22;1H│\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[23;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[24;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[25;1H\u001b[38;2;139;144;154;48;2;24;27;34mProject: \u001b[1m[TEMP] \u001b[38;2;230;230;230;48;2;24;27;34mFinding Sleepy Finch\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m complete · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m run \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.009208,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.010322,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.045972,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcopy\u001b[22;7Hchange\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.091047,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.135182,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.180832,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.225453,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.270622,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.31495,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;110;196;255;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mm:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.360159,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.40506,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.45261,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.495108,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.540505,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.585727,"o","\u001b[19;14H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.630866,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.675552,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.720595,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.765401,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.810487,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.855619,"o","\u001b[19;20H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.900094,"o","\u001b[19;21H\u001b[38;2;255;107;107;48;2;24;27;34mw\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.945562,"o","\u001b[19;22H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.990535,"o","\u001b[19;23H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.035585,"o","\u001b[19;21H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.080578,"o","\u001b[19;25H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.126024,"o","\u001b[19;26H\u001b[38;2;255;107;107;48;2;24;27;34mp\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.170908,"o","\u001b[19;26H\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.215329,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[2;20H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[2;27Htable\u001b[2;33H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[2;39H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[2;44Hpk\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;15H \u001b[19;21H \u001b[19;26H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.231279,"o","\u001b[2;11H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtabl\u001b[2;23H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[2;44H \u001b[3;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks\u001b[4;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌──────┬────────┬─────────────┐\u001b[5;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[5;13HName\u001b[5;18H│\u001b[5;20HType\u001b[5;27H│\u001b[5;29HConstraints\u001b[5;41H│\u001b[6;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├──────┼────────┼─────────────┤\u001b[7;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[7;13Hid\u001b[7;18H│\u001b[7;20Hserial\u001b[7;27H│\u001b[7;29HPK\u001b[7;41H│\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└──────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.23355,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.235535,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.237583,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.006413,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.05129,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.096034,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.141343,"o","\u001b[19;5H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mconstraint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m1:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.186041,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mconstrai\u001b[22;18Ht\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.230898,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.276574,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.321162,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.366133,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.4114,"o","\u001b[19;6H\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.456033,"o","\u001b[19;12H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.500912,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.546471,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.59077,"o","\u001b[19;13H\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.63632,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;7H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.681104,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.716695,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.725652,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.771093,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.816083,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.861712,"o","\u001b[19;21H\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name, then `(`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.906036,"o","\u001b[19;22H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.950953,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.996361,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.042347,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.085732,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.131094,"o","\u001b[19;27H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.175819,"o","\u001b[19;28H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.221241,"o","\u001b[19;29H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.266461,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.311636,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.356754,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mx\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.401186,"o","\u001b[19;30H\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.44737,"o","\u001b[19;34H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.490832,"o","\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[9;20H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[9;24Hcolumn\u001b[9;31Hto\u001b[9;34H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[9;41H\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[9;47H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;6H \u001b[19;13H \u001b[19;16H \u001b[19;23H \u001b[19;29H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.508032,"o","\u001b[9;11H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;47H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks\u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────┬────────┬─────────────┐\u001b[12;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[12;13HName\u001b[12;19H│\u001b[12;21HType\u001b[12;28H│\u001b[12;30HConstraints\u001b[12;42H│\u001b[13;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├───────┼────────┼─────────────┤\u001b[14;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[14;13Hid\u001b[14;19H│\u001b[14;21Hserial\u001b[14;28H│\u001b[14;30HPK\u001b[14;42H│\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[15;13Htitle\u001b[15;19H│\u001b[15;21Htext\u001b[15;28H│\u001b[15;42H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.510375,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.512468,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.514597,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.383132,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.426091,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.474404,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.516908,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.561335,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.606021,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.651613,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.695919,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.74118,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.786492,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.831561,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.876383,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.922141,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.966021,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.992961,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.011328,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.056261,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.102247,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.145896,"o","\u001b[19;19H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.191505,"o","\u001b[19;20H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mid\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.236305,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.281559,"o","\u001b[19;22H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.326526,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.371657,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.416351,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.461402,"o","\u001b[19;26H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.506327,"o","\u001b[19;27H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.553035,"o","\u001b[19;28H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.596757,"o","\u001b[19;29H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.642224,"o","\u001b[19;30H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.687314,"o","\u001b[19;31H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.732449,"o","\u001b[19;32H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.776781,"o","\u001b[19;28H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.821867,"o","\u001b[19;34H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.866419,"o","\u001b[19;35H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.911595,"o","\u001b[19;36H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.957918,"o","\u001b[19;37H\u001b[38;2;255;107;107;48;2;24;27;34mA\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.00276,"o","\u001b[19;38H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g.\u001b[22;42H'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.048092,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mW\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.093002,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.137866,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34mz\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.182114,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.22691,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.272637,"o","\u001b[19;44H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.31681,"o","\u001b[19;45H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g.\u001b[22;42H'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.362395,"o","\u001b[19;46H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.407287,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34mf\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.452426,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g.\u001b[22;42H'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.498367,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34mE\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.54289,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.587882,"o","\u001b[19;51H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.636037,"o","\u001b[19;52H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.679653,"o","\u001b[19;53H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.725118,"o","\u001b[19;54H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.7715,"o","\u001b[19;55H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.813112,"o","\u001b[19;56H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.858311,"o","\u001b[19;36H\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.90372,"o","\u001b[19;58H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.946388,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;18H \u001b[2;24H \u001b[2;30H \u001b[2;35H \u001b[3;11H┌──────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├──────┼────────┼─────────────┤\u001b[6;11H│ id │ serial │ PK │\u001b[7;11H└──────┴────────┴─────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[9;22H \u001b[9;25H \u001b[9;32H \u001b[9;38H \u001b[10;11H┌───────┬────────┬─────────────┐\u001b[11;11H│ Name │ Type │ Constraints │\u001b[12;11H├───────┼────────┼─────────────┤\u001b[13;11H│ id │ serial │ PK │\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;13H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mtitle\u001b[14;21Ht\u001b[14;23Hxt \u001b[14;30H \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[16;46H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[16;53H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;20H \u001b[19;28H \u001b[19;35H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.964856,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[2;22Hto\u001b[2;25H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[2;32H\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[2;38H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;11H\u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[4;11H┌───────┬────────┬─────────────┐\u001b[5;11H│ Name │ Type │ Constraints │\u001b[6;11H├───────┼────────┼─────────────┤\u001b[7;11H│ id │ serial │ PK │\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ title │ text │ \u001b[8;32H \u001b[8;38H │ \u001b[9;11H└───────┴────────┴─────────────┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[10;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;13H1 row(s) inserted \u001b[11;42H \u001b[12;11H┌\u001b[12;16H┬\u001b[12;19H─\u001b[12;28H─\u001b[12;39H┐ \u001b[13;16H│\u001b[13;18Htitl\u001b[13;23H \u001b[13;28H \u001b[13;30H \u001b[13;39H│\u001b[13;42H \u001b[14;11H├────┼──────────────────────┤\u001b[14;42H \u001b[15;11H│ 1 │ A Wizard of Earthsea │ \u001b[16;2H\u001b[38;2;159;216"]
[7.964881,"o",";145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘ \u001b[16;46H \u001b[16;53H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.967361,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.969787,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.972355,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.686639,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.731989,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.777608,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.822721,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.867147,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.912409,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.957609,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.002627,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.047696,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.092834,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.138386,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.182329,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.227374,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.272004,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.317476,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.361859,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.407686,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.448543,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.453062,"o","\u001b[19;19H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.497825,"o","\u001b[19;20H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mid\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.54304,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.587611,"o","\u001b[19;22H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.631853,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.677279,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.721511,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.766601,"o","\u001b[19;26H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.812763,"o","\u001b[19;27H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.857566,"o","\u001b[19;28H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.903332,"o","\u001b[19;29H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.946708,"o","\u001b[19;30H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.993148,"o","\u001b[19;31H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.03758,"o","\u001b[19;32H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.081372,"o","\u001b[19;28H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.127723,"o","\u001b[19;34H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.172202,"o","\u001b[19;35H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.217871,"o","\u001b[19;36H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.262791,"o","\u001b[19;37H\u001b[38;2;255;107;107;48;2;24;27;34mI\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.307928,"o","\u001b[19;38H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.352388,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.398232,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.443557,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.487671,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.53202,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.577814,"o","\u001b[19;44H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.623569,"o","\u001b[19;45H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.667235,"o","\u001b[19;46H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g.\u001b[22;42H'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.713722,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34mC\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.758009,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.803316,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.847437,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.892637,"o","\u001b[19;51H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.937528,"o","\u001b[19;52H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.982402,"o","\u001b[19;36H\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.027561,"o","\u001b[19;54H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.072595,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;22H \u001b[2;25H \u001b[2;32H \u001b[2;38H \u001b[3;11H┌───────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├───────┼────────┼─────────────┤\u001b[6;11H│ id │ serial │ PK │\u001b[7;13Htitle\u001b[7;21Ht\u001b[7;23Hxt \u001b[7;30H \u001b[8;11H└───────┴────────┴─────────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues"]
[11.073108,"o","\u001b[9;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[10;37H \u001b[10;44H \u001b[11;11H┌────┬──────────────────────┐\u001b[12;11H│ id │ title │\u001b[13;11H├────┼──────────────────────┤\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ 1 │ A Wizard of Earthsea │\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[16;46H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[16;53H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;20H \u001b[19;28H \u001b[19;35H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.089401,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[3;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[4;13H1 row(s) inserted \u001b[4;42H \u001b[5;11H┌\u001b[5;16H┬\u001b[5;19H─\u001b[5;28H─\u001b[5;39H┐ \u001b[6;16H│\u001b[6;18Htitl\u001b[6;23H \u001b[6;28H \u001b[6;30H \u001b[6;39H│\u001b[6;42H \u001b[7;11H├────┼──────────────────────┤\u001b[7;42H \u001b[8;11H│ 1 │ A Wizard of Earthsea │ \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘ \u001b[9;44H \u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[10;37H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[10;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[12;11H┌────┬──────────────────┐\u001b[12;39H \u001b[13;11H│ id │ title │ \u001b[14;11H├────┼──────────────────┤ \u001b[14;39H \u001b[15;11H│ 2 │ Invisible Cities │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────┘ \u001b[16;38H \u001b[16;46H \u001b[16;53H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.092877,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.096094,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.099392,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.100787,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.261863,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.306581,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.352729,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.398463,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.442154,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.486904,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.533448,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.574106,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.577083,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.621446,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.666238,"o","\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.712277,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.758163,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.802233,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.848435,"o","\u001b[19;15H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.892609,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.938105,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[2;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;37H \u001b[3;44H \u001b[4;11H┌────┬──────────────────────┐\u001b[5;11H│ id │ title │\u001b[6;11H├────┼──────────────────────┤\u001b[7;11H│ 1 │ A Wizard of Earthsea │\u001b[8;11H└────┴──────────────────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[9;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[10;37H \u001b[10;44H \u001b[11;11H┌────┬──────────────────┐\u001b[12;11H│ id │ title │\u001b[13;11H├────┼──────────────────┤\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ 2 │ Invisible Cities │\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[19;12H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.942609,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘ \u001b[2;44H \u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[3;37H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[3;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[5;11H┌────┬──────────────────┐\u001b[5;39H \u001b[6;11H│ id │ title │ \u001b[7;11H├────┼──────────────────┤ \u001b[7;39H \u001b[8;11H│ 2 │ Invisible Cities │ \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────┘\u001b[9;37H \u001b[9;44H \u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;35H────┐\u001b[12;35H \u001b[12;39H│\u001b[13;35H────┤\u001b[14;14H1\u001b[14;18HA W\u001b[14;22Hzard of Earthsea\u001b[14;39H│\u001b[15;11H│ 2 │ Invisible Cities \u001b[15;39H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.946228,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.949853,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.953526,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.95632,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.437495,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.627404,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mmode\u001b[22;7Hmessages\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.671673,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.720721,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.76424,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mmode\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.806604,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msimple\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34madvanced\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.851691,"o","\u001b[19;7H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madvanced\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.897267,"o","\u001b[19;8H\u001b[38;2;86;182;194;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.942864,"o","\u001b[19;9H\u001b[38;2;86;182;194;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.988799,"o","\u001b[19;10H\u001b[38;2;86;182;194;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.0331,"o","\u001b[19;11H\u001b[38;2;86;182;194;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.077998,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.122932,"o","\u001b[19;13H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.168466,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34madvanced\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.16779,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.360032,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[2;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'Invisible Cities'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;37H \u001b[3;44H \u001b[4;11H┌────┬──────────────────┐\u001b[5;11H│ id │ title │\u001b[6;11H├────┼──────────────────┤\u001b[7;11H│ 2 │ Invisible Cities │\u001b[8;11H└────┴─────────────"]
[16.360139,"o","─────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌────┬──────────────────────┐\u001b[11;11H│ id │ title │\u001b[12;11H├────┼──────────────────────┤\u001b[13;11H│ 1 │ A Wizard of Earthsea │\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;14H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m2\u001b[14;18HInv\u001b[14;22Hsible Cities \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m "]
[16.360194,"o","\u001b[16;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mmode: advanced \u001b[18;1H\u001b[38;2;224;96;96;48;2;24;27;34m╭ \u001b[1m\u001b[38;2;255;158;107;48;2;24;27;34mADVANCED\u001b[22m\u001b[38;2;224;96;96;48;2;24;27;34m ──────────────────────────────────────────────────────────────────────────────╮\u001b[19;1H│\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;7H \u001b[19;90H\u001b[38;2;224;96;96;48;2;24;27;34m│\u001b[20;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sid"]
[16.360229,"o","ebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.361104,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.747308,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[22;17Hselect\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.791473,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.837769,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.86055,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.881961,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.927327,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.972564,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.017519,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.061914,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.106924,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.152251,"o","\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.197666,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.242135,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.287153,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.33382,"o","\u001b[19;15H\u001b[38;2;255;107;107;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.376629,"o","\u001b[19;12H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.423309,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[2;37H \u001b[2;44H \u001b[3;11H┌────┬──────────────────┐\u001b[4;11H│ id │ title │\u001b[5;11H├────┼──────────────────┤\u001b[6;11H│ 2 │ Invisible Cities │\u001b[7;11H└────┴──────────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌────┬──────────────────────┐\u001b[10;11H│ id │ title │\u001b[11;11H├────┼────"]
[18.42343,"o","──────────────────┤\u001b[12;11H│ 1 │ A Wizard of Earthsea │\u001b[13;14H2\u001b[13;18HInv\u001b[13;22Hsible Cities \u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mmode: advanced \u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;255;158;107;48;2;24;27;34m[advanced] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: show\u001b[16;27Hdata\u001b[16;32Hbooks\u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[19;12H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.428704,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m┌────┬──────────────────────┐\u001b[3;11H│ id │ title \u001b[3;39H│\u001b[4;11H├────┼──────────────────────┤\u001b[5;11H│ 1 │ A Wizard of Earthsea\u001b[5;39H│\u001b[6;35H \u001b[6;39H│\u001b[7;35H────┘\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mmode: advanced \u001b[9;2H\u001b[38;2;255;158;107;48;2;24;27;34m[advanced] \u001b[38;2;230;230;230;48;2;24;27;34mshow data books\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;11H\u001b[38;2;139;144;154;48;2;24;27;34mExecuting SQL: \u001b[38;2;199;146;234;48;2;24;27;34mSELECT\u001b[10;33H\u001b[38;2;139;144;154;48;2;24;27;34m*\u001b[10;35H\u001b[38;2;199;146;234;48;2;24;27;34mFROM\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m┌\u001b[11;16H┬\u001b[11;39H┐\u001b[12;13Hid\u001b[12;18Htitle \u001b[12;27H \u001b[12;30H \u001b[13;11H├────┼──────────────────────┤\u001b[14;11H│ 1 │ A Wizard of Earthsea │\u001b[15;11H│ 2 │ Invisible\u001b[15;28HCities\u001b[15;39H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.433612,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.438812,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.443926,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.444844,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.923984,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.915214,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.415214,"o",""]
+262
View File
@@ -0,0 +1,262 @@
{"version":2,"width":90,"height":26,"timestamp":1781556513,"title":"Save a project, start fresh, then load it back","env":{"SHELL":"/usr/bin/bash","TERM":"tmux-256color"}}
[0,"o","\u001b[?1049h"]
[0.009452,"o","\u001b[1;1H\u001b[38;2;74;82;101;48;2;24;27;34m╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Output \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m────────────────────────────────────────────────────────────────────────────────╮\u001b[2;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[3;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[4;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[5;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[6;"]
[0.009512,"o","1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[7;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[8;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[9;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[10;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[11;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[12;1H│\u001b[38;2;230;230;230;48;2;24;27;34"]
[0.009582,"o","m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[13;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[14;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[15;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[16;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[17;1H╰─────────────────────────────────────────────────────────────────────────────"]
[0.009636,"o","───────────╯\u001b[18;1H╭ \u001b[1m\u001b[38;2;110;196;255;48;2;24;27;34mSIMPLE\u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m ────────────────────────────────────────────────────────────────────────────────╮\u001b[19;1H│\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[20;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[21;1H╭\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m Hint \u001b[22m\u001b[38;2;74;82;101;48;2;24;27;34m──────────────────────────────────────"]
[0.009699,"o","────────────────────────────────────────────╮\u001b[22;1H│\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[23;1H│\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;74;82;101;48;2;24;27;34m│\u001b[24;1H╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[25;1H\u001b[38;2;139;144;154;48;2;24;27;34mProject: \u001b[1m[TEMP] \u001b[38;2;230;230;230;48;2;24;27;34mLake Quill Cosmic\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;"]
[0.009731,"o","34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m complete · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m run \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.011318,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[0.014337,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.032534,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcopy\u001b[22;7Hchange\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.076435,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.122582,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.166431,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.213396,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.258864,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.301174,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;110;196;255;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mm:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.346273,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.390927,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.436712,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.481575,"o","\u001b[19;12H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.526079,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.572043,"o","\u001b[19;14H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.618322,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.660925,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.707507,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.751411,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.79593,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.841165,"o","\u001b[19;20H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.886356,"o","\u001b[19;21H\u001b[38;2;255;107;107;48;2;24;27;34mw\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.945386,"o","\u001b[19;22H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[1.981285,"o","\u001b[19;23H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.025295,"o","\u001b[19;21H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.070144,"o","\u001b[19;25H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.111405,"o","\u001b[19;26H\u001b[38;2;255;107;107;48;2;24;27;34mp\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.158302,"o","\u001b[19;26H\u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.206026,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[2;20H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[2;27Htable\u001b[2;33H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[2;39H\u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[2;44Hpk\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;15H \u001b[19;21H \u001b[19;26H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.220416,"o","\u001b[2;11H\u001b[38;2;199;146;234;48;2;24;27;34mcreate\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtabl\u001b[2;23H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mwith\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mpk\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[2;44H \u001b[3;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks\u001b[4;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌──────┬────────┬─────────────┐\u001b[5;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[5;13HName\u001b[5;18H│\u001b[5;20HType\u001b[5;27H│\u001b[5;29HConstraints\u001b[5;41H│\u001b[6;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├──────┼────────┼─────────────┤\u001b[7;2H\u001b[38;2;159;"]
[2.22729,"o","216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[7;13Hid\u001b[7;18H│\u001b[7;20Hserial\u001b[7;27H│\u001b[7;29HPK\u001b[7;41H│\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└──────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.232222,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.894975,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.936352,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[2.986279,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.026567,"o","\u001b[19;5H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mconstraint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34m1:n\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.073971,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mc\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;9H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mconstrai\u001b[22;18Ht\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.116454,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.161288,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;8H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.206697,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.251334,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mm\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.296689,"o","\u001b[19;6H\u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.342311,"o","\u001b[19;12H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.387382,"o","\u001b[19;13H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.43379,"o","\u001b[19;14H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;4H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.477188,"o","\u001b[19;13H\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.521321,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;7H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.566893,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.612863,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.656588,"o","\u001b[19;19H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.702635,"o","\u001b[19;20H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.705839,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.74622,"o","\u001b[19;21H\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mType a name, then `(`\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.791285,"o","\u001b[19;22H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.836474,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.885682,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.926166,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[3.97121,"o","\u001b[19;26H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.016397,"o","\u001b[19;27H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.061558,"o","\u001b[19;28H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.106183,"o","\u001b[19;29H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mint\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mreal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdecimal\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mbool\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdate\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdatetime\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mblob\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mserial\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mshortid\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.151499,"o","\u001b[19;30H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.196664,"o","\u001b[19;31H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.24428,"o","\u001b[19;32H\u001b[38;2;86;182;194;48;2;24;27;34mx\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.287318,"o","\u001b[19;30H\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.331966,"o","\u001b[19;34H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnot\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34munique\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mdefault\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcheck\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.376374,"o","\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning:\u001b[9;20H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[9;24Hcolumn\u001b[9;31Hto\u001b[9;34H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[9;41H\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[9;47H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;6H \u001b[19;13H \u001b[19;16H \u001b[19;23H \u001b[19;29H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a command — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.392031,"o","\u001b[9;11H\u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;47H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks\u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌───────┬────────┬─────────────┐\u001b[12;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[12;13HName\u001b[12;19H│\u001b[12;21HType\u001b[12;28H│\u001b[12;30HConstraints\u001b[12;42H│\u001b[13;2H\u001b[38;2;"]
[4.39328,"o","159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m├───────┼────────┼─────────────┤\u001b[14;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[14;13Hid\u001b[14;19H│\u001b[14;21Hserial\u001b[14;28H│\u001b[14;30HPK\u001b[14;42H│\u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[15;13Htitle\u001b[15;19H│\u001b[15;21Htext\u001b[15;28H│\u001b[15;42H│\u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.395595,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[4.401282,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.167688,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mimport\u001b[22;9Hinsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.215259,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnse\u001b[22;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.256539,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.301944,"o","\u001b[19;5H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.350291,"o","\u001b[19;6H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.395643,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.436357,"o","\u001b[19;8H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;4H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.48247,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.526673,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.576286,"o","\u001b[19;11H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.619174,"o","\u001b[19;9H\u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.661377,"o","\u001b[19;13H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.707346,"o","\u001b[19;14H\u001b[38;2;86;182;194;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.752224,"o","\u001b[19;15H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.799926,"o","\u001b[19;16H\u001b[38;2;86;182;194;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.841497,"o","\u001b[19;17H\u001b[38;2;86;182;194;48;2;24;27;34mk\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.878146,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.889288,"o","\u001b[19;18H\u001b[38;2;86;182;194;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.934709,"o","\u001b[19;19H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[38;2;139;144;154;48;2;24;27;34m (\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[5.977885,"o","\u001b[19;20H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mid\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.026291,"o","\u001b[19;21H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.068327,"o","\u001b[19;22H\u001b[38;2;86;182;194;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.113952,"o","\u001b[19;23H\u001b[38;2;86;182;194;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.160289,"o","\u001b[19;24H\u001b[38;2;86;182;194;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.202482,"o","\u001b[19;25H\u001b[38;2;86;182;194;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.246939,"o","\u001b[19;26H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.291926,"o","\u001b[19;27H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.3373,"o","\u001b[19;28H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.382183,"o","\u001b[19;29H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.428335,"o","\u001b[19;30H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.471946,"o","\u001b[19;31H\u001b[38;2;255;107;107;48;2;24;27;34mu\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.519168,"o","\u001b[19;32H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.563306,"o","\u001b[19;28H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.607288,"o","\u001b[19;34H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.652097,"o","\u001b[19;35H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted string (e.g. 'Alice') or null\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.697142,"o","\u001b[19;36H\u001b[38;2;255;107;107;48;2;24;27;34m'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.743197,"o","\u001b[19;37H\u001b[38;2;255;107;107;48;2;24;27;34mA\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.787663,"o","\u001b[19;38H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g.\u001b[22;42H'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.833425,"o","\u001b[19;39H\u001b[38;2;255;107;107;48;2;24;27;34mW\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.877812,"o","\u001b[19;40H\u001b[38;2;255;107;107;48;2;24;27;34mi\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.92365,"o","\u001b[19;41H\u001b[38;2;255;107;107;48;2;24;27;34mz\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[6.967876,"o","\u001b[19;42H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.013885,"o","\u001b[19;43H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.058029,"o","\u001b[19;44H\u001b[38;2;255;107;107;48;2;24;27;34md\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.103192,"o","\u001b[19;45H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g.\u001b[22;42H'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.147679,"o","\u001b[19;46H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.192796,"o","\u001b[19;47H\u001b[38;2;255;107;107;48;2;24;27;34mf\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.237869,"o","\u001b[19;48H\u001b[38;2;255;107;107;48;2;24;27;34m \u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mfor `title`: Type a quoted s\u001b[22;31Hring (e.g.\u001b[22;42H'Alice') or null\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.283032,"o","\u001b[19;49H\u001b[38;2;255;107;107;48;2;24;27;34mE\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mafter `insert into books (ti\u001b[22;31Hle) values\u001b[22;42H(`, expected string literal or `null` — usage:\u001b[23;2Hinsert into <Table> [(<col>[, ...])] [values] (<value>[, ...])\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.327505,"o","\u001b[19;50H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.373231,"o","\u001b[19;51H\u001b[38;2;255;107;107;48;2;24;27;34mr\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.4182,"o","\u001b[19;52H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.463382,"o","\u001b[19;53H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.508137,"o","\u001b[19;54H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.5532,"o","\u001b[19;55H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.598749,"o","\u001b[19;56H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.643158,"o","\u001b[19;36H\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mNext:\u001b[22;9H)`\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[23;2H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.688071,"o","\u001b[19;58H\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.733219,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;18H \u001b[2;24H \u001b[2;30H \u001b[2;35H \u001b[3;11H┌──────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├──────┼────────┼─────────────┤\u001b[6;11H│ id │ serial │ PK │\u001b[7;11H└──────┴────────┴─────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27"]
[7.733284,"o",";34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[9;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[9;22H \u001b[9;25H \u001b[9;32H \u001b[9;38H \u001b[10;11H┌───────┬────────┬─────────────┐\u001b[11;11H│ Name │ Type │ Constraints │\u001b[12;11H├───────┼────────┼─────────────┤\u001b[13;11H│ id │ serial │ PK │\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;13H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mtitle\u001b[14;21Ht\u001b[14;23Hxt \u001b[14;30H \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;"]
[7.733348,"o","2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[16;46H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[16;53H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[19;2H\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[19;9H \u001b[19;14H \u001b[19;20H \u001b[19;28H \u001b[19;35H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.75304,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34madd\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mcolumn\u001b[2;22Hto\u001b[2;25H\u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;139;144;154;48;2;24;27;34m:\u001b[2;32H\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[2;38H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;240;143;192;48;2;24;27;34mtext\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;11H\u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[4;11H┌───────┬────────┬─────────────┐\u001b[5;11H│ Name │ Type │ Constraints │\u001b[6;11H├───────┼────────┼─────────────┤\u001b[7;11H│ id │ serial │ PK │\u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m│ title │ text │ \u001b[8;32H \u001b[8;38H │ \u001b[9;11H└───────┴────────┴─────────────┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[10;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[11;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;13H1 row(s) inserted \u001b[11;42H \u001b[12;11H┌\u001b[12;16H┬\u001b[12;19H─\u001b[12;28H─\u001b[12;39H┐ \u001b[13;16H│\u001b[13;18Htitl\u001b[13;23H \u001b[13;28H \u001b[13;30H \u001b[13;39H│\u001b[13;42H \u001b[14;11H├────┼──────────────────────┤\u001b[14;42H \u001b[15;11H│ 1 │ A Wizard of Earthsea │ \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m└────┴──────────────────────┘ \u001b[16;46H \u001b[16;53H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.756529,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.759874,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[7.762592,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.623623,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.66809,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.712302,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.761256,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.803216,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.847318,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mt\u001b[22;4Hble\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.892684,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.93714,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[8.982301,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.027984,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.072634,"o","\u001b[19;12H\u001b[38;2;199;146;234;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.117525,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mbooks \u001b[2;22H \u001b[2;25H \u001b[2;32H \u001b[2;38H \u001b[3;11H┌───────┬────────┬─────────────┐\u001b[4;11H│ Name │ Type │ Constraints │\u001b[5;11H├───────┼────────┼─────────────┤\u001b[6;11H│ id │ serial │ PK │\u001b[7;13Htitle\u001b[7;21Ht\u001b[7;23Hxt \u001b[7;30H \u001b[8;11H└───────┴────────┴─────────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues"]
[9.117608,"o","\u001b[9;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[10;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[10;37H \u001b[10;44H \u001b[11;11H┌────┬──────────────────────┐\u001b[12;11H│ id │ title │\u001b[13;11H├────┼──────────────────────┤\u001b[14;11H│ 1 │ A Wizard of Earthsea │\u001b[15;11H└────┴──────────────────────┘\u001b[16;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunning: \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.120952,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m│ Name\u001b[2;19H│\u001b[2;21HType\u001b[2;28H│\u001b[2;30HConstraints\u001b[2;42H│\u001b[3;11H├\u001b[3;19H┼\u001b[3;28H┼\u001b[3;42H┤\u001b[4;13Hid \u001b[4;21Hserial\u001b[4;30HPK \u001b[5;11H│ title │ text │ │\u001b[6;11H└───────┴────────┴─────────────┘\u001b[7;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[7;37H\u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[7;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[8;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[9;2H\u001b[38;2;159;216;145;48;2;24"]
[9.120995,"o",";27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m┌────┬──────────────────────┐ \u001b[9;44H \u001b[10;11H│\u001b[10;13Hid │ title \u001b[10;39H│\u001b[11;11H├\u001b[11;16H┼\u001b[11;39H┤\u001b[12;13H 1\u001b[12;18HA Wizard\u001b[12;27Hof\u001b[12;30HEarthsea\u001b[13;11H└\u001b[13;16H┴\u001b[13;39H┘\u001b[14;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[14;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;27H \u001b[14;30H \u001b[14;39H \u001b[15;11HTables (1): \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m books \u001b[16;20H \u001b[16;25H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.12404,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.127271,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[9.130379,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.13175,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[10.618348,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.208387,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.253176,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;6H\u001b[27m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.298182,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mv\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.342215,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.388293,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mas\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.433176,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.479165,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mas\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[11.522998,"o","\u001b[9;11H\u001b[38;2;230;230;230;48;2;24;27;34m╭\u001b[1m Save as \u001b[9;39H\u001b[22m─────────────────────────────────────────╮\u001b[10;13H \u001b[10;16H \u001b[10;18H \u001b[10;39H \u001b[10;80H│\u001b[11;11H│Name (under data dir/projects)\u001b[11;43Hor\u001b[11;46Habsolute\u001b[11;55Hpath:\u001b[11;80H│\u001b[12;14H \u001b[12;16H \u001b[12;18H \u001b[12;20H \u001b[12;27H \u001b[12;30H \u001b[12;39H \u001b[12;80H│\u001b[13;11H│> █ \u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│ \u001b[14;16H \u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[1mEnter\u001b[15;18H\u001b[22mconfirm\u001b[15;28H\u001b[38;2;139;144;154;48;2;24;27;34mEsc cancel\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[16;13H \u001b[16;80H│\u001b[17;11H╰───────────────────────────────────────────────"]
[11.52308,"o","─────────────────────╯\u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.523688,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.712429,"o","\u001b[13;14H\u001b[38;2;230;230;230;48;2;24;27;34ml█\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.758108,"o","\u001b[13;15H\u001b[38;2;230;230;230;48;2;24;27;34mi█\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.802914,"o","\u001b[13;16H\u001b[38;2;230;230;230;48;2;24;27;34mb█\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.84755,"o","\u001b[13;17H\u001b[38;2;230;230;230;48;2;24;27;34mr█\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.892817,"o","\u001b[13;18H\u001b[38;2;230;230;230;48;2;24;27;34ma█\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.938699,"o","\u001b[13;19H\u001b[38;2;230;230;230;48;2;24;27;34mr█\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[12.982784,"o","\u001b[13;20H\u001b[38;2;230;230;230;48;2;24;27;34my█\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.023504,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m│ \u001b[14;80H│ \u001b[15;80H│ \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[13.983199,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.583339,"o","\u001b[9;11H\u001b[38;2;230;230;230;48;2;24;27;34m┌────┬────\u001b[9;39H┐ \u001b[10;13Hid\u001b[10;16H│\u001b[10;18Htitle\u001b[10;39H│\u001b[10;80H \u001b[11;11H├────┼──────────────────────┤ \u001b[11;43H \u001b[11;46H \u001b[11;55H \u001b[11;80H \u001b[12;14H1\u001b[12;16H│\u001b[12;18HA\u001b[12;20HWizard\u001b[12;27Hof\u001b[12;30HEarthsea\u001b[12;39H│\u001b[12;80H \u001b[13;11H└────┴──────────────────────┘\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[14;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mTables\u001b[15;18H(1): \u001b[15;28H \u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[16;13Hbooks\u001b[16;80H \u001b[17;11H\u001b[38;2;74;82;101;48;2;24;27;34m──────────────────────────────────────────────────────────────────────\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.586771,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m├───────┼────────┼─────────────┤\u001b[3;11H│ id │ serial │ PK │\u001b[4;13Htitle\u001b[4;21Ht\u001b[4;23Hxt \u001b[4;30H \u001b[5;11H└───────┴────────┴─────────────┘\u001b[6;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[6;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[7;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[7;37H \u001b[7;44H \u001b[8;11H┌────┬──────────────────────┐\u001b[9;11H│ id │ title │\u001b[10;11H├────┼──────────────────────┤\u001b[11;11H│ 1 │ A Wizard of Earthsea │\u001b[12;11H└────┴──────────────────────┘\u001b[13;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mTables (1): \u001b[15;11H \u001b[15;14Hooks \u001b[16;11H[ok] now\u001b[16;20Hediting:\u001b[16;29HLibrary\u001b[25;10H\u001b[1mLibrary\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.589881,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.593034,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[14.596086,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[15.597453,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.084422,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.262361,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34mn\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mnew\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.308139,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34me\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[16.35287,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mnew\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.353905,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.579036,"o","\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.583686,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m│ id │ serial │ PK │\u001b[3;13Htitle\u001b[3;21Ht\u001b[3;23Hxt \u001b[3;30H \u001b[4;11H└───────┴────────┴─────────────┘\u001b[5;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[5;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[6;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[6;37H \u001b[6;44H \u001b[7;11H┌────┬────────────────"]
[17.583777,"o","──────┐\u001b[8;11H│ id │ title │\u001b[9;11H├────┼──────────────────────┤\u001b[10;11H│ 1 │ A Wizard of Earthsea │\u001b[11;11H└────┴──────────────────────┘\u001b[12;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[13;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mTables (1): \u001b[14;11H \u001b[14;14Hooks \u001b[15;11H[ok] now\u001b[15;20Hediting:\u001b[15;29HLibrary\u001b[16;29HR\u001b[16;31Hpple Peaceful\u001b[16;45HCrystal\u001b[25;10H\u001b[1m\u001b[38;2;139;144;154;48;2;24;27;34m[TEMP] \u001b[38;2;230;230;230;48;2;24;27;34mRipple Peaceful Crystal\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.588092,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.592232,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[17.596297,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[18.596059,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.07839,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.133681,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.17822,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.222712,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.267862,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.31421,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.35721,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mt\u001b[22;4Hble\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.402906,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.448324,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.494085,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.538058,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.583159,"o","\u001b[19;12H\u001b[38;2;199;146;234;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.62828,"o","\u001b[2;13H\u001b[38;2;230;230;230;48;2;24;27;34mtitle\u001b[2;21Ht\u001b[2;23Hxt \u001b[2;30H \u001b[3;11H└───────┴────────┴─────────────┘\u001b[4;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[4;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[5;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[5;37H \u001b[5;44H \u001b[6;11H┌────┬──────────────────────┐\u001b[7;11H│ id │ title "]
[19.628334,"o"," │\u001b[8;11H├────┼──────────────────────┤\u001b[9;11H│ 1 │ A Wizard of Earthsea │\u001b[10;11H└────┴──────────────────────┘\u001b[11;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[12;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mTables (1): \u001b[13;11H \u001b[13;14Hooks \u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m[ok] now\u001b[14;20Hediting:\u001b[14;29HLibrary\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;29H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mR\u001b[15;31Hpple Peaceful\u001b[15;45HCrystal\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunni\u001b[16;17Hg:\u001b[16;20"]
[19.6284,"o","H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[16;36H \u001b[16;45H \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.632763,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m└───────┴────────┴─────────────┘\u001b[3;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[3;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[4;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[4;37H \u001b[4;44H \u001b[5;11H┌────┬──────────────────────┐\u001b[6;11H│ id │ title │\u001b[7;11H├────┼──────────────────────┤\u001b[8;11H│ 1 │ A Wizard of Earthsea │\u001b[9;11H└────┴──────────────────────┘\u001b[10;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mTables (1): \u001b[12;11H \u001b[12;14Hooks \u001b[13;11H[ok] now\u001b[13;20Hediting:\u001b[13;29HLibrary\u001b[14;29HR\u001b[14;31Hpple Peaceful\u001b[14;45HCrystal\u001b[15;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[15;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[15;29H \u001b[15;36H \u001b[15;45H \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mNo tables in this project\u001b[16;37Hyet.\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.635933,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.639083,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[19.642551,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[20.643688,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.129593,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.9188,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mload\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[21.963805,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.007412,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.053397,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mload\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.098416,"o","\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;80H [ENTER] \u001b[15;80H \u001b[19;2H\u001b[22m\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[27m \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[22.102735,"o","\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m╭\u001b[1m Load project \u001b[22m──────────────────────────────────────────────────────╮\u001b[5;11H│ \u001b[5;80H│\u001b[6;12H\u001b[1m [TEMP] Ripple Peaceful Crystal 2026-06-15 20:48\u001b[6;80H\u001b[22m│\u001b[7;11H│ Library 2026-06-15 20:48\u001b[7;80H│\u001b[8;14H [TEMP] L\u001b[8;24Hke\u001b[8;27HQuill Co\u001b[8;36Hmic \u001b[8;42H2026-06-15\u001b[8;53H20:48\u001b[8;80H│\u001b[9;11H│ \u001b[9;80H│\u001b[10;11H│\u001b[1m↑↓\u001b[22m select \u001b[1mEnter\u001b[10;30H\u001b[22mload\u001b[10;37H\u001b[1mb\u001b[10;39H\u001b[22mbrowse\u001b[10;46Hpath\u001b[10;53H\u001b[38;2;139;144;154;48;2;24;27;34mEsc cancel\u001b[10;80H\u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[11;11H│ \u001b[11;18H \u001b[11;80H│\u001b[12;11H│\u001b[12;13H \u001b[12;80H│\u001b[13;11H│ \u001b[13;16H \u001b[13;20H \u001b[13;29H \u001b[14;11H│ \u001b[14;16H \u001b[14;20H \u001b[14;29H \u001b[14;36H \u001b[14;45H \u001b[15;11H│ \u001b[15;16H \u001b[16;11H│ \u001b[16;14H \u001b[16;"]
[22.102806,"o","21H \u001b[16;24H \u001b[16;29H \u001b[16;37H \u001b[16;80H│\u001b[17;11H│ │\u001b[18;11H│ │\u001b[19;11H│\u001b[19;80H│\u001b[20;11H│ │\u001b[21;11H│ │\u001b[22;11H│ │\u001b[23;11H╰────────────────────────────────────────────────────────────────────╯\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.105683,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.489013,"o","\u001b[6;12H\u001b[38;2;230;230;230;48;2;24;27;34m [TEMP] Ripple Peaceful Crystal 2026-06-15 20:48\u001b[7;12H\u001b[1m Library 2026-06-15 20:48\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[23.599785,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m│ \u001b[14;80H│ \u001b[15;80H│ \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.490117,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.68705,"o","\u001b[4;11H\u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[5;11H┌────┬──────────────────────┐\u001b[5;80H \u001b[6;13Hid │ title \u001b[6;29H \u001b[6;38H │ \u001b[6;48H \u001b[6;59H \u001b[6;80H \u001b[7;11H├────┼──────────────────────┤ \u001b[7;80H \u001b[8;14H1 │ A Wiz\u001b[8;24Hrd\u001b[8;27Hof Earth\u001b[8;36Hea │\u001b[8;42H \u001b[8;53H \u001b[8;80H \u001b[9;11H└────┴──────────────────────┘\u001b[9;80H \u001b[10;11H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;30H \u001b[10;37H \u001b[10;39H \u001b[10;46H \u001b[10;53H \u001b[10;80H \u001b[11;11HTables\u001b[11;18H(1):\u001b[11;80H \u001b[12;11H \u001b[12;13Hbooks\u001b[12;80H \u001b[13;11H[ok]\u001b[13;16Hnow\u001b[13;20Hediting:\u001b[13;29HLibrary\u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m[ok]\u001b[14;16Hnow\u001b[14;20Hediting:\u001b[14;29HRipple\u001b[14;36HPeaceful\u001b[14;45HCrystal\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[15;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34mNo\u001b[16;14Htables\u001b[16;21Hin\u001b[16;24Hthis\u001b[16;29Hproject\u001b[16;37Hyet.\u001b[16;80H \u001b[17;11H\u001b[38;2;74;82;101;48;2;24;27;34m──────────────────────────────────────────────────────────────────────\u001b[18;11H──────────────────────────────────────────────────────────────────────\u001b[19;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;80H \u001b[20;11H\u001b[38;2;74;82;101;48;2;24;27;34m────────"]
[24.687117,"o","──────────────────────────────────────────────────────────────\u001b[21;11H──────────────────────────────────────────────────────────────────────\u001b[22;11H\u001b[38;2;139;144;154;48;2;24;27;34mmmand — press Tab for options, `help` for a list · `mode advanced` for\u001b[23;11H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.690134,"o","\u001b[2;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34minsert\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34minto\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;86;182;194;48;2;24;27;34mbooks\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;86;182;194;48;2;24;27;34mtitle\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mvalues\u001b[2;44H\u001b[38;2;139;144;154;48;2;24;27;34m(\u001b[38;2;195;232;141;48;2;24;27;34m'A Wizard of Earthsea'\u001b[38;2;139;144;154;48;2;24;27;34m)\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[3;2H[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[3;37H \u001b[3;44H \u001b[4;11H┌────┬──────────────────────┐\u001b[5;11H│ id │ title │\u001b[6;11H├────┼──────────────────────┤\u001b[7;11H│ 1 │ A Wizard of Earthsea │\u001b[8;11H└────┴──────────────────────┘\u001b[9;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[10;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mTables (1): \u001b[11;11H \u001b[11;14Hooks \u001b[12;11H[ok] now\u001b[12;20Hediting:\u001b[12;29HLibrary\u001b[13;29HR\u001b[13;31Hpple Peaceful\u001b[13;45HCrystal\u001b[14;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[14;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;29H \u001b[14;36H \u001b[14;45H \u001b[15;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mNo tables in this\u001b[15;29Hproject\u001b[15;37Hyet.\u001b[16;11H[\u001b[16;13Hk] now editing:\u001b[16;29HLibrary\u001b[16;37H \u001b[25;10H\u001b[1mLibrary\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.692736,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.695479,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[24.698078,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[25.703269,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.191274,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.567384,"o","\u001b[19;2H\u001b[38;2;255;107;107;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34msave\u001b[22;7Hshow\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mseed\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[26;1H\u001b[1mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint · \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEsc\u001b[26;17H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mclear \u001b[26;24H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-A/E\u001b[26;36H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mhome/end ·\u001b[26;48H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-W\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m del\u001b[26;60Hword · \u001b[26;69H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;75H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.613605,"o","\u001b[19;3H\u001b[38;2;255;107;107;48;2;24;27;34mh\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;3H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mhow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.662691,"o","\u001b[19;4H\u001b[38;2;255;107;107;48;2;24;27;34mo\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.703119,"o","\u001b[19;2H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.748147,"o","\u001b[19;6H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[7m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mdata\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationships\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindexes\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mrelationship\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mindex\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.792354,"o","\u001b[19;7H\u001b[38;2;255;107;107;48;2;24;27;34mt\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;199;146;234;48;2;24;27;34mt\u001b[22;4Hble\u001b[38;2;139;144;154;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.84022,"o","\u001b[19;8H\u001b[38;2;255;107;107;48;2;24;27;34ma\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.886742,"o","\u001b[19;9H\u001b[38;2;255;107;107;48;2;24;27;34mb\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.931728,"o","\u001b[19;10H\u001b[38;2;255;107;107;48;2;24;27;34ml\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[26.976264,"o","\u001b[19;7H\u001b[38;2;199;146;234;48;2;24;27;34mtable\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.018459,"o","\u001b[19;12H\u001b[38;2;199;146;234;48;2;24;27;34ms\u001b[7m\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[22;2H\u001b[27m\u001b[38;2;139;144;154;48;2;24;27;34mSubmit with Enter\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.063137,"o","\u001b[2;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m 1 row(s) inserted \u001b[2;37H \u001b[2;44H \u001b[3;11H┌────┬──────────────────────┐\u001b[4;11H│ id │ title │\u001b[5;11H├────┼──────────────────────┤\u001b[6;11H│ 1 │ A Wizard of Earthsea │\u001b[7;11H└────┴──────────────────────┘\u001b[8;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[9;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mTables (1): \u001b[10;11H \u001b[10;14Hooks \u001b[11;11H[ok] now\u001b[11;20Hediting:\u001b[11;29HLibrary\u001b[12;29HR\u001b[12;31Hpple Peaceful\u001b[12;45HCrystal\u001b[13;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] "]
[27.063221,"o","\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[13;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[13;29H \u001b[13;36H \u001b[13;45H \u001b[13;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[14;2H\u001b[22m\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34mNo tables in this\u001b[14;29Hproject\u001b[14;37Hyet.\u001b[14;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m [ENTER] \u001b[15;11H\u001b[22m\u001b[38;2;230;230;230;48;2;24;27;34m[\u001b[15;13Hk] now editing:\u001b[15;29HLibrary\u001b[15;37H \u001b[15;80H\u001b[1m\u001b[38;5;0;48;2;255;215;0m \u001b[16;2H\u001b[22m\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;230;230;230;48;2;24;27;34mrunni\u001b[16;17Hg:\u001b[16;20H\u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[19;2H\u001b[7m \u001b[27m \u001b[19;7H \u001b[22;2H\u001b[38;2;139;144;154;48;2;24;27;34mType a\u001b[22;9Hcommand — press Tab for options, `help` for a list · `mode advanced` for SQL\u001b[26;1H\u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mCtrl-O\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m sidebar \u001b[26;17H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mTab\u001b[26;24H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mcomplete ·\u001b[26;36H \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34m↑\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m history \u001b[26;48H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mF1\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34m hint \u001b[26;60H· \u001b[1m\u001b[38;2;230;230;230;48;2;24;27;34mEnter\u001b[26;69H\u001b[22m\u001b[38;2;139;144;154;48;2;24;27;34mrun \u001b[26;75H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.066191,"o","\u001b[2;11H\u001b[38;2;230;230;230;48;2;24;27;34m│\u001b[2;13Hid │ title \u001b[2;39H│\u001b[3;11H├\u001b[3;16H┼\u001b[3;39H┤\u001b[4;13H 1\u001b[4;18HA Wizard\u001b[4;27Hof\u001b[4;30HEarthsea\u001b[5;11H└\u001b[5;16H┴\u001b[5;39H┘\u001b[6;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[6;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[6;27H \u001b[6;30H \u001b[6;39H \u001b[7;11HTables (1): \u001b[8;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m books \u001b[9;11H[ok] now editing:\u001b[9;29HLibrary\u001b[10;11H[ok] now\u001b[10;20Hediting:\u001b[10;29HRipple\u001b[10;36HPeaceful\u001b[10;45HCrystal\u001b[11;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[11;16Htables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[11;29H \u001b[12;11HN\u001b[12;13H tables in this\u001b[12;29Hproject yet. \u001b[12;45H \u001b[13;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m[ok]\u001b[13;16Hnow editing:\u001b[13;29HLibrary\u001b[14;2H\u001b[38;2;110;196;255;48;2;24;27;34m[simple] \u001b[38;2;199;146;234;48;2;24;27;34mshow\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[38;2;199;146;234;48;2;24;27;34mtables\u001b[38;2;159;216;145;48;2;24;27;34m ✓\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;29H \u001b[14;37H \u001b[15;11HTables (1): \u001b[15;29H \u001b[16;2H\u001b[38;2;159;216;145;48;2;24;27;34m[system] \u001b[38;2;230;230;230;48;2;24;27;34m books \u001b[16;20H \u001b[16;25H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.069236,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.071811,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[27.07448,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.077453,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[28.563884,"o","\u001b[13;80H\u001b[38;2;230;230;230;48;2;24;27;34m \u001b[14;80H \u001b[15;80H \u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[29.356019,"o","\u001b[39m\u001b[49m\u001b[59m\u001b[0m\u001b[?25l"]
[30.856019,"o",""]

Some files were not shown because too many files have changed in this diff Show More