Skip to content

Commit

Permalink
Merge pull request #2149 from kuzudb/fix-issue
Browse files Browse the repository at this point in the history
Fix bug in generic scan rel tables
  • Loading branch information
ray6080 committed Oct 5, 2023
2 parents 95ca644 + 60d429f commit dab30d1
Show file tree
Hide file tree
Showing 16 changed files with 180 additions and 141 deletions.
13 changes: 2 additions & 11 deletions src/include/storage/store/rel_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,18 +98,9 @@ class DirectedRelTableData {
Column* getPropertyColumn(common::property_id_t propertyID);
Lists* getPropertyLists(common::property_id_t propertyID);

inline void scan(transaction::Transaction* transaction, RelTableScanState& scanState,
void scan(transaction::Transaction* transaction, RelTableScanState& scanState,
common::ValueVector* inNodeIDVector,
const std::vector<common::ValueVector*>& outputVectors) {
if (scanState.relStats->getNumTuples() == 0) {
return;
}
if (scanState.relTableDataType == RelTableDataType::COLUMNS) {
scanColumns(transaction, scanState, inNodeIDVector, outputVectors);
} else {
scanLists(transaction, scanState, inNodeIDVector, outputVectors);
}
}
const std::vector<common::ValueVector*>& outputVectors);
inline bool isBoundTable(common::table_id_t tableID_) const { return tableID_ == boundTableID; }

void insertRel(common::ValueVector* boundVector, common::ValueVector* nbrVector,
Expand Down
15 changes: 15 additions & 0 deletions src/storage/store/rel_table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,21 @@ void DirectedRelTableData::resetColumnsAndLists(
}
}

void DirectedRelTableData::scan(transaction::Transaction* transaction, RelTableScanState& scanState,
ValueVector* inNodeIDVector, const std::vector<ValueVector*>& outputVectors) {
if (scanState.relStats->getNumTuples() == 0) {
for (auto vector : outputVectors) {
vector->state->selVector->selectedSize = 0;
}
return;
}
if (scanState.relTableDataType == RelTableDataType::COLUMNS) {
scanColumns(transaction, scanState, inNodeIDVector, outputVectors);
} else {
scanLists(transaction, scanState, inNodeIDVector, outputVectors);
}
}

void DirectedRelTableData::scanColumns(transaction::Transaction* transaction,
RelTableScanState& scanState, ValueVector* inNodeIDVector,
const std::vector<ValueVector*>& outputVectors) {
Expand Down
54 changes: 54 additions & 0 deletions test/test_files/update_node/create_empty.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
-GROUP EmptyCreateNodeTest
-DATASET CSV empty

--

-CASE CreateStruct
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (a:test {id:1, prop:{age:10, name:'A'}})
---- ok
-STATEMENT MATCH (a:test) RETURN a.prop
---- 1
{age: 10, name: A}

-CASE CreateStructWithWriteTransaction
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT BEGIN TRANSACTION
---- ok
-STATEMENT CREATE (a:test {id:1, prop:{age:10, name:'A'}})
---- ok
-STATEMENT MATCH (a:test) RETURN a.prop
---- 1
{age: 10, name: A}
-STATEMENT COMMIT
---- ok

-CASE CreateDeleteNodeOnEmptyTable
-STATEMENT CREATE NODE TABLE emptyTable(id INT64, prop INT64[], PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (e:emptyTable {id: 0, prop: [3,2]})
---- ok
-STATEMENT MATCH (a:emptyTable) RETURN a.*
---- 1
0|[3,2]
-STATEMENT MATCH (a:emptyTable) DELETE a
---- ok
-STATEMENT CREATE (e:emptyTable {id: 2, prop: [1,5,6]})
---- ok
-STATEMENT MATCH (a:emptyTable) RETURN a.*
---- 1
2|[1,5,6]

-CASE CreateMap
-STATEMENT CREATE NODE TABLE test(name STRING, m MAP(STRING,STRING), PRIMARY KEY(name));
---- ok
-STATEMENT CREATE (t:test {name:"foo"});
---- ok
-STATEMENT CREATE (t:test {name:"foobar"});
---- ok
-STATEMENT MATCH (t:test) RETURN t.*;
---- 2
foo|
foobar|
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateNodeTest
-GROUP TinySnbCreateReadNodeTest
-DATASET CSV tinysnb

--
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateNodeTest
-GROUP TinySnbCreateNodeTest
-DATASET CSV tinysnb

--
Expand Down Expand Up @@ -139,52 +139,3 @@
11|[1,2,3]|[A,this is a long name]
9|[1]|[Grad]

-CASE CreateStruct
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (a:test {id:1, prop:{age:10, name:'A'}})
---- ok
-STATEMENT MATCH (a:test) RETURN a.prop
---- 1
{age: 10, name: A}

-CASE CreateStructWithWriteTransaction
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT BEGIN TRANSACTION
---- ok
-STATEMENT CREATE (a:test {id:1, prop:{age:10, name:'A'}})
---- ok
-STATEMENT MATCH (a:test) RETURN a.prop
---- 1
{age: 10, name: A}
-STATEMENT COMMIT
---- ok

-CASE CreateDeleteNodeOnEmptyTable
-STATEMENT CREATE NODE TABLE emptyTable(id INT64, prop INT64[], PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (e:emptyTable {id: 0, prop: [3,2]})
---- ok
-STATEMENT MATCH (a:emptyTable) RETURN a.*
---- 1
0|[3,2]
-STATEMENT MATCH (a:emptyTable) DELETE a
---- ok
-STATEMENT CREATE (e:emptyTable {id: 2, prop: [1,5,6]})
---- ok
-STATEMENT MATCH (a:emptyTable) RETURN a.*
---- 1
2|[1,5,6]

-CASE CreateMap
-STATEMENT CREATE NODE TABLE test(name STRING, m MAP(STRING,STRING), PRIMARY KEY(name));
---- ok
-STATEMENT CREATE (t:test {name:"foo"});
---- ok
-STATEMENT CREATE (t:test {name:"foobar"});
---- ok
-STATEMENT MATCH (t:test) RETURN t.*;
---- 2
foo|
foobar|
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateNodeTest
-GROUP TinySnbDeleteNodeTest
-DATASET CSV tinysnb

--
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateNodeTest
-GROUP TinySnbMergeNodeTest
-DATASET CSV tinysnb

--
Expand Down
74 changes: 74 additions & 0 deletions test/test_files/update_node/set_empty.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
-GROUP EmptySetNodeTest
-DATASET CSV empty

--

-CASE SetStructValueToNonNull
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (t:test {id:1, prop:{age:10, name:'Alice'}})
---- ok
-STATEMENT CREATE (t:test {id:2, prop:{age:20, name:'Bobdjiweknfwhuwiehfuw'}})
---- ok
-STATEMENT CREATE (t:test {id:3, prop:{age:30, name:'Delta'}})
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 10, name: Alice}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT MATCH (t:test) WHERE t.id=1 SET t.prop={age:11, name:'Alicennewjfnwefwfw'}
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 11, name: Alicennewjfnwefwfw}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}

-CASE SetStructValueWithWriteTransaction
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (t:test {id:1, prop:{age:10, name:'Alice'}})
---- ok
-STATEMENT CREATE (t:test {id:2, prop:{age:20, name:'Bobdjiweknfwhuwiehfuw'}})
---- ok
-STATEMENT CREATE (t:test {id:3, prop:{age:30, name:'Delta'}})
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 10, name: Alice}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT BEGIN TRANSACTION
---- ok
-STATEMENT MATCH (t:test) WHERE t.id=1 SET t.prop={age:11, name:'Alicennewjfnwefwfw'}
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 11, name: Alicennewjfnwefwfw}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT COMMIT
---- ok

