Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix bug in generic scan rel tables #2149

Merged
merged 1 commit into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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