Skip to content

Commit

Permalink
use separate streamvbyte library for columnar and SI
Browse files Browse the repository at this point in the history
  • Loading branch information
glookka committed Sep 8, 2023
1 parent e87f088 commit 709b9ac
Show file tree
Hide file tree
Showing 30 changed files with 1,137 additions and 509 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Expand Up @@ -158,6 +158,8 @@ endif ()
# if no fastpfor here, we can't continue, sorry...
include ( GetFastPFOR )

include ( GetStreamvbyte )

# cpack project file has minor function - it checks that configured version is the same as build version
set ( CPACK_PROJECT_CONFIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/config/CPackOptions.cmake" )

Expand Down
36 changes: 36 additions & 0 deletions cmake/GetStreamvbyte.cmake
@@ -0,0 +1,36 @@
# Copyright (c) 2020-2023, Manticore Software LTD (https://manticoresearch.com)
# All rights reserved
#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set ( SVB_GITHUB "https://github.com/manticoresoftware/streamvbyte/archive/refs/heads/master.zip" )
set ( SVB_BUNDLEZIP "${LIBS_BUNDLE}/streamvbyte.zip" )

cmake_minimum_required ( VERSION 3.17 FATAL_ERROR )
include ( update_bundle )

# determine destination folder where we expect pre-built lib
find_package ( streamvbyte QUIET CONFIG )
return_if_target_found ( streamvbyte::streamvbyte "ready (no need to build)" )

# not found. Populate and prepare sources
select_nearest_url ( SVB_PLACE streamvbyte ${SVB_BUNDLEZIP} ${SVB_GITHUB} )
fetch_sources ( streamvbyte ${SVB_PLACE} STREAMVBYTE_SRC )
execute_process ( COMMAND ${CMAKE_COMMAND} -E copy_if_different "${columnar_SOURCE_DIR}/streamvbyte/CMakeLists.txt" "${STREAMVBYTE_SRC}/CMakeLists.txt" )

# build external project
get_build ( STREAMVBYTE_BUILD streamvbyte )
external_build ( streamvbyte STREAMVBYTE_SRC STREAMVBYTE_BUILD )

find_package ( streamvbyte REQUIRED CONFIG )
185 changes: 99 additions & 86 deletions columnar/accessor/accessorint.cpp

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions columnar/accessor/accessorint.h
Expand Up @@ -31,10 +31,10 @@ class Analyzer_i;
class Checker_i;
class AttributeHeader_i;

Iterator_i * CreateIteratorUint32 ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader );
Iterator_i * CreateIteratorUint64 ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader );
Iterator_i * CreateIteratorUint32 ( const AttributeHeader_i & tHeader, uint32_t uVersion, util::FileReader_c * pReader );
Iterator_i * CreateIteratorUint64 ( const AttributeHeader_i & tHeader, uint32_t uVersion, util::FileReader_c * pReader );

Analyzer_i * CreateAnalyzerInt ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader, const common::Filter_t & tSettings, bool bHaveMatchingBlocks );
Analyzer_i * CreateAnalyzerInt ( const AttributeHeader_i & tHeader, uint32_t uVersion, util::FileReader_c * pReader, const common::Filter_t & tSettings, bool bHaveMatchingBlocks );

Checker_i * CreateCheckerInt ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader, Reporter_fn & fnProgress, Reporter_fn & fnError );

Expand Down
132 changes: 80 additions & 52 deletions columnar/accessor/accessormva.cpp

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions columnar/accessor/accessormva.h
Expand Up @@ -25,8 +25,8 @@ class Analyzer_i;
class Checker_i;
class AttributeHeader_i;