-CASE SetStructValueToNull
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (t:test {id:1, prop:{age:10, name:'Alice'}})
---- ok
-STATEMENT CREATE (t:test {id:2, prop:{age:20, name:'Bobdjiweknfwhuwiehfuw'}})
---- ok
-STATEMENT CREATE (t:test {id:3, prop:{age:30, name:'Delta'}})
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 10, name: Alice}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT MATCH (t:test) WHERE t.id=1 SET t.prop=NULL
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3

{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateNodeTest
-GROUP TinySnbSetReadNodeTest
-DATASET CSV tinysnb

--
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateNodeTest
-GROUP TinySnbSetNodeTest
-DATASET CSV tinysnb

--
Expand Down Expand Up @@ -272,73 +272,3 @@ Runtime exception: Maximum length of strings is 4096. Input string's length is 2
-STATEMENT MATCH (a:person) WHERE a.ID=5 RETURN a.usedNames
---- 1
[abcndwjbwesdsd,microsofthbbjuwgedsd]

-CASE SetStructValueToNonNull
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (t:test {id:1, prop:{age:10, name:'Alice'}})
---- ok
-STATEMENT CREATE (t:test {id:2, prop:{age:20, name:'Bobdjiweknfwhuwiehfuw'}})
---- ok
-STATEMENT CREATE (t:test {id:3, prop:{age:30, name:'Delta'}})
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 10, name: Alice}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT MATCH (t:test) WHERE t.id=1 SET t.prop={age:11, name:'Alicennewjfnwefwfw'}
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 11, name: Alicennewjfnwefwfw}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}

