Skip to content

Commit

Permalink
Merge pull request #2034 from kuzudb/node-update-fix
Browse files Browse the repository at this point in the history
Fix create node on empty table
  • Loading branch information
acquamarin committed Sep 15, 2023
2 parents 5899d35 + 0ae9a5d commit 4514dd4
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 14 deletions.
4 changes: 3 additions & 1 deletion src/storage/local_table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,9 @@ void VarListLocalColumn::prepareCommitForChunk(node_group_idx_t nodeGroupIdx) {
varListColumn->scan(nodeGroupIdx, listColumnChunkInStorage.get());
offset_t nextOffsetToWrite = 0;
auto numNodesInGroup =
column->metadataDA->get(nodeGroupIdx, TransactionType::READ_ONLY).numValues;
nodeGroupIdx >= column->metadataDA->getNumElements() ?
0 :
column->metadataDA->get(nodeGroupIdx, TransactionType::READ_ONLY).numValues;
for (auto& [vectorIdx, localVector] : chunk->vectors) {
auto startOffsetInChunk = StorageUtils::getStartOffsetOfVectorInChunk(vectorIdx);
auto listVector = localVector->vector.get();
Expand Down
13 changes: 8 additions & 5 deletions src/storage/store/node_column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,14 @@ void NodeColumn::scan(node_group_idx_t nodeGroupIdx, ColumnChunk* columnChunk) {
if (nullColumn) {
nullColumn->scan(nodeGroupIdx, columnChunk->getNullChunk());
}
auto chunkMetadata = metadataDA->get(nodeGroupIdx, TransactionType::WRITE);
FileUtils::readFromFile(dataFH->getFileInfo(), columnChunk->getData(),
columnChunk->getNumBytes(), chunkMetadata.pageIdx * BufferPoolConstants::PAGE_4KB_SIZE);
columnChunk->setNumValues(
metadataDA->get(nodeGroupIdx, transaction::TransactionType::READ_ONLY).numValues);
if (nodeGroupIdx >= metadataDA->getNumElements()) {
columnChunk->setNumValues(0);
} else {
auto chunkMetadata = metadataDA->get(nodeGroupIdx, TransactionType::WRITE);
FileUtils::readFromFile(dataFH->getFileInfo(), columnChunk->getData(),
columnChunk->getNumBytes(), chunkMetadata.pageIdx * BufferPoolConstants::PAGE_4KB_SIZE);
columnChunk->setNumValues(chunkMetadata.numValues);
}
}

void NodeColumn::scanInternal(
Expand Down
17 changes: 9 additions & 8 deletions src/storage/store/var_list_node_column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,16 @@ void VarListNodeColumn::scan(Transaction* transaction, node_group_idx_t nodeGrou

void VarListNodeColumn::scan(
node_group_idx_t nodeGroupIdx, kuzu::storage::ColumnChunk* columnChunk) {
NodeColumn::scan(nodeGroupIdx, columnChunk);
auto varListColumnChunk = reinterpret_cast<VarListColumnChunk*>(columnChunk);
auto numValuesInChunk =
metadataDA->get(nodeGroupIdx, transaction::TransactionType::READ_ONLY).numValues;
varListColumnChunk->setNumValues(numValuesInChunk);
varListColumnChunk->resizeDataColumnChunk(
metadataDA->get(nodeGroupIdx, transaction::TransactionType::READ_ONLY).numPages *
PageSizeClass::PAGE_4KB);
dataNodeColumn->scan(nodeGroupIdx, varListColumnChunk->getDataColumnChunk());
if (nodeGroupIdx >= metadataDA->getNumElements()) {
varListColumnChunk->setNumValues(0);
} else {
NodeColumn::scan(nodeGroupIdx, columnChunk);
auto metadata = metadataDA->get(nodeGroupIdx, transaction::TransactionType::READ_ONLY);
varListColumnChunk->setNumValues(metadata.numValues);
varListColumnChunk->resizeDataColumnChunk(metadata.numPages * PageSizeClass::PAGE_4KB);
dataNodeColumn->scan(nodeGroupIdx, varListColumnChunk->getDataColumnChunk());
}
}

void VarListNodeColumn::scanInternal(
Expand Down
16 changes: 16 additions & 0 deletions test/test_files/tinysnb/update_node/create.test
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,19 @@
{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]

0 comments on commit 4514dd4

Please sign in to comment.