Iterator_i * CreateIteratorMVA ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader );
Analyzer_i * CreateAnalyzerMVA ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader, const common::Filter_t & tSettings, bool bHaveMatchingBlocks );
Iterator_i * CreateIteratorMVA ( const AttributeHeader_i & tHeader, uint32_t uVersion, util::FileReader_c * pReader );
Analyzer_i * CreateAnalyzerMVA ( const AttributeHeader_i & tHeader, uint32_t uVersion, util::FileReader_c * pReader, const common::Filter_t & tSettings, bool bHaveMatchingBlocks );
Checker_i * CreateCheckerMva ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader, Reporter_fn & fnProgress, Reporter_fn & fnError );

} // namespace columnar
75 changes: 44 additions & 31 deletions columnar/accessor/accessorstr.cpp
Expand Up @@ -180,7 +180,7 @@ Span_T<Span_T<uint8_t>> & StoredBlock_StrConstLen_c::ReadAllSubblockValues ( int
class StoredBlock_StrTable_c
{
public:
StoredBlock_StrTable_c ( const std::string & sCodec32, const std::string & sCodec64, int iSubblockSize );
StoredBlock_StrTable_c ( const std::string & sCodec32, const std::string & sCodec64, uint32_t uVersion, int iSubblockSize );

FORCE_INLINE void ReadHeader ( FileReader_c & tReader );
FORCE_INLINE void ReadSubblock ( int iSubblockId, int iNumValues, FileReader_c & tReader );
Expand All @@ -194,12 +194,13 @@ class StoredBlock_StrTable_c
FORCE_INLINE Span_T<uint32_t> GetValueIndexes() { return m_tValuesRead; }

private:
std::unique_ptr<IntCodec_i> m_pCodec;
uint32_t m_uVersion = 0;
std::vector<std::vector<uint8_t>> m_dTableValues;
SpanResizeable_T<uint32_t> m_dTableValueLengths;
SpanResizeable_T<uint32_t> m_dTmp;
std::vector<uint32_t> m_dValueIndexes;
std::vector<uint32_t> m_dEncoded;
std::unique_ptr<IntCodec_i> m_pCodec;
Span_T<uint32_t> m_tValuesRead;

int64_t m_iValuesOffset = 0;
Expand All @@ -208,8 +209,9 @@ class StoredBlock_StrTable_c
};


StoredBlock_StrTable_c::StoredBlock_StrTable_c ( const std::string & sCodec32, const std::string & sCodec64, int iSubblockSize )
StoredBlock_StrTable_c::StoredBlock_StrTable_c ( const std::string & sCodec32, const std::string & sCodec64, uint32_t uVersion, int iSubblockSize )
: m_pCodec ( CreateIntCodec ( sCodec32, sCodec64 ) )
, m_uVersion ( uVersion )
{
m_dValueIndexes.resize(iSubblockSize);
}
Expand All @@ -218,9 +220,10 @@ StoredBlock_StrTable_c::StoredBlock_StrTable_c ( const std::string & sCodec32, c
void StoredBlock_StrTable_c::ReadHeader ( FileReader_c & tReader )
{
m_dTableValues.resize ( tReader.Read_uint8() );
m_dTableValueLengths.resize ( m_dTableValues.size() );

uint32_t uTotalSizeOfLengths = tReader.Unpack_uint32();
DecodeValues_Delta_PFOR ( m_dTableValueLengths, tReader, *m_pCodec, m_dTmp, uTotalSizeOfLengths, false );
DecodeValues_Delta_PFOR ( m_dTableValueLengths, tReader, *m_pCodec, m_dTmp, uTotalSizeOfLengths, false, m_uVersion );
for ( size_t i = 0; i < m_dTableValues.size(); i++ )
{
auto & tValue = m_dTableValues[i];
Expand Down Expand Up @@ -264,9 +267,9 @@ Span_T<uint8_t> StoredBlock_StrTable_c::GetValue ( int iIdInSubblock )
class StoredBlock_StrGeneric_c
{
public:
StoredBlock_StrGeneric_c ( const std::string & sCodec32, const std::string & sCodec64 ) : m_pCodec ( CreateIntCodec ( sCodec32, sCodec64 ) ) {}
StoredBlock_StrGeneric_c ( const std::string & sCodec32, const std::string & sCodec64, uint32_t uVersion );

FORCE_INLINE void ReadHeader ( FileReader_c & tReader );
FORCE_INLINE void ReadHeader ( FileReader_c & tReader, int iNumSubblocks );
FORCE_INLINE void ReadSubblock ( int iSubblockId, int iSubblockValues, FileReader_c & tReader );
template <bool PACK>
FORCE_INLINE Span_T<uint8_t> ReadValue ( int iIdInSubblock, FileReader_c & tReader );
Expand All @@ -277,6 +280,7 @@ class StoredBlock_StrGeneric_c

private:
std::unique_ptr<IntCodec_i> m_pCodec;
uint32_t m_uVersion = 0;
SpanResizeable_T<uint32_t> m_dTmp;
SpanResizeable_T<uint64_t> m_dOffsets;
SpanResizeable_T<uint64_t> m_dCumulativeLengths;
Expand All @@ -294,10 +298,18 @@ class StoredBlock_StrGeneric_c
};


void StoredBlock_StrGeneric_c::ReadHeader ( FileReader_c & tReader )
StoredBlock_StrGeneric_c::StoredBlock_StrGeneric_c ( const std::string & sCodec32, const std::string & sCodec64, uint32_t uVersion )
: m_pCodec ( CreateIntCodec ( sCodec32, sCodec64 ) )
, m_uVersion ( uVersion )
{}


void StoredBlock_StrGeneric_c::ReadHeader ( FileReader_c & tReader, int iNumSubblocks )
{
m_dOffsets.resize(iNumSubblocks);

uint32_t uSubblockSize = tReader.Unpack_uint32();
DecodeValues_Delta_PFOR ( m_dOffsets, tReader, *m_pCodec, m_dTmp, uSubblockSize, false );
DecodeValues_Delta_PFOR ( m_dOffsets, tReader, *m_pCodec, m_dTmp, uSubblockSize, false, m_uVersion );

m_tValuesOffset = tReader.GetPos();
}
Expand All @@ -311,6 +323,7 @@ void StoredBlock_StrGeneric_c::ReadSubblock ( int iSubblockId, int iSubblockValu
m_iSubblockId = iSubblockId;
tReader.Seek ( m_tValuesOffset+m_dOffsets[iSubblockId] );

m_dLengths.resize(iSubblockValues);
uint32_t uSubblockSize = (uint32_t)tReader.Unpack_uint64();
DecodeValues_PFOR ( m_dLengths, tReader, *m_pCodec, m_dTmp, uSubblockSize );
m_dCumulativeLengths.resize ( m_dLengths.size() );
Expand Down Expand Up @@ -397,7 +410,7 @@ class Accessor_String_c : public StoredBlockTraits_t
using BASE = StoredBlockTraits_t;

public:
Accessor_String_c ( const AttributeHeader_i & tHeader, FileReader_c * pReader );
Accessor_String_c ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader );

FORCE_INLINE void SetCurBlock ( uint32_t uBlockId );

Expand Down Expand Up @@ -434,13 +447,13 @@ class Accessor_String_c : public StoredBlockTraits_t
};


Accessor_String_c::Accessor_String_c ( const AttributeHeader_i & tHeader, FileReader_c * pReader )
Accessor_String_c::Accessor_String_c ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader )
: StoredBlockTraits_t ( tHeader.GetSettings().m_iSubblockSize )
, m_tHeader ( tHeader )
, m_pReader ( pReader )
, m_tBlockConstLen ( tHeader.GetSettings().m_iSubblockSize )
, m_tBlockTable ( tHeader.GetSettings().m_sCompressionUINT32, tHeader.GetSettings().m_sCompressionUINT64, tHeader.GetSettings().m_iSubblockSize )
, m_tBlockGeneric ( tHeader.GetSettings().m_sCompressionUINT32, tHeader.GetSettings().m_sCompressionUINT64 )
, m_tBlockTable ( tHeader.GetSettings().m_sCompressionUINT32, tHeader.GetSettings().m_sCompressionUINT64, uVersion, tHeader.GetSettings().m_iSubblockSize )
, m_tBlockGeneric ( tHeader.GetSettings().m_sCompressionUINT32, tHeader.GetSettings().m_sCompressionUINT64, uVersion )
{
assert(pReader);
}
Expand All @@ -451,6 +464,11 @@ void Accessor_String_c::SetCurBlock ( uint32_t uBlockId )
m_pReader->Seek ( m_tHeader.GetBlockOffset(uBlockId) );
m_ePacking = (StrPacking_e)m_pReader->Unpack_uint32();

m_tRequestedRowID = INVALID_ROW_ID;
m_tResult = { nullptr, 0 };

SetBlockId ( uBlockId, m_tHeader.GetNumDocs(uBlockId) );

switch ( m_ePacking )
{
case StrPacking_e::CONST:
Expand Down Expand Up @@ -478,18 +496,13 @@ void Accessor_String_c::SetCurBlock ( uint32_t uBlockId )
m_fnReadValue = &Accessor_String_c::ReadValue_Generic<false>;
m_fnReadValuePacked = &Accessor_String_c::ReadValue_Generic<true>;
m_fnGetValueLength = &Accessor_String_c::GetValueLen_Generic;
m_tBlockGeneric.ReadHeader ( *m_pReader );
m_tBlockGeneric.ReadHeader ( *m_pReader, m_iNumSubblocks );
break;

default:
assert ( 0 && "Packing not implemented yet" );
break;
}

m_tRequestedRowID = INVALID_ROW_ID;
m_tResult = { nullptr, 0 };

SetBlockId ( uBlockId, m_tHeader.GetNumDocs(uBlockId) );
}

template <typename T>
Expand All @@ -508,7 +521,7 @@ class Iterator_String_c : public Iterator_i, public Accessor_String_c
using BASE = Accessor_String_c;

public:
Iterator_String_c ( const AttributeHeader_i & tHeader, FileReader_c * pReader );
Iterator_String_c ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader );

int64_t Get ( uint32_t tRowID ) final { assert ( 0 && "INTERNAL ERROR: requesting int from string iterator" ); return 0; }
void Fetch ( const Span_T<uint32_t> & dRowIDs, Span_T<int64_t> & dValues ) final { assert ( 0 && "INTERNAL ERROR: requesting batch int from string iterator" ); }
Expand All @@ -524,8 +537,8 @@ class Iterator_String_c : public Iterator_i, public Accessor_String_c
};


Iterator_String_c::Iterator_String_c ( const AttributeHeader_i & tHeader, FileReader_c * pReader )
: Accessor_String_c ( tHeader, pReader )
Iterator_String_c::Iterator_String_c ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader )
: Accessor_String_c ( tHeader, uVersion, pReader )
{}


Expand Down Expand Up @@ -736,7 +749,7 @@ class Analyzer_String_T : public Analyzer_T<HAVE_MATCHING_BLOCKS>, public Access
using ACCESSOR = Accessor_String_c;

public:
Analyzer_String_T ( const AttributeHeader_i & tHeader, FileReader_c * pReader, const Filter_t & tSettings );
Analyzer_String_T ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader, const Filter_t & tSettings );

bool GetNextRowIdBlock ( Span_T<uint32_t> & dRowIdBlock ) final;
void AddDesc ( std::vector<IteratorDesc_t> & dDesc ) const final { dDesc.push_back ( { ACCESSOR::m_tHeader.GetName(), "ColumnarScan" } ); }
Expand All @@ -763,9 +776,9 @@ class Analyzer_String_T : public Analyzer_T<HAVE_MATCHING_BLOCKS>, public Access
};