-CASE SetStructValueWithWriteTransaction
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (t:test {id:1, prop:{age:10, name:'Alice'}})
---- ok
-STATEMENT CREATE (t:test {id:2, prop:{age:20, name:'Bobdjiweknfwhuwiehfuw'}})
---- ok
-STATEMENT CREATE (t:test {id:3, prop:{age:30, name:'Delta'}})
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 10, name: Alice}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT BEGIN TRANSACTION
---- ok
-STATEMENT MATCH (t:test) WHERE t.id=1 SET t.prop={age:11, name:'Alicennewjfnwefwfw'}
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 11, name: Alicennewjfnwefwfw}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT COMMIT
---- ok

-CASE SetStructValueToNull
-STATEMENT CREATE NODE TABLE test(id INT64, prop STRUCT(age INT64, name STRING), PRIMARY KEY(id));
---- ok
-STATEMENT CREATE (t:test {id:1, prop:{age:10, name:'Alice'}})
---- ok
-STATEMENT CREATE (t:test {id:2, prop:{age:20, name:'Bobdjiweknfwhuwiehfuw'}})
---- ok
-STATEMENT CREATE (t:test {id:3, prop:{age:30, name:'Delta'}})
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3
{age: 10, name: Alice}
{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
-STATEMENT MATCH (t:test) WHERE t.id=1 SET t.prop=NULL
---- ok
-STATEMENT MATCH (t:test) RETURN t.prop
---- 3

{age: 20, name: Bobdjiweknfwhuwiehfuw}
{age: 30, name: Delta}
24 changes: 24 additions & 0 deletions test/test_files/update_rel/create_empty.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
-GROUP EmptyCreateRelTest
-DATASET CSV empty

--

-CASE CreateRels
-STATEMENT CREATE NODE TABLE N1(name STRING, PRIMARY KEY(name));
---- ok
-STATEMENT CREATE NODE TABLE N2(name STRING, PRIMARY KEY(name));
---- ok
-STATEMENT CREATE REL TABLE Rel1(FROM N1 TO N2);
---- ok
-STATEMENT CREATE REL TABLE Rel2(FROM N1 TO N2);
---- ok
-STATEMENT CREATE (n1:N1 {name: "n1a"}), (n2:N2 {name: "n2a"}), (n1)-[:Rel1]->(n2);
---- ok
-STATEMENT MATCH ()-[e:Rel1]->() RETURN e;
---- 1
(0:0)-{_LABEL: Rel1, _ID: 2:0}->(1:0)
-STATEMENT MATCH ()-[e:Rel2]->() RETURN e;
---- 0
-STATEMENT MATCH ()-[e]->() RETURN e;
---- 1
(0:0)-{_LABEL: Rel1, _ID: 2:0}->(1:0)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateTest
-GROUP TinySnbCreateReadRelTest
-DATASET CSV tinysnb

--
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateRelTest
-GROUP TinySnbDeleteRelTest
-DATASET CSV tinysnb

--
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateRelTest
-GROUP TinySnbMergeRelTest
-DATASET CSV tinysnb

--
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateRelTest
-GROUP TinySnbSetReadRelTest
-DATASET CSV tinysnb

--
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-GROUP TinySnbUpdateRelTest
-GROUP TinySnbSetRelTest
-DATASET CSV tinysnb

--
Expand Down

0 comments on commit dab30d1

Please sign in to comment.