diff --git a/docs/adr/0009-dsl-command-syntax-conventions.md b/docs/adr/0009-dsl-command-syntax-conventions.md index 070279b..b443699 100644 --- a/docs/adr/0009-dsl-command-syntax-conventions.md +++ b/docs/adr/0009-dsl-command-syntax-conventions.md @@ -26,7 +26,7 @@ The DSL surface follows three rules. Required parts of a command are written in plain words and read like English. Examples: -- `create table with pk :` +- `create table with pk ()` - `add column to table : ()` - `drop table ` diff --git a/docs/requirements.md b/docs/requirements.md index dbff64c..da90ac7 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -209,7 +209,7 @@ group enabled. (Earlier reference points: 1006 after ADR-0024 alphabet and length range.)* - [ ] **T3** Compound primary keys handled end-to-end (DSL, storage, display, FK reference). - *(Progress: DSL grammar (`with pk a:int,b:int`), storage, and + *(Progress: DSL grammar (`with pk a(int),b(int)`), storage, and table-info description are all present; the FK iteration references single-column PKs only — compound-key FK references remain pending.)* diff --git a/src/archive.rs b/src/archive.rs index 0a8c89c..d57b666 100644 --- a/src/archive.rs +++ b/src/archive.rs @@ -519,7 +519,7 @@ mod tests { fs::write(p.join(PROJECT_YAML), "version: 1\nproject:\n created_at: 2026-01-01T00:00:00Z\ntables: []\nrelationships: []\n").unwrap(); fs::create_dir_all(p.join("data")).unwrap(); fs::write(p.join("data/Customers.csv"), "Name\nAlice\nBob\n").unwrap(); - fs::write(p.join(HISTORY_LOG), "T|ok|create table Customers with pk id:serial\n").unwrap(); + fs::write(p.join(HISTORY_LOG), "T|ok|create table Customers with pk id(serial)\n").unwrap(); fs::write(p.join(PLAYGROUND_DB), [0u8; 32]).unwrap(); fs::write(p.join(GITIGNORE), "/playground.db\n").unwrap(); // Stray atomic-write staging file — must be excluded. diff --git a/src/dsl/command.rs b/src/dsl/command.rs index 6848b13..2b5bec8 100644 --- a/src/dsl/command.rs +++ b/src/dsl/command.rs @@ -6,7 +6,7 @@ //! (e.g. "table does not exist"). //! //! The shape supports compound primary keys natively even though -//! only the dedicated `with pk a:int,b:int` grammar exposes them +//! only the dedicated `with pk a(int),b(int)` grammar exposes them //! today. Future grammar extensions (inline column specs, `set //! primary key`, junction-table convenience commands) emit into //! the same shape. diff --git a/src/dsl/grammar/ddl.rs b/src/dsl/grammar/ddl.rs index 3800408..a492104 100644 --- a/src/dsl/grammar/ddl.rs +++ b/src/dsl/grammar/ddl.rs @@ -796,7 +796,7 @@ pub static CHANGE: CommandNode = CommandNode { usage_ids: &["parse.usage.change_column"],}; // ================================================================= -// create_table — `create table [with pk [:[, ...]]]` +// create_table — `create table [with pk [()[, ...]]]` // (Phase C) // ================================================================= @@ -816,7 +816,7 @@ const COL_NAME: Node = Node::Hinted { const COL_SPEC_NODES: &[Node] = &[ COL_NAME, - Node::Punct(':'), + Node::Punct('('), Node::Ident { source: IdentSource::Types, role: "col_type", @@ -826,6 +826,7 @@ const COL_SPEC_NODES: &[Node] = &[ writes_column: false, writes_user_listed_column: false, }, + Node::Punct(')'), ]; const COL_SPEC: Node = Node::Seq(COL_SPEC_NODES); @@ -884,7 +885,7 @@ fn build_create_table(path: &MatchedPath) -> Result { let pk_specs: Vec<(String, Type)> = if names.is_empty() { if saw_with { - // `with pk` alone — default to id:serial. + // `with pk` alone — default to id(serial). vec![("id".to_string(), Type::Serial)] } else { return Err(ValidationError { diff --git a/src/dsl/parser.rs b/src/dsl/parser.rs index 0ec1463..8d68fea 100644 --- a/src/dsl/parser.rs +++ b/src/dsl/parser.rs @@ -393,7 +393,7 @@ mod tests { #[test] fn create_table_with_named_typed_pk() { assert_eq!( - ok("create table Customers with pk email:text"), + ok("create table Customers with pk email(text)"), Command::CreateTable { name: "Customers".to_string(), columns: vec![col("email", Type::Text)], @@ -405,7 +405,7 @@ mod tests { #[test] fn create_table_with_compound_pk() { assert_eq!( - ok("create table OrderLines with pk order_id:int,product_id:int"), + ok("create table OrderLines with pk order_id(int),product_id(int)"), Command::CreateTable { name: "OrderLines".to_string(), columns: vec![col("order_id", Type::Int), col("product_id", Type::Int),], @@ -417,7 +417,7 @@ mod tests { #[test] fn create_table_pk_accepts_any_user_type() { for ty in Type::all() { - let input = format!("create table T with pk col:{}", ty.keyword()); + let input = format!("create table T with pk col({})", ty.keyword()); let cmd = ok(&input); if let Command::CreateTable { columns, @@ -436,7 +436,7 @@ mod tests { #[test] fn create_table_pk_tolerates_whitespace() { assert_eq!( - ok("create table T with pk id : serial"), + ok("create table T with pk id ( serial )"), Command::CreateTable { name: "T".to_string(), columns: vec![col("id", Type::Serial)], @@ -444,7 +444,7 @@ mod tests { } ); assert_eq!( - ok("create table T with pk a : int , b : int"), + ok("create table T with pk a ( int ) , b ( int )"), Command::CreateTable { name: "T".to_string(), columns: vec![col("a", Type::Int), col("b", Type::Int)], @@ -456,7 +456,7 @@ mod tests { #[test] fn create_table_keywords_are_case_insensitive() { assert_eq!( - ok("CREATE TABLE Customers WITH PK email:TEXT"), + ok("CREATE TABLE Customers WITH PK email(TEXT)"), Command::CreateTable { name: "Customers".to_string(), columns: vec![col("email", Type::Text)], @@ -760,7 +760,7 @@ mod tests { #[test] fn unknown_pk_type_errors_with_alternatives_listed() { - let e = err("create table T with pk id:varchar"); + let e = err("create table T with pk id(varchar)"); match e { ParseError::Invalid { message, .. } => { assert!(message.contains("varchar"), "{message}"); diff --git a/src/dsl/walker/mod.rs b/src/dsl/walker/mod.rs index 92203bf..ae92774 100644 --- a/src/dsl/walker/mod.rs +++ b/src/dsl/walker/mod.rs @@ -1076,7 +1076,7 @@ mod tests { #[test] fn walker_parses_create_table_named_typed_pk() { assert_eq!( - parse("create table Customers with pk email:text").unwrap(), + parse("create table Customers with pk email(text)").unwrap(), Command::CreateTable { name: "Customers".to_string(), columns: vec![col("email", Type::Text)], @@ -1088,7 +1088,7 @@ mod tests { #[test] fn walker_parses_create_table_compound_pk() { assert_eq!( - parse("create table OrderLines with pk order_id:int,product_id:int").unwrap(), + parse("create table OrderLines with pk order_id(int),product_id(int)").unwrap(), Command::CreateTable { name: "OrderLines".to_string(), columns: vec![col("order_id", Type::Int), col("product_id", Type::Int)], @@ -1100,7 +1100,7 @@ mod tests { #[test] fn walker_create_table_pk_tolerates_whitespace_around_punct() { assert_eq!( - parse("create table T with pk id : serial").unwrap(), + parse("create table T with pk id ( serial )").unwrap(), Command::CreateTable { name: "T".to_string(), columns: vec![col("id", Type::Serial)], @@ -1108,7 +1108,7 @@ mod tests { } ); assert_eq!( - parse("create table T with pk a : int , b : int").unwrap(), + parse("create table T with pk a ( int ) , b ( int )").unwrap(), Command::CreateTable { name: "T".to_string(), columns: vec![col("a", Type::Int), col("b", Type::Int)], @@ -1134,7 +1134,7 @@ mod tests { #[test] fn walker_create_table_keywords_are_case_insensitive() { assert_eq!( - parse("CREATE TABLE Customers WITH PK email:TEXT").unwrap(), + parse("CREATE TABLE Customers WITH PK email(TEXT)").unwrap(), Command::CreateTable { name: "Customers".to_string(), columns: vec![col("email", Type::Text)], diff --git a/src/friendly/strings/en-US.yaml b/src/friendly/strings/en-US.yaml index e1708c6..23ba2de 100644 --- a/src/friendly/strings/en-US.yaml +++ b/src/friendly/strings/en-US.yaml @@ -248,7 +248,7 @@ help: messages [short|verbose] — show or switch error-message verbosity (verbose is the default) ddl: create: |- - create table with pk [:, ...] — create a table + create table with pk [(), ...] — create a table drop: |- drop table — remove a table drop column [from] [table] : [--cascade] — remove a column @@ -371,7 +371,7 @@ parse: custom: replay_path_expected: "expected a path after `replay`" create_table_needs_pk: |- - tables need at least one column. Add `with pk` for a default `id INTEGER PRIMARY KEY`, or `with pk :` to choose. Use a comma-separated list for compound primary keys. + tables need at least one column. Add `with pk` for a default `id INTEGER PRIMARY KEY`, or `with pk ()` to choose. Use a comma-separated list for compound primary keys. on_action_specified_twice: "`on {target}` specified twice" change_column_flags_exclusive: "`--force-conversion` and `--dont-convert` are mutually exclusive — pick one." unknown_type: "unknown type '{found}' (expected one of: {expected})" @@ -410,7 +410,7 @@ parse: # marks optional parts; angle-bracket `<...>` marks # placeholders. ADR-0009's surface conventions apply. usage: - create_table: "create table with pk [:[, ...]]" + create_table: "create table with pk [()[, ...]]" drop_table: "drop table " drop_column: "drop column [from] [table] : " drop_relationship: |- diff --git a/src/persistence/history.rs b/src/persistence/history.rs index ebc17ea..b91ea74 100644 --- a/src/persistence/history.rs +++ b/src/persistence/history.rs @@ -3,7 +3,7 @@ //! Format: one record per line, three pipe-separated fields: //! //! ```text -//! 2026-05-07T14:30:12Z|ok|create table Customers with pk id:serial +//! 2026-05-07T14:30:12Z|ok|create table Customers with pk id(serial) //! ``` //! //! Status is always `ok` in v1; failed commands are not @@ -196,12 +196,12 @@ mod tests { #[test] fn record_format() { let line = format_record( - "create table Customers with pk id:serial", + "create table Customers with pk id(serial)", "2026-05-07T14:30:12Z".to_string(), ); assert_eq!( line, - "2026-05-07T14:30:12Z|ok|create table Customers with pk id:serial\n", + "2026-05-07T14:30:12Z|ok|create table Customers with pk id(serial)\n", ); } diff --git a/src/persistence/mod.rs b/src/persistence/mod.rs index 8c03828..8119e85 100644 --- a/src/persistence/mod.rs +++ b/src/persistence/mod.rs @@ -395,12 +395,12 @@ mod tests { fn append_history_creates_and_appends() { let dir = tempdir(); let p = Persistence::new(dir.path().to_path_buf()); - p.append_history("create table Foo with pk id:serial").unwrap(); + p.append_history("create table Foo with pk id(serial)").unwrap(); p.append_history("insert into Foo (1)").unwrap(); let body = fs::read_to_string(dir.path().join(HISTORY_LOG)).unwrap(); let lines: Vec<&str> = body.trim_end().lines().collect(); assert_eq!(lines.len(), 2); - assert!(lines[0].ends_with("|ok|create table Foo with pk id:serial")); + assert!(lines[0].ends_with("|ok|create table Foo with pk id(serial)")); assert!(lines[1].ends_with("|ok|insert into Foo (1)")); } } diff --git a/tests/engine_vocabulary_audit.rs b/tests/engine_vocabulary_audit.rs index 21520a0..b579135 100644 --- a/tests/engine_vocabulary_audit.rs +++ b/tests/engine_vocabulary_audit.rs @@ -109,7 +109,7 @@ fn parse_errors_use_no_engine_vocabulary() { // tiny-win recipe from handoff-5). "change column Tag in Customers: Tag (text)", // unknown type token. - "create table T with pk id:varchar", + "create table T with pk id(varchar)", // mutually exclusive flags on change column. "change column T: c (int) --force-conversion --dont-convert", // missing required clause. diff --git a/tests/iteration2_persistence.rs b/tests/iteration2_persistence.rs index b1a0535..8f5c0da 100644 --- a/tests/iteration2_persistence.rs +++ b/tests/iteration2_persistence.rs @@ -70,7 +70,7 @@ fn create_table_writes_yaml_and_history() { ColumnSpec { name: "Name".to_string(), ty: Type::Text }, ], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -84,7 +84,7 @@ fn create_table_writes_yaml_and_history() { let history = read_history(&path); assert_eq!(history.len(), 1, "expected one history line; got {history:?}"); - assert!(history[0].ends_with("|ok|create table Customers with pk id:serial")); + assert!(history[0].ends_with("|ok|create table Customers with pk id(serial)")); } #[test] @@ -100,7 +100,7 @@ fn insert_writes_csv_and_history() { ColumnSpec { name: "Name".to_string(), ty: Type::Text }, ], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -136,7 +136,7 @@ fn drop_table_removes_its_csv() { "Customers".to_string(), vec![ColumnSpec { name: "id".to_string(), ty: Type::Serial }], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -174,7 +174,7 @@ fn delete_with_cascade_rewrites_both_csvs() { "Customers".to_string(), vec![ColumnSpec { name: "id".to_string(), ty: Type::Serial }], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -185,7 +185,7 @@ fn delete_with_cascade_rewrites_both_csvs() { ColumnSpec { name: "CustId".to_string(), ty: Type::Int }, ], vec!["id".to_string()], - Some("create table Orders with pk id:serial, CustId:int".to_string()), + Some("create table Orders with pk id(serial), CustId(int)".to_string()), ) .await .unwrap(); @@ -266,7 +266,7 @@ fn create_table_does_not_write_csv_for_empty_table() { ColumnSpec { name: "Name".to_string(), ty: Type::Text }, ], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -295,7 +295,7 @@ fn delete_all_rows_removes_csv() { ColumnSpec { name: "Name".to_string(), ty: Type::Text }, ], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -335,7 +335,7 @@ fn show_table_appends_history_only() { "Customers".to_string(), vec![ColumnSpec { name: "id".to_string(), ty: Type::Serial }], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -368,7 +368,7 @@ fn failed_command_does_not_append_history_or_change_yaml() { "Customers".to_string(), vec![ColumnSpec { name: "id".to_string(), ty: Type::Serial }], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -380,7 +380,7 @@ fn failed_command_does_not_append_history_or_change_yaml() { "Customers".to_string(), vec![ColumnSpec { name: "id".to_string(), ty: Type::Serial }], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .expect_err("must fail"); diff --git a/tests/iteration3_rebuild.rs b/tests/iteration3_rebuild.rs index 1f2ce6f..d7fab69 100644 --- a/tests/iteration3_rebuild.rs +++ b/tests/iteration3_rebuild.rs @@ -48,7 +48,7 @@ fn rebuild_restores_schema_only_project() { ColumnSpec { name: "Name".to_string(), ty: Type::Text }, ], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); @@ -414,7 +414,7 @@ fn rebuild_restores_indexes() { ColumnSpec { name: "Email".to_string(), ty: Type::Text }, ], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); diff --git a/tests/iteration5_export_import.rs b/tests/iteration5_export_import.rs index c0dba75..d4af456 100644 --- a/tests/iteration5_export_import.rs +++ b/tests/iteration5_export_import.rs @@ -303,7 +303,7 @@ fn end_to_end_export_then_import_real_project() { ColumnSpec { name: "Name".to_string(), ty: Type::Text }, ], vec!["id".to_string()], - Some("create table Customers with pk id:serial".to_string()), + Some("create table Customers with pk id(serial)".to_string()), ) .await .unwrap(); diff --git a/tests/replay_command.rs b/tests/replay_command.rs index 1038a22..72f910a 100644 --- a/tests/replay_command.rs +++ b/tests/replay_command.rs @@ -95,7 +95,7 @@ fn replay_three_lines_dispatches_three_commands() { write_script( project.path(), "seed.commands", - "create table T with pk id:int\n\ + "create table T with pk id(int)\n\ add column T: name (text)\n\ insert into T (1, 'Alice')\n", ); @@ -122,7 +122,7 @@ fn replay_skips_blank_lines_and_comments() { "seed.commands", "# this is a comment\n\ \n\ - create table T with pk id:int\n\ + create table T with pk id(int)\n\ \n\ # another comment\n\ # comment with leading whitespace\n\ @@ -192,7 +192,7 @@ fn replay_aborts_on_first_parse_failure_and_reports_line() { "bad.commands", // Line 1: ok. Line 2: ok. Line 3: parse error // (`broken keyword X` — not a recognised command). - "create table T with pk id:int\n\ + "create table T with pk id(int)\n\ add column T: name (text)\n\ this is not a command\n\ insert into T (1, 'should not happen')\n", @@ -248,7 +248,7 @@ fn replay_rejects_typed_slot_violation_at_parse_time() { write_script( project.path(), "typed.commands", - "create table T with pk id:int\n\ + "create table T with pk id(int)\n\ add column T: count (int)\n\ insert into T values (1, 'not a number')\n", ); @@ -285,7 +285,7 @@ fn replay_aborts_on_first_runtime_failure_and_reports_line() { "bad.commands", // Line 2 references a table that doesn't exist; the // engine refuses, replay stops and reports line 2. - "create table T with pk id:int\n\ + "create table T with pk id(int)\n\ add column NotATable: x (text)\n\ insert into T (1)\n", ); @@ -300,11 +300,11 @@ fn replay_aborts_on_first_runtime_failure_and_reports_line() { fn replay_refuses_nested_replay() { let data = tempdir(); let (project, db) = open_project_db(data.path()); - write_script(project.path(), "inner.commands", "create table T with pk id:int\n"); + write_script(project.path(), "inner.commands", "create table T with pk id(int)\n"); write_script( project.path(), "outer.commands", - "create table U with pk id:int\nreplay inner.commands\n", + "create table U with pk id(int)\nreplay inner.commands\n", ); let events = rt().block_on(async { @@ -332,7 +332,7 @@ fn replay_history_log_records_subcommands_only() { write_script( project.path(), "seed.commands", - "create table T with pk id:int\nadd column T: name (text)\n", + "create table T with pk id(int)\nadd column T: name (text)\n", ); let events = rt().block_on(async { @@ -344,7 +344,7 @@ fn replay_history_log_records_subcommands_only() { .expect("history.log exists"); // Per-command entries landed. assert!( - history.lines().any(|l| l.contains("create table T with pk id:int")), + history.lines().any(|l| l.contains("create table T with pk id(int)")), "history.log missing create line:\n{history}" ); assert!( diff --git a/tests/typing_surface/create_table.rs b/tests/typing_surface/create_table.rs index eccb1fa..c6fb1c4 100644 --- a/tests/typing_surface/create_table.rs +++ b/tests/typing_surface/create_table.rs @@ -1,4 +1,4 @@ -//! Matrix coverage for `create table T with pk [:[, ...]]` +//! Matrix coverage for `create table T with pk [()[, ...]]` //! (ADR-0005, ADR-0009). use crate::typing_surface::*; @@ -73,7 +73,7 @@ fn after_pk_word_does_not_re_offer_pk() { } #[test] -fn after_pk_space_with_col_name_typed_expects_colon() { +fn after_pk_space_with_col_name_typed_expects_paren() { let schema = schema_empty(); let a = assess_at_end("create table Customers with pk Code", &schema); assert!(matches!(a.state, InputState::IncompleteAtEof)); @@ -81,10 +81,10 @@ fn after_pk_space_with_col_name_typed_expects_colon() { } #[test] -fn after_colon_expects_type_candidates() { +fn after_paren_expects_type_candidates() { let schema = schema_empty(); let a = assess_at_end( - "create table Customers with pk Code:", + "create table Customers with pk Code(", &schema, ); assert!(matches!(a.state, InputState::IncompleteAtEof)); @@ -92,14 +92,14 @@ fn after_colon_expects_type_candidates() { &a, &["text", "int", "serial", "shortid", "bool"], ); - crate::snap!("after_colon", a); + crate::snap!("after_paren", a); } #[test] fn create_table_with_explicit_pk_parses() { let schema = schema_empty(); let a = assess_at_end( - "create table Customers with pk Code:text", + "create table Customers with pk Code(text)", &schema, ); assert!(matches!(a.state, InputState::Valid)); @@ -110,7 +110,7 @@ fn create_table_with_explicit_pk_parses() { fn create_table_with_compound_pk_parses() { let schema = schema_empty(); let a = assess_at_end( - "create table Memberships with pk UserId:int, GroupId:int", + "create table Memberships with pk UserId(int), GroupId(int)", &schema, ); assert!(matches!(a.state, InputState::Valid)); diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_colon_expects_type_candidates@after_colon.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_paren_expects_type_candidates@after_paren.snap similarity index 96% rename from tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_colon_expects_type_candidates@after_colon.snap rename to tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_paren_expects_type_candidates@after_paren.snap index c9c957f..10f02df 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_colon_expects_type_candidates@after_colon.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_paren_expects_type_candidates@after_paren.snap @@ -1,10 +1,10 @@ --- source: tests/typing_surface/create_table.rs -description: "input=\"create table Customers with pk Code:\" cursor=36" +description: "input=\"create table Customers with pk Code(\" cursor=36" expression: "& a" --- Assessment { - input: "create table Customers with pk Code:", + input: "create table Customers with pk Code(", cursor: 36, state: IncompleteAtEof, hint: Some( diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_pk_space_with_col_name_typed_expects_colon@after_col_name.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_pk_space_with_col_name_typed_expects_paren@after_col_name.snap similarity index 93% rename from tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_pk_space_with_col_name_typed_expects_colon@after_col_name.snap rename to tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_pk_space_with_col_name_typed_expects_paren@after_col_name.snap index 5aa2982..7f5b587 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_pk_space_with_col_name_typed_expects_colon@after_col_name.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__after_pk_space_with_col_name_typed_expects_paren@after_col_name.snap @@ -9,7 +9,7 @@ Assessment { state: IncompleteAtEof, hint: Some( Prose( - "Next: `:`", + "Next: `(`", ), ), completion: None, diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap index b33b5e5..5ab731a 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap @@ -1,11 +1,11 @@ --- source: tests/typing_surface/create_table.rs -description: "input=\"create table Memberships with pk UserId:int, GroupId:int\" cursor=56" +description: "input=\"create table Memberships with pk UserId(int), GroupId(int)\" cursor=58" expression: "& a" --- Assessment { - input: "create table Memberships with pk UserId:int, GroupId:int", - cursor: 56, + input: "create table Memberships with pk UserId(int), GroupId(int)", + cursor: 58, state: Valid, hint: Some( Prose( diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap index 56b1215..4113d1e 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap @@ -1,11 +1,11 @@ --- source: tests/typing_surface/create_table.rs -description: "input=\"create table Customers with pk Code:text\" cursor=40" +description: "input=\"create table Customers with pk Code(text)\" cursor=41" expression: "& a" --- Assessment { - input: "create table Customers with pk Code:text", - cursor: 40, + input: "create table Customers with pk Code(text)", + cursor: 41, state: Valid, hint: Some( Prose(