template <bool HAVE_MATCHING_BLOCKS, bool EQ>
Analyzer_String_T<HAVE_MATCHING_BLOCKS,EQ>::Analyzer_String_T ( const AttributeHeader_i & tHeader, FileReader_c * pReader, const Filter_t & tSettings )
Analyzer_String_T<HAVE_MATCHING_BLOCKS,EQ>::Analyzer_String_T ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader, const Filter_t & tSettings )
: ANALYZER ( tHeader.GetSettings().m_iSubblockSize )
, ACCESSOR ( tHeader, pReader )
, ACCESSOR ( tHeader, uVersion, pReader )
, m_tBlockConst ( ANALYZER::m_tRowID )
, m_tBlockTable ( ANALYZER::m_tRowID )
, m_tBlockValues ( ANALYZER::m_tRowID )
Expand Down Expand Up @@ -895,23 +908,23 @@ bool Analyzer_String_T<HAVE_MATCHING_BLOCKS,EQ>::MoveToBlock ( int iNextBlock )

//////////////////////////////////////////////////////////////////////////

Iterator_i * CreateIteratorStr ( const AttributeHeader_i & tHeader, FileReader_c * pReader )
Iterator_i * CreateIteratorStr ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader )
{
return new Iterator_String_c ( tHeader, pReader );
return new Iterator_String_c ( tHeader, uVersion, pReader );
}


