From dbcb6f0f1c128aa8c2e6ebcb63db408e22ba18a8 Mon Sep 17 00:00:00 2001 From: Junwang Zhao Date: Tue, 30 Jun 2026 20:01:56 +0800 Subject: [PATCH] feat(pgq): add SQL/PGQ keywords closes #2393 - Add SQL/PGQ keywords from ISO/IEC 9075-16:2023(E) to `src/keywords.rs` - Add tokenizer coverage to ensure these words are recognized as keywords --- src/keywords.rs | 36 +++++++++++++++++++++++++++++++++ src/tokenizer.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/src/keywords.rs b/src/keywords.rs index c2d0a47ec..44221a874 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -98,6 +98,7 @@ define_keywords!( ACCESS, ACCOUNT, ACTION, + ACYCLIC, ADD, ADDQUOTES, ADMIN, @@ -112,6 +113,7 @@ define_keywords!( ALL, ALLOCATE, ALLOWOVERWRITE, + ALL_DIFFERENT, ALTER, ALWAYS, ANALYZE, @@ -162,6 +164,8 @@ define_keywords!( BINARY, BIND, BINDING, + BINDINGS, + BINDING_COUNT, BIT, BLANKSASNULL, BLOB, @@ -172,6 +176,7 @@ define_keywords!( BOOLEAN, BOOST, BOTH, + BOUND, BOX, BRIN, BROWSE, @@ -332,11 +337,14 @@ define_keywords!( DEREF, DESC, DESCRIBE, + DESTINATION, DETACH, DETAIL, DETERMINISTIC, DICTIONARY, + DIFFERENT, DIMENSIONS, + DIRECTED, DIRECTORY, DISABLE, DISCARD, @@ -359,8 +367,12 @@ define_keywords!( DUPLICATE, DYNAMIC, EACH, + EDGE, + EDGES, ELEMENT, ELEMENTS, + ELEMENT_ID, + ELEMENT_NUMBER, ELSE, ELSEIF, EMPTY, @@ -476,7 +488,9 @@ define_keywords!( GRANT, GRANTED, GRANTS, + GRAPH, GRAPHVIZ, + GRAPH_TABLE, GROUP, GROUPING, GROUPS, @@ -565,10 +579,13 @@ define_keywords!( JSONFILE, JSON_TABLE, JULIAN, + KEEP, KEY, KEYS, KEY_BLOCK_SIZE, KILL, + LABEL, + LABELED, LAG, LAMBDA, LANGUAGE, @@ -623,6 +640,7 @@ define_keywords!( MATCH, MATCHED, MATCHES, + MATCHNUM, MATCH_CONDITION, MATCH_RECOGNIZE, MATERIALIZE, @@ -695,6 +713,7 @@ define_keywords!( NOCREATEDB, NOCREATEROLE, NOCYCLE, + NODE, NOINHERIT, NOLOGIN, NONE, @@ -783,6 +802,9 @@ define_keywords!( PASSWORD, PAST, PATH, + PATHS, + PATH_LENGTH, + PATH_NAME, PATTERN, PCTFREE, PER, @@ -824,6 +846,12 @@ define_keywords!( PROFILE, PROGRAM, PROJECTION, + PROPERTIES, + PROPERTY, + PROPERTY_EXISTS, + PROPERTY_GRAPH_CATALOG, + PROPERTY_GRAPH_NAME, + PROPERTY_GRAPH_SCHEMA, PUBLIC, PURCHASE, PURGE, @@ -864,6 +892,8 @@ define_keywords!( REGR_SXY, REGR_SYY, REINDEX, + RELATIONSHIP, + RELATIONSHIPS, RELATIVE, RELAY, RELEASE, @@ -918,6 +948,7 @@ define_keywords!( RUN, SAFE, SAFE_CAST, + SAME, SAMPLE, SAVEPOINT, SCHEMA, @@ -957,10 +988,12 @@ define_keywords!( SHARE, SHARED, SHARING, + SHORTEST, SHOW, SIGNED, SIMILAR, SIMPLE, + SINGLETONS, SIZE, SKIP, SLOW, @@ -1072,6 +1105,7 @@ define_keywords!( TOTALS, TOTP, TRACE, + TRAIL, TRAILING, TRAN, TRANSACTION, @@ -1156,12 +1190,14 @@ define_keywords!( VERSION, VERSIONING, VERSIONS, + VERTEX, VIEW, VIEWS, VIRTUAL, VOLATILE, VOLUME, WAITFOR, + WALK, WAREHOUSE, WAREHOUSES, WEEK, diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 4c3668f8d..3e78cc20e 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -2673,6 +2673,58 @@ mod tests { compare(expected, tokens); } + #[test] + fn tokenize_sql_pgq_keywords() { + for (word, keyword) in [ + ("ACYCLIC", Keyword::ACYCLIC), + ("ALL_DIFFERENT", Keyword::ALL_DIFFERENT), + ("BINDINGS", Keyword::BINDINGS), + ("BINDING_COUNT", Keyword::BINDING_COUNT), + ("BOUND", Keyword::BOUND), + ("DESTINATION", Keyword::DESTINATION), + ("DIFFERENT", Keyword::DIFFERENT), + ("DIRECTED", Keyword::DIRECTED), + ("EDGE", Keyword::EDGE), + ("EDGES", Keyword::EDGES), + ("ELEMENT_ID", Keyword::ELEMENT_ID), + ("ELEMENT_NUMBER", Keyword::ELEMENT_NUMBER), + ("GRAPH", Keyword::GRAPH), + ("GRAPH_TABLE", Keyword::GRAPH_TABLE), + ("KEEP", Keyword::KEEP), + ("LABEL", Keyword::LABEL), + ("LABELED", Keyword::LABELED), + ("MATCHNUM", Keyword::MATCHNUM), + ("NODE", Keyword::NODE), + ("PATHS", Keyword::PATHS), + ("PATH_LENGTH", Keyword::PATH_LENGTH), + ("PATH_NAME", Keyword::PATH_NAME), + ("PROPERTIES", Keyword::PROPERTIES), + ("PROPERTY", Keyword::PROPERTY), + ("PROPERTY_EXISTS", Keyword::PROPERTY_EXISTS), + ("PROPERTY_GRAPH_CATALOG", Keyword::PROPERTY_GRAPH_CATALOG), + ("PROPERTY_GRAPH_NAME", Keyword::PROPERTY_GRAPH_NAME), + ("PROPERTY_GRAPH_SCHEMA", Keyword::PROPERTY_GRAPH_SCHEMA), + ("RELATIONSHIP", Keyword::RELATIONSHIP), + ("RELATIONSHIPS", Keyword::RELATIONSHIPS), + ("SAME", Keyword::SAME), + ("SHORTEST", Keyword::SHORTEST), + ("SINGLETONS", Keyword::SINGLETONS), + ("TRAIL", Keyword::TRAIL), + ("VERTEX", Keyword::VERTEX), + ("WALK", Keyword::WALK), + ] { + assert_eq!(Token::make_keyword(word), Token::make_word(word, None)); + assert_eq!( + Token::make_keyword(word.to_lowercase().as_str()), + Token::Word(Word { + value: word.to_lowercase(), + quote_style: None, + keyword, + }) + ); + } + } + #[test] fn tokenize_select_float() { let sql = String::from("SELECT .1");