From 243b94648e5050505f9a4034118032f6b17e1f27 Mon Sep 17 00:00:00 2001 From: xiyang Date: Sun, 19 Nov 2023 10:28:25 +0800 Subject: [PATCH] Add doc examples --- src/binder/bind/bind_query.cpp | 1 - src/binder/binder.cpp | 12 ------- src/include/binder/binder.h | 4 --- src/planner/plan/plan_subquery.cpp | 3 ++ test/test_files/demo_db/demo_db.test | 20 +++++++++--- test/test_files/demo_db/demo_db_create.test | 27 ++++++++++++++++ test/test_files/demo_db/demo_db_delete.test | 32 ++++++++++++++++--- .../exceptions/binder/binder_error.test | 12 ++----- .../update_node/create_read_tinysnb.test | 4 +++ .../update_node/delete_tinysnb.test | 10 ++++++ test/test_files/update_node/set_read.test | 9 ++++++ 11 files changed, 98 insertions(+), 36 deletions(-) diff --git a/src/binder/bind/bind_query.cpp b/src/binder/bind/bind_query.cpp index a621a178324..e5b26cd46a9 100644 --- a/src/binder/bind/bind_query.cpp +++ b/src/binder/bind/bind_query.cpp @@ -20,7 +20,6 @@ std::unique_ptr Binder::bindQuery(const RegularQuery& regular auto boundRegularQuery = std::make_unique( regularQuery.getIsUnionAll(), normalizedSingleQueries[0]->getStatementResult()->copy()); for (auto& normalizedSingleQuery : normalizedSingleQueries) { - validateReadNotFollowUpdate(*normalizedSingleQuery); boundRegularQuery->addSingleQuery(std::move(normalizedSingleQuery)); } validateIsAllUnionOrUnionAll(*boundRegularQuery); diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index 03d8ffaeafe..9f0be140a55 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -173,18 +173,6 @@ void Binder::validateIsAllUnionOrUnionAll(const BoundRegularQuery& regularQuery) } } -void Binder::validateReadNotFollowUpdate(const NormalizedSingleQuery& singleQuery) { - bool hasSeenUpdateClause = false; - for (auto i = 0u; i < singleQuery.getNumQueryParts(); ++i) { - auto normalizedQueryPart = singleQuery.getQueryPart(i); - if (hasSeenUpdateClause && normalizedQueryPart->hasReadingClause()) { - throw BinderException( - "Read after update is not supported. Try query with multiple statements."); - } - hasSeenUpdateClause |= normalizedQueryPart->hasUpdatingClause(); - } -} - void Binder::validateTableType(table_id_t tableID, TableType expectedTableType) { if (catalog.getReadOnlyVersion()->getTableSchema(tableID)->tableType != expectedTableType) { throw BinderException("aa"); diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index f89a4e9e80c..faa16b32bb5 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -272,10 +272,6 @@ class Binder { static void validateIsAllUnionOrUnionAll(const BoundRegularQuery& regularQuery); - // We don't support read after write for simplicity. User should instead querying through - // multiple statement. - static void validateReadNotFollowUpdate(const NormalizedSingleQuery& singleQuery); - void validateTableType(common::table_id_t tableID, common::TableType expectedTableType); void validateTableExist(const std::string& tableName); diff --git a/src/planner/plan/plan_subquery.cpp b/src/planner/plan/plan_subquery.cpp index 12a50de5932..dc49290c1b4 100644 --- a/src/planner/plan/plan_subquery.cpp +++ b/src/planner/plan/plan_subquery.cpp @@ -150,6 +150,9 @@ void QueryPlanner::planSubqueryIfNecessary( if (ExpressionVisitor::hasSubquery(*expression)) { auto expressionCollector = std::make_unique(); for (auto& expr : expressionCollector->collectTopLevelSubqueryExpressions(expression)) { + if (plan.getSchema()->isExpressionInScope(*expr)) { + continue; + } planSubquery(expr, plan); } } diff --git a/test/test_files/demo_db/demo_db.test b/test/test_files/demo_db/demo_db.test index 7ebb1d954a2..e22c97ff1e4 100644 --- a/test/test_files/demo_db/demo_db.test +++ b/test/test_files/demo_db/demo_db.test @@ -5,6 +5,14 @@ -CASE DemoDBTest +-LOG CountSubquery +-STATEMENT MATCH (a:User) RETURN a.name, COUNT { MATCH (a)<-[:Follows]-(b:User) } AS num_follower ORDER BY num_follower; +---- 4 +Adam|0 +Karissa|1 +Noura|1 +Zhang|2 + -LOG Limit1 -STATEMENT MATCH (u:User) RETURN u.name ORDER BY u.age DESC LIMIT 3; ---- 3 @@ -119,13 +127,14 @@ Noura|{_NODES: [{_ID: 0:2, _LABEL: User, name: Zhang, age: 50}], _RELS: [(0:0)-{ Zhang|{_NODES: [], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2)]} Zhang|{_NODES: [{_ID: 0:1, _LABEL: User, name: Karissa, age: 40}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1),(0:1)-{_LABEL: Follows, _ID: 2:2, since: 2021}->(0:2)]} --LOG VarLengthFilter --STATEMENT MATCH p = (a:User)-[:Follows*1..2 (r, _ | WHERE r.since < 2022) ]->(b:User) WHERE a.name = 'Adam' RETURN DISTINCT b.name; +-LOG RecursiveJoinFilter +-STATEMENT MATCH p = (a:User)-[:Follows*1..2 (r, n | WHERE r.since < 2022 AND n.age > 45) ]->(b:User) + WHERE a.name = 'Adam' RETURN DISTINCT b.name, COUNT(*); ---- 2 -Karissa -Zhang +Karissa|1 +Zhang|1 --LOG VarLengthFilter2 +-LOG RecursiveJoinFilter2 -STATEMENT MATCH (a:User)-[e:Follows*1..2 (r, n | WHERE r.since > 2020 | {r.since}, {n.name})]->(b:User) WHERE a.age > 0 RETURN nodes(e), rels(e); @@ -302,6 +311,7 @@ Adam|30 ---- 1 Adam|30 + -LOG With1 -STATEMENT MATCH (a:User) WITH avg(a.age) as avgAge MATCH (b:User) WHERE b.age > avgAge RETURN *; ---- 2 diff --git a/test/test_files/demo_db/demo_db_create.test b/test/test_files/demo_db/demo_db_create.test index c545029a5cf..c48471db0ba 100644 --- a/test/test_files/demo_db/demo_db_create.test +++ b/test/test_files/demo_db/demo_db_create.test @@ -73,3 +73,30 @@ Adam|Zhang|Kitchener A|B|Toronto Karissa|Zhang|Kitchener Zhang|Noura|Guelph + +-CASE DependentCreate +-STATEMENT MATCH (a:User {name:'Adam'})<-[:Follows]-(b:User) RETURN COUNT(*) +---- 1 +0 +-STATEMENT MATCH (a:User {name:'Adam'}) + WITH a + MATCH (b:User {name:'Bob'}) CREATE (a)<-[:Follows]-(b) + WITH a, b + MATCH (c:User {name:'Zhang'}) CREATE (a)<-[:Follows]-(c) + RETURN a.name, b.name, c.name +---- 0 + +-STATEMENT MATCH (a:User {name:'Adam'})<-[:Follows]-(b:User) RETURN COUNT(*) +---- 1 +0 +-STATEMENT MATCH (a:User {name:'Adam'}) + WITH a + MATCH (b:User {name:'Karissa'}) CREATE (a)<-[e1:Follows {since:2023}]-(b) + WITH a, e1 + MATCH (c:User {name:'Zhang'}) CREATE (a)<-[e2:Follows {since:2024}]-(c) + RETURN e1.*, e2.* +---- 1 +2023|2024 +-STATEMENT MATCH (a:User {name:'Adam'})<-[:Follows]-(b:User) RETURN COUNT(*) +---- 1 +2 diff --git a/test/test_files/demo_db/demo_db_delete.test b/test/test_files/demo_db/demo_db_delete.test index 6de2ea709d6..3b8ba0405b3 100644 --- a/test/test_files/demo_db/demo_db_delete.test +++ b/test/test_files/demo_db/demo_db_delete.test @@ -9,15 +9,39 @@ -STATEMENT MATCH (u:User) RETURN COUNT(*) ---- 1 5 --STATEMENT MATCH (u:User) WHERE u.name = 'Alice' DELETE u ----- ok +-STATEMENT MATCH (u:User) WHERE u.name = 'Alice' DELETE u RETURN u.*; +---- 1 +Alice|35 -STATEMENT MATCH (u:User) RETURN COUNT(*) ---- 1 4 -CASE DeleteRelTest --STATEMENT MATCH (u:User)-[f:Follows]->(u1:User) WHERE u.name = 'Adam' AND u1.name = 'Karissa' DELETE f ----- ok +-STATEMENT MATCH (u:User)-[f:Follows]->(u1:User) WHERE u.name = 'Adam' AND u1.name = 'Karissa' DELETE f RETURN f.*; +---- 1 +2020 -STATEMENT MATCH (u:User)-[f:Follows]->(u1:User) WHERE u.name='Adam' RETURN u1.name ---- 1 Zhang + +-CASE DetachDelete +-STATEMENT MATCH ()-[]->() RETURN COUNT(*) +---- 1 +8 +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' DETACH DELETE u RETURN u; +---- 1 +{_ID: 0:0, _LABEL: User, name: Adam, age: 30} +-STATEMENT MATCH ()-[]->() RETURN COUNT(*) +---- 1 +5 + +-CASE DeleteAllTest +-STATEMENT MATCH (u:User) DETACH DELETE u RETURN u.*; +---- 4 +Adam|30 +Karissa|40 +Noura|25 +Zhang|50 +-STATEMENT MATCH ()-[]->() RETURN COUNT(*) +---- 1 +0 diff --git a/test/test_files/exceptions/binder/binder_error.test b/test/test_files/exceptions/binder/binder_error.test index 6332af96778..215a2803270 100644 --- a/test/test_files/exceptions/binder/binder_error.test +++ b/test/test_files/exceptions/binder/binder_error.test @@ -243,14 +243,6 @@ Binder exception: p1.age has data type INT64 but (STRING) was expected. ---- error Binder exception: Union and union all can't be used together. --LOG ReadAfterUpdate --STATEMENT MATCH (a:person) SET a.age = 35 WITH a MATCH (a)-[:knows]->(b:person) RETURN a.age ----- error -Binder exception: Read after update is not supported. Try query with multiple statements. --STATEMENT MATCH (a:person) WHERE a.age = 35 DELETE a WITH a MATCH (a)-[:knows]->(b:person) RETURN a.age ----- error -Binder exception: Read after update is not supported. Try query with multiple statements. - -LOG SetDataTypeMisMatch -STATEMENT MATCH (a:person) SET a.age = 'hh' ---- error @@ -554,12 +546,12 @@ Binder exception: Invalid number of arguments for macro ADD5. ---- error Binder exception: Invalid number of arguments for macro ADD4. --CASE CopyToNPYFormat +-LOG CopyToNPYFormat -STATEMENT COPY (MATCH (a:person) RETURN a) TO 'person.npy'; ---- error Binder exception: COPY TO currently only supports csv and parquet files. --CASE InvalidArgCast +-LOG InvalidArgCast -STATEMENT RETURN cast("[sdf, fsd, fad]", "STRING[]", "3rd arg"); ---- error Binder exception: Invalid number of arguments for given function CAST. Expected: 2, Actual: 3. diff --git a/test/test_files/update_node/create_read_tinysnb.test b/test/test_files/update_node/create_read_tinysnb.test index 52453a173dd..54a8914ea39 100644 --- a/test/test_files/update_node/create_read_tinysnb.test +++ b/test/test_files/update_node/create_read_tinysnb.test @@ -17,3 +17,7 @@ ---- 2 0|Alice|35|11|new|70 2|Bob|30|13|new|60 +-STATEMENT CREATE (a:person {ID: 12, age:22}) WITH a MATCH (b:person) WHERE b.age < a.age RETURN b.fName; +---- 2 +Dan +Elizabeth diff --git a/test/test_files/update_node/delete_tinysnb.test b/test/test_files/update_node/delete_tinysnb.test index 7daad744a7a..65c9a85336f 100644 --- a/test/test_files/update_node/delete_tinysnb.test +++ b/test/test_files/update_node/delete_tinysnb.test @@ -120,3 +120,13 @@ Runtime exception: Deleted nodes has connected edges in the backward direction. -STATEMENT MATCH (a:person) RETURN COUNT(*) ---- 1 8 + +-CASE DetachDeleteRead +-STATEMENT MATCH (a) WHERE a.ID = 0 DETACH DELETE a + WITH a + MATCH (b:person) WHERE b.age > a.age + RETURN a.age, b.fName, b.age; +---- 3 +35|Carol|45 +35|Greg|40 +35|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|83 diff --git a/test/test_files/update_node/set_read.test b/test/test_files/update_node/set_read.test index fcf4277d9c2..6f3f3749509 100644 --- a/test/test_files/update_node/set_read.test +++ b/test/test_files/update_node/set_read.test @@ -55,3 +55,12 @@ Alice2021-06-30 Bob1950-05-14 Carol2000-01-01 Dan + +-CASE SetReadTest4 +-STATEMENT MATCH (a:person) WHERE a.ID = 0 + SET a.age = 22 + WITH a + MATCH (b:person) + RETURN b.fName, b.age +---- 1 +# Check if b0.age = 22