Analyzer_i * CreateAnalyzerStr ( const AttributeHeader_i & tHeader, FileReader_c * pReader, const Filter_t & tSettings, bool bHaveMatchingBlocks )
Analyzer_i * CreateAnalyzerStr ( const AttributeHeader_i & tHeader, uint32_t uVersion, FileReader_c * pReader, const Filter_t & tSettings, bool bHaveMatchingBlocks )
{
bool bEq = !tSettings.m_bExclude;
int iIndex = 2*( bHaveMatchingBlocks ? 1 : 0 ) + ( bEq ? 1 : 0 );

switch ( iIndex )
{
case 0: return new Analyzer_String_T<false,false> ( tHeader, pReader, tSettings );
case 1: return new Analyzer_String_T<false,true> ( tHeader, pReader, tSettings );
case 2: return new Analyzer_String_T<true, false> ( tHeader, pReader, tSettings );
case 3: return new Analyzer_String_T<true, true> ( tHeader, pReader, tSettings );
case 0: return new Analyzer_String_T<false,false> ( tHeader, uVersion, pReader, tSettings );
case 1: return new Analyzer_String_T<false,true> ( tHeader, uVersion, pReader, tSettings );
case 2: return new Analyzer_String_T<true, false> ( tHeader, uVersion, pReader, tSettings );
case 3: return new Analyzer_String_T<true, true> ( tHeader, uVersion, pReader, tSettings );
default: return nullptr;
}
}
Expand Down
4 changes: 2 additions & 2 deletions columnar/accessor/accessorstr.h
Expand Up @@ -26,8 +26,8 @@ class Analyzer_i;
class Checker_i;
class AttributeHeader_i;

Iterator_i * CreateIteratorStr ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader );
Analyzer_i * CreateAnalyzerStr ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader, const common::Filter_t & tSettings, bool bHaveMatchingBlocks );
Iterator_i * CreateIteratorStr ( const AttributeHeader_i & tHeader, uint32_t uVersion, util::FileReader_c * pReader );
Analyzer_i * CreateAnalyzerStr ( const AttributeHeader_i & tHeader, uint32_t uVersion, util::FileReader_c * pReader, const common::Filter_t & tSettings, bool bHaveMatchingBlocks );
Checker_i * CreateCheckerStr ( const AttributeHeader_i & tHeader, util::FileReader_c * pReader, Reporter_fn & fnProgress, Reporter_fn & fnError );

} // namespace columnar
41 changes: 31 additions & 10 deletions columnar/accessor/accessortraits.h
Expand Up @@ -325,25 +325,46 @@ FORCE_INLINE void AddMinValue ( util::Span_T<uint64_t> & dValues, uint64_t uMin


template <typename T>
FORCE_INLINE void DecodeValues_Delta_PFOR ( util::SpanResizeable_T<T> & dValues, util::FileReader_c & tReader, util::IntCodec_i & tCodec, util::SpanResizeable_T<uint32_t> & dTmp, uint32_t uTotalSize, bool bReadFlag )
FORCE_INLINE void DecodeValues_Delta_PFOR ( util::SpanResizeable_T<T> & dValues, util::FileReader_c & tReader, util::IntCodec_i & tCodec, util::SpanResizeable_T<uint32_t> & dTmp, uint32_t uTotalSize, bool bReadFlag, uint32_t uVersion )
{
int64_t tStart = tReader.GetPos();
uint8_t uFlags = util::to_underlying ( IntDeltaPacking_e::DELTA_ASC );
if ( bReadFlag )
uFlags = tReader.Read_uint8();

T uMin = (T)tReader.Unpack_uint64();
uint32_t uPFOREncodedSize = uint32_t ( uTotalSize - ( tReader.GetPos() - tStart ) );
assert ( uPFOREncodedSize % 4 == 0 );
bool bAsc = uFlags==util::to_underlying ( IntDeltaPacking_e::DELTA_ASC );

dTmp.resize ( uPFOREncodedSize>>2 );
tReader.Read ( (uint8_t*)dTmp.data(), (int)dTmp.size()*sizeof(dTmp[0]) );
if ( uVersion >= 11 )
{
uint32_t uPFOREncodedSize = uint32_t ( uTotalSize - ( tReader.GetPos() - tStart ) );
assert ( uPFOREncodedSize % 4 == 0 );

tCodec.Decode ( dTmp, dValues );
dTmp.resize ( uPFOREncodedSize >>2 );
tReader.Read ( (uint8_t*)dTmp.data(), (int)dTmp.size()*sizeof(dTmp[0]) );

assert ( !dValues[0] );
dValues[0] = uMin;
ComputeInverseDeltas ( dValues, uFlags==util::to_underlying ( IntDeltaPacking_e::DELTA_ASC ) );
if ( bAsc )
tCodec.DecodeDelta ( dTmp, dValues );
else
{
tCodec.Decode ( dTmp, dValues );
ComputeInverseDeltas ( dValues, false );
}
}
else
{
T uMin = (T)tReader.Unpack_uint64();
uint32_t uPFOREncodedSize = uint32_t ( uTotalSize - ( tReader.GetPos() - tStart ) );
assert ( uPFOREncodedSize % 4 == 0 );

dTmp.resize ( uPFOREncodedSize>>2 );
tReader.Read ( (uint8_t*)dTmp.data(), (int)dTmp.size()*sizeof(dTmp[0]) );

tCodec.Decode ( dTmp, dValues );

assert ( !dValues[0] );
dValues[0] = uMin;
ComputeInverseDeltas ( dValues, bAsc );
}
}

template <typename T>
Expand Down
4 changes: 2 additions & 2 deletions columnar/accessor/check.cpp
Expand Up @@ -102,7 +102,7 @@ bool StorageChecker_c::Check()
}

uint32_t uStorageVersion = m_tReader.Read_uint32();
if ( uStorageVersion!=STORAGE_VERSION )
if ( uStorageVersion > STORAGE_VERSION )
{
m_fnError ( FormatStr ( "Unable to load columnar storage: %s is v.%d, binary is v.%d", m_sFilename.c_str(), uStorageVersion, STORAGE_VERSION ).c_str() );
return false;
Expand Down Expand Up @@ -294,7 +294,7 @@ bool CheckInt32Packed ( FileReader_c & tReader, int iMin, int iMax, const std::s

bool CheckInt64 ( FileReader_c & tReader, int64_t iMin, int64_t iMax, const std::string & sMessage, int64_t & iValue, Reporter_fn & fnError )
{
iValue = (int)tReader.Read_uint64();
iValue = (int64_t)tReader.Read_uint64();
if ( iValue<iMin || iValue>iMax )
{
fnError ( FormatStr ( "%s out of bounds: %lld", sMessage.c_str(), iValue ).c_str() );
Expand Down
2 changes: 1 addition & 1 deletion columnar/builder.h
Expand Up @@ -25,7 +25,7 @@
namespace columnar
{

static const uint32_t STORAGE_VERSION = 10;
static const uint32_t STORAGE_VERSION = 11;

class Builder_i
{
Expand Down

0 comments on commit 709b9ac

Please sign in to comment.