duckdb 0.3.2-dev149.0 → 0.3.2-dev175.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/duckdb.cpp +756 -27
- package/src/duckdb.hpp +9 -8
package/package.json
CHANGED
package/src/duckdb.cpp
CHANGED
|
@@ -29764,6 +29764,700 @@ void Comparators::SwizzleSingleValue(data_ptr_t data_ptr, const data_ptr_t &heap
|
|
|
29764
29764
|
}
|
|
29765
29765
|
|
|
29766
29766
|
} // namespace duckdb
|
|
29767
|
+
// DuckDB
|
|
29768
|
+
//
|
|
29769
|
+
// duckdb/common/fast_mem.hpp
|
|
29770
|
+
//
|
|
29771
|
+
//
|
|
29772
|
+
//===----------------------------------------------------------------------===//
|
|
29773
|
+
|
|
29774
|
+
|
|
29775
|
+
|
|
29776
|
+
|
|
29777
|
+
|
|
29778
|
+
|
|
29779
|
+
template <size_t SIZE>
|
|
29780
|
+
static inline void MemcpyFixed(void *dest, const void *src) {
|
|
29781
|
+
memcpy(dest, src, SIZE);
|
|
29782
|
+
}
|
|
29783
|
+
|
|
29784
|
+
template <size_t SIZE>
|
|
29785
|
+
static inline int MemcmpFixed(const void *str1, const void *str2) {
|
|
29786
|
+
return memcmp(str1, str2, SIZE);
|
|
29787
|
+
}
|
|
29788
|
+
|
|
29789
|
+
namespace duckdb {
|
|
29790
|
+
|
|
29791
|
+
//! This templated memcpy is significantly faster than std::memcpy,
|
|
29792
|
+
//! but only when you are calling memcpy with a const size in a loop.
|
|
29793
|
+
//! For instance `while (<cond>) { memcpy(<dest>, <src>, const_size); ... }`
|
|
29794
|
+
static inline void FastMemcpy(void *dest, const void *src, const size_t size) {
|
|
29795
|
+
// LCOV_EXCL_START
|
|
29796
|
+
switch (size) {
|
|
29797
|
+
case 0:
|
|
29798
|
+
return;
|
|
29799
|
+
case 1:
|
|
29800
|
+
return MemcpyFixed<1>(dest, src);
|
|
29801
|
+
case 2:
|
|
29802
|
+
return MemcpyFixed<2>(dest, src);
|
|
29803
|
+
case 3:
|
|
29804
|
+
return MemcpyFixed<3>(dest, src);
|
|
29805
|
+
case 4:
|
|
29806
|
+
return MemcpyFixed<4>(dest, src);
|
|
29807
|
+
case 5:
|
|
29808
|
+
return MemcpyFixed<5>(dest, src);
|
|
29809
|
+
case 6:
|
|
29810
|
+
return MemcpyFixed<6>(dest, src);
|
|
29811
|
+
case 7:
|
|
29812
|
+
return MemcpyFixed<7>(dest, src);
|
|
29813
|
+
case 8:
|
|
29814
|
+
return MemcpyFixed<8>(dest, src);
|
|
29815
|
+
case 9:
|
|
29816
|
+
return MemcpyFixed<9>(dest, src);
|
|
29817
|
+
case 10:
|
|
29818
|
+
return MemcpyFixed<10>(dest, src);
|
|
29819
|
+
case 11:
|
|
29820
|
+
return MemcpyFixed<11>(dest, src);
|
|
29821
|
+
case 12:
|
|
29822
|
+
return MemcpyFixed<12>(dest, src);
|
|
29823
|
+
case 13:
|
|
29824
|
+
return MemcpyFixed<13>(dest, src);
|
|
29825
|
+
case 14:
|
|
29826
|
+
return MemcpyFixed<14>(dest, src);
|
|
29827
|
+
case 15:
|
|
29828
|
+
return MemcpyFixed<15>(dest, src);
|
|
29829
|
+
case 16:
|
|
29830
|
+
return MemcpyFixed<16>(dest, src);
|
|
29831
|
+
case 17:
|
|
29832
|
+
return MemcpyFixed<17>(dest, src);
|
|
29833
|
+
case 18:
|
|
29834
|
+
return MemcpyFixed<18>(dest, src);
|
|
29835
|
+
case 19:
|
|
29836
|
+
return MemcpyFixed<19>(dest, src);
|
|
29837
|
+
case 20:
|
|
29838
|
+
return MemcpyFixed<20>(dest, src);
|
|
29839
|
+
case 21:
|
|
29840
|
+
return MemcpyFixed<21>(dest, src);
|
|
29841
|
+
case 22:
|
|
29842
|
+
return MemcpyFixed<22>(dest, src);
|
|
29843
|
+
case 23:
|
|
29844
|
+
return MemcpyFixed<23>(dest, src);
|
|
29845
|
+
case 24:
|
|
29846
|
+
return MemcpyFixed<24>(dest, src);
|
|
29847
|
+
case 25:
|
|
29848
|
+
return MemcpyFixed<25>(dest, src);
|
|
29849
|
+
case 26:
|
|
29850
|
+
return MemcpyFixed<26>(dest, src);
|
|
29851
|
+
case 27:
|
|
29852
|
+
return MemcpyFixed<27>(dest, src);
|
|
29853
|
+
case 28:
|
|
29854
|
+
return MemcpyFixed<28>(dest, src);
|
|
29855
|
+
case 29:
|
|
29856
|
+
return MemcpyFixed<29>(dest, src);
|
|
29857
|
+
case 30:
|
|
29858
|
+
return MemcpyFixed<30>(dest, src);
|
|
29859
|
+
case 31:
|
|
29860
|
+
return MemcpyFixed<31>(dest, src);
|
|
29861
|
+
case 32:
|
|
29862
|
+
return MemcpyFixed<32>(dest, src);
|
|
29863
|
+
case 33:
|
|
29864
|
+
return MemcpyFixed<33>(dest, src);
|
|
29865
|
+
case 34:
|
|
29866
|
+
return MemcpyFixed<34>(dest, src);
|
|
29867
|
+
case 35:
|
|
29868
|
+
return MemcpyFixed<35>(dest, src);
|
|
29869
|
+
case 36:
|
|
29870
|
+
return MemcpyFixed<36>(dest, src);
|
|
29871
|
+
case 37:
|
|
29872
|
+
return MemcpyFixed<37>(dest, src);
|
|
29873
|
+
case 38:
|
|
29874
|
+
return MemcpyFixed<38>(dest, src);
|
|
29875
|
+
case 39:
|
|
29876
|
+
return MemcpyFixed<39>(dest, src);
|
|
29877
|
+
case 40:
|
|
29878
|
+
return MemcpyFixed<40>(dest, src);
|
|
29879
|
+
case 41:
|
|
29880
|
+
return MemcpyFixed<41>(dest, src);
|
|
29881
|
+
case 42:
|
|
29882
|
+
return MemcpyFixed<42>(dest, src);
|
|
29883
|
+
case 43:
|
|
29884
|
+
return MemcpyFixed<43>(dest, src);
|
|
29885
|
+
case 44:
|
|
29886
|
+
return MemcpyFixed<44>(dest, src);
|
|
29887
|
+
case 45:
|
|
29888
|
+
return MemcpyFixed<45>(dest, src);
|
|
29889
|
+
case 46:
|
|
29890
|
+
return MemcpyFixed<46>(dest, src);
|
|
29891
|
+
case 47:
|
|
29892
|
+
return MemcpyFixed<47>(dest, src);
|
|
29893
|
+
case 48:
|
|
29894
|
+
return MemcpyFixed<48>(dest, src);
|
|
29895
|
+
case 49:
|
|
29896
|
+
return MemcpyFixed<49>(dest, src);
|
|
29897
|
+
case 50:
|
|
29898
|
+
return MemcpyFixed<50>(dest, src);
|
|
29899
|
+
case 51:
|
|
29900
|
+
return MemcpyFixed<51>(dest, src);
|
|
29901
|
+
case 52:
|
|
29902
|
+
return MemcpyFixed<52>(dest, src);
|
|
29903
|
+
case 53:
|
|
29904
|
+
return MemcpyFixed<53>(dest, src);
|
|
29905
|
+
case 54:
|
|
29906
|
+
return MemcpyFixed<54>(dest, src);
|
|
29907
|
+
case 55:
|
|
29908
|
+
return MemcpyFixed<55>(dest, src);
|
|
29909
|
+
case 56:
|
|
29910
|
+
return MemcpyFixed<56>(dest, src);
|
|
29911
|
+
case 57:
|
|
29912
|
+
return MemcpyFixed<57>(dest, src);
|
|
29913
|
+
case 58:
|
|
29914
|
+
return MemcpyFixed<58>(dest, src);
|
|
29915
|
+
case 59:
|
|
29916
|
+
return MemcpyFixed<59>(dest, src);
|
|
29917
|
+
case 60:
|
|
29918
|
+
return MemcpyFixed<60>(dest, src);
|
|
29919
|
+
case 61:
|
|
29920
|
+
return MemcpyFixed<61>(dest, src);
|
|
29921
|
+
case 62:
|
|
29922
|
+
return MemcpyFixed<62>(dest, src);
|
|
29923
|
+
case 63:
|
|
29924
|
+
return MemcpyFixed<63>(dest, src);
|
|
29925
|
+
case 64:
|
|
29926
|
+
return MemcpyFixed<64>(dest, src);
|
|
29927
|
+
case 65:
|
|
29928
|
+
return MemcpyFixed<65>(dest, src);
|
|
29929
|
+
case 66:
|
|
29930
|
+
return MemcpyFixed<66>(dest, src);
|
|
29931
|
+
case 67:
|
|
29932
|
+
return MemcpyFixed<67>(dest, src);
|
|
29933
|
+
case 68:
|
|
29934
|
+
return MemcpyFixed<68>(dest, src);
|
|
29935
|
+
case 69:
|
|
29936
|
+
return MemcpyFixed<69>(dest, src);
|
|
29937
|
+
case 70:
|
|
29938
|
+
return MemcpyFixed<70>(dest, src);
|
|
29939
|
+
case 71:
|
|
29940
|
+
return MemcpyFixed<71>(dest, src);
|
|
29941
|
+
case 72:
|
|
29942
|
+
return MemcpyFixed<72>(dest, src);
|
|
29943
|
+
case 73:
|
|
29944
|
+
return MemcpyFixed<73>(dest, src);
|
|
29945
|
+
case 74:
|
|
29946
|
+
return MemcpyFixed<74>(dest, src);
|
|
29947
|
+
case 75:
|
|
29948
|
+
return MemcpyFixed<75>(dest, src);
|
|
29949
|
+
case 76:
|
|
29950
|
+
return MemcpyFixed<76>(dest, src);
|
|
29951
|
+
case 77:
|
|
29952
|
+
return MemcpyFixed<77>(dest, src);
|
|
29953
|
+
case 78:
|
|
29954
|
+
return MemcpyFixed<78>(dest, src);
|
|
29955
|
+
case 79:
|
|
29956
|
+
return MemcpyFixed<79>(dest, src);
|
|
29957
|
+
case 80:
|
|
29958
|
+
return MemcpyFixed<80>(dest, src);
|
|
29959
|
+
case 81:
|
|
29960
|
+
return MemcpyFixed<81>(dest, src);
|
|
29961
|
+
case 82:
|
|
29962
|
+
return MemcpyFixed<82>(dest, src);
|
|
29963
|
+
case 83:
|
|
29964
|
+
return MemcpyFixed<83>(dest, src);
|
|
29965
|
+
case 84:
|
|
29966
|
+
return MemcpyFixed<84>(dest, src);
|
|
29967
|
+
case 85:
|
|
29968
|
+
return MemcpyFixed<85>(dest, src);
|
|
29969
|
+
case 86:
|
|
29970
|
+
return MemcpyFixed<86>(dest, src);
|
|
29971
|
+
case 87:
|
|
29972
|
+
return MemcpyFixed<87>(dest, src);
|
|
29973
|
+
case 88:
|
|
29974
|
+
return MemcpyFixed<88>(dest, src);
|
|
29975
|
+
case 89:
|
|
29976
|
+
return MemcpyFixed<89>(dest, src);
|
|
29977
|
+
case 90:
|
|
29978
|
+
return MemcpyFixed<90>(dest, src);
|
|
29979
|
+
case 91:
|
|
29980
|
+
return MemcpyFixed<91>(dest, src);
|
|
29981
|
+
case 92:
|
|
29982
|
+
return MemcpyFixed<92>(dest, src);
|
|
29983
|
+
case 93:
|
|
29984
|
+
return MemcpyFixed<93>(dest, src);
|
|
29985
|
+
case 94:
|
|
29986
|
+
return MemcpyFixed<94>(dest, src);
|
|
29987
|
+
case 95:
|
|
29988
|
+
return MemcpyFixed<95>(dest, src);
|
|
29989
|
+
case 96:
|
|
29990
|
+
return MemcpyFixed<96>(dest, src);
|
|
29991
|
+
case 97:
|
|
29992
|
+
return MemcpyFixed<97>(dest, src);
|
|
29993
|
+
case 98:
|
|
29994
|
+
return MemcpyFixed<98>(dest, src);
|
|
29995
|
+
case 99:
|
|
29996
|
+
return MemcpyFixed<99>(dest, src);
|
|
29997
|
+
case 100:
|
|
29998
|
+
return MemcpyFixed<100>(dest, src);
|
|
29999
|
+
case 101:
|
|
30000
|
+
return MemcpyFixed<101>(dest, src);
|
|
30001
|
+
case 102:
|
|
30002
|
+
return MemcpyFixed<102>(dest, src);
|
|
30003
|
+
case 103:
|
|
30004
|
+
return MemcpyFixed<103>(dest, src);
|
|
30005
|
+
case 104:
|
|
30006
|
+
return MemcpyFixed<104>(dest, src);
|
|
30007
|
+
case 105:
|
|
30008
|
+
return MemcpyFixed<105>(dest, src);
|
|
30009
|
+
case 106:
|
|
30010
|
+
return MemcpyFixed<106>(dest, src);
|
|
30011
|
+
case 107:
|
|
30012
|
+
return MemcpyFixed<107>(dest, src);
|
|
30013
|
+
case 108:
|
|
30014
|
+
return MemcpyFixed<108>(dest, src);
|
|
30015
|
+
case 109:
|
|
30016
|
+
return MemcpyFixed<109>(dest, src);
|
|
30017
|
+
case 110:
|
|
30018
|
+
return MemcpyFixed<110>(dest, src);
|
|
30019
|
+
case 111:
|
|
30020
|
+
return MemcpyFixed<111>(dest, src);
|
|
30021
|
+
case 112:
|
|
30022
|
+
return MemcpyFixed<112>(dest, src);
|
|
30023
|
+
case 113:
|
|
30024
|
+
return MemcpyFixed<113>(dest, src);
|
|
30025
|
+
case 114:
|
|
30026
|
+
return MemcpyFixed<114>(dest, src);
|
|
30027
|
+
case 115:
|
|
30028
|
+
return MemcpyFixed<115>(dest, src);
|
|
30029
|
+
case 116:
|
|
30030
|
+
return MemcpyFixed<116>(dest, src);
|
|
30031
|
+
case 117:
|
|
30032
|
+
return MemcpyFixed<117>(dest, src);
|
|
30033
|
+
case 118:
|
|
30034
|
+
return MemcpyFixed<118>(dest, src);
|
|
30035
|
+
case 119:
|
|
30036
|
+
return MemcpyFixed<119>(dest, src);
|
|
30037
|
+
case 120:
|
|
30038
|
+
return MemcpyFixed<120>(dest, src);
|
|
30039
|
+
case 121:
|
|
30040
|
+
return MemcpyFixed<121>(dest, src);
|
|
30041
|
+
case 122:
|
|
30042
|
+
return MemcpyFixed<122>(dest, src);
|
|
30043
|
+
case 123:
|
|
30044
|
+
return MemcpyFixed<123>(dest, src);
|
|
30045
|
+
case 124:
|
|
30046
|
+
return MemcpyFixed<124>(dest, src);
|
|
30047
|
+
case 125:
|
|
30048
|
+
return MemcpyFixed<125>(dest, src);
|
|
30049
|
+
case 126:
|
|
30050
|
+
return MemcpyFixed<126>(dest, src);
|
|
30051
|
+
case 127:
|
|
30052
|
+
return MemcpyFixed<127>(dest, src);
|
|
30053
|
+
case 128:
|
|
30054
|
+
return MemcpyFixed<128>(dest, src);
|
|
30055
|
+
case 129:
|
|
30056
|
+
return MemcpyFixed<129>(dest, src);
|
|
30057
|
+
case 130:
|
|
30058
|
+
return MemcpyFixed<130>(dest, src);
|
|
30059
|
+
case 131:
|
|
30060
|
+
return MemcpyFixed<131>(dest, src);
|
|
30061
|
+
case 132:
|
|
30062
|
+
return MemcpyFixed<132>(dest, src);
|
|
30063
|
+
case 133:
|
|
30064
|
+
return MemcpyFixed<133>(dest, src);
|
|
30065
|
+
case 134:
|
|
30066
|
+
return MemcpyFixed<134>(dest, src);
|
|
30067
|
+
case 135:
|
|
30068
|
+
return MemcpyFixed<135>(dest, src);
|
|
30069
|
+
case 136:
|
|
30070
|
+
return MemcpyFixed<136>(dest, src);
|
|
30071
|
+
case 137:
|
|
30072
|
+
return MemcpyFixed<137>(dest, src);
|
|
30073
|
+
case 138:
|
|
30074
|
+
return MemcpyFixed<138>(dest, src);
|
|
30075
|
+
case 139:
|
|
30076
|
+
return MemcpyFixed<139>(dest, src);
|
|
30077
|
+
case 140:
|
|
30078
|
+
return MemcpyFixed<140>(dest, src);
|
|
30079
|
+
case 141:
|
|
30080
|
+
return MemcpyFixed<141>(dest, src);
|
|
30081
|
+
case 142:
|
|
30082
|
+
return MemcpyFixed<142>(dest, src);
|
|
30083
|
+
case 143:
|
|
30084
|
+
return MemcpyFixed<143>(dest, src);
|
|
30085
|
+
case 144:
|
|
30086
|
+
return MemcpyFixed<144>(dest, src);
|
|
30087
|
+
case 145:
|
|
30088
|
+
return MemcpyFixed<145>(dest, src);
|
|
30089
|
+
case 146:
|
|
30090
|
+
return MemcpyFixed<146>(dest, src);
|
|
30091
|
+
case 147:
|
|
30092
|
+
return MemcpyFixed<147>(dest, src);
|
|
30093
|
+
case 148:
|
|
30094
|
+
return MemcpyFixed<148>(dest, src);
|
|
30095
|
+
case 149:
|
|
30096
|
+
return MemcpyFixed<149>(dest, src);
|
|
30097
|
+
case 150:
|
|
30098
|
+
return MemcpyFixed<150>(dest, src);
|
|
30099
|
+
case 151:
|
|
30100
|
+
return MemcpyFixed<151>(dest, src);
|
|
30101
|
+
case 152:
|
|
30102
|
+
return MemcpyFixed<152>(dest, src);
|
|
30103
|
+
case 153:
|
|
30104
|
+
return MemcpyFixed<153>(dest, src);
|
|
30105
|
+
case 154:
|
|
30106
|
+
return MemcpyFixed<154>(dest, src);
|
|
30107
|
+
case 155:
|
|
30108
|
+
return MemcpyFixed<155>(dest, src);
|
|
30109
|
+
case 156:
|
|
30110
|
+
return MemcpyFixed<156>(dest, src);
|
|
30111
|
+
case 157:
|
|
30112
|
+
return MemcpyFixed<157>(dest, src);
|
|
30113
|
+
case 158:
|
|
30114
|
+
return MemcpyFixed<158>(dest, src);
|
|
30115
|
+
case 159:
|
|
30116
|
+
return MemcpyFixed<159>(dest, src);
|
|
30117
|
+
case 160:
|
|
30118
|
+
return MemcpyFixed<160>(dest, src);
|
|
30119
|
+
case 161:
|
|
30120
|
+
return MemcpyFixed<161>(dest, src);
|
|
30121
|
+
case 162:
|
|
30122
|
+
return MemcpyFixed<162>(dest, src);
|
|
30123
|
+
case 163:
|
|
30124
|
+
return MemcpyFixed<163>(dest, src);
|
|
30125
|
+
case 164:
|
|
30126
|
+
return MemcpyFixed<164>(dest, src);
|
|
30127
|
+
case 165:
|
|
30128
|
+
return MemcpyFixed<165>(dest, src);
|
|
30129
|
+
case 166:
|
|
30130
|
+
return MemcpyFixed<166>(dest, src);
|
|
30131
|
+
case 167:
|
|
30132
|
+
return MemcpyFixed<167>(dest, src);
|
|
30133
|
+
case 168:
|
|
30134
|
+
return MemcpyFixed<168>(dest, src);
|
|
30135
|
+
case 169:
|
|
30136
|
+
return MemcpyFixed<169>(dest, src);
|
|
30137
|
+
case 170:
|
|
30138
|
+
return MemcpyFixed<170>(dest, src);
|
|
30139
|
+
case 171:
|
|
30140
|
+
return MemcpyFixed<171>(dest, src);
|
|
30141
|
+
case 172:
|
|
30142
|
+
return MemcpyFixed<172>(dest, src);
|
|
30143
|
+
case 173:
|
|
30144
|
+
return MemcpyFixed<173>(dest, src);
|
|
30145
|
+
case 174:
|
|
30146
|
+
return MemcpyFixed<174>(dest, src);
|
|
30147
|
+
case 175:
|
|
30148
|
+
return MemcpyFixed<175>(dest, src);
|
|
30149
|
+
case 176:
|
|
30150
|
+
return MemcpyFixed<176>(dest, src);
|
|
30151
|
+
case 177:
|
|
30152
|
+
return MemcpyFixed<177>(dest, src);
|
|
30153
|
+
case 178:
|
|
30154
|
+
return MemcpyFixed<178>(dest, src);
|
|
30155
|
+
case 179:
|
|
30156
|
+
return MemcpyFixed<179>(dest, src);
|
|
30157
|
+
case 180:
|
|
30158
|
+
return MemcpyFixed<180>(dest, src);
|
|
30159
|
+
case 181:
|
|
30160
|
+
return MemcpyFixed<181>(dest, src);
|
|
30161
|
+
case 182:
|
|
30162
|
+
return MemcpyFixed<182>(dest, src);
|
|
30163
|
+
case 183:
|
|
30164
|
+
return MemcpyFixed<183>(dest, src);
|
|
30165
|
+
case 184:
|
|
30166
|
+
return MemcpyFixed<184>(dest, src);
|
|
30167
|
+
case 185:
|
|
30168
|
+
return MemcpyFixed<185>(dest, src);
|
|
30169
|
+
case 186:
|
|
30170
|
+
return MemcpyFixed<186>(dest, src);
|
|
30171
|
+
case 187:
|
|
30172
|
+
return MemcpyFixed<187>(dest, src);
|
|
30173
|
+
case 188:
|
|
30174
|
+
return MemcpyFixed<188>(dest, src);
|
|
30175
|
+
case 189:
|
|
30176
|
+
return MemcpyFixed<189>(dest, src);
|
|
30177
|
+
case 190:
|
|
30178
|
+
return MemcpyFixed<190>(dest, src);
|
|
30179
|
+
case 191:
|
|
30180
|
+
return MemcpyFixed<191>(dest, src);
|
|
30181
|
+
case 192:
|
|
30182
|
+
return MemcpyFixed<192>(dest, src);
|
|
30183
|
+
case 193:
|
|
30184
|
+
return MemcpyFixed<193>(dest, src);
|
|
30185
|
+
case 194:
|
|
30186
|
+
return MemcpyFixed<194>(dest, src);
|
|
30187
|
+
case 195:
|
|
30188
|
+
return MemcpyFixed<195>(dest, src);
|
|
30189
|
+
case 196:
|
|
30190
|
+
return MemcpyFixed<196>(dest, src);
|
|
30191
|
+
case 197:
|
|
30192
|
+
return MemcpyFixed<197>(dest, src);
|
|
30193
|
+
case 198:
|
|
30194
|
+
return MemcpyFixed<198>(dest, src);
|
|
30195
|
+
case 199:
|
|
30196
|
+
return MemcpyFixed<199>(dest, src);
|
|
30197
|
+
case 200:
|
|
30198
|
+
return MemcpyFixed<200>(dest, src);
|
|
30199
|
+
case 201:
|
|
30200
|
+
return MemcpyFixed<201>(dest, src);
|
|
30201
|
+
case 202:
|
|
30202
|
+
return MemcpyFixed<202>(dest, src);
|
|
30203
|
+
case 203:
|
|
30204
|
+
return MemcpyFixed<203>(dest, src);
|
|
30205
|
+
case 204:
|
|
30206
|
+
return MemcpyFixed<204>(dest, src);
|
|
30207
|
+
case 205:
|
|
30208
|
+
return MemcpyFixed<205>(dest, src);
|
|
30209
|
+
case 206:
|
|
30210
|
+
return MemcpyFixed<206>(dest, src);
|
|
30211
|
+
case 207:
|
|
30212
|
+
return MemcpyFixed<207>(dest, src);
|
|
30213
|
+
case 208:
|
|
30214
|
+
return MemcpyFixed<208>(dest, src);
|
|
30215
|
+
case 209:
|
|
30216
|
+
return MemcpyFixed<209>(dest, src);
|
|
30217
|
+
case 210:
|
|
30218
|
+
return MemcpyFixed<210>(dest, src);
|
|
30219
|
+
case 211:
|
|
30220
|
+
return MemcpyFixed<211>(dest, src);
|
|
30221
|
+
case 212:
|
|
30222
|
+
return MemcpyFixed<212>(dest, src);
|
|
30223
|
+
case 213:
|
|
30224
|
+
return MemcpyFixed<213>(dest, src);
|
|
30225
|
+
case 214:
|
|
30226
|
+
return MemcpyFixed<214>(dest, src);
|
|
30227
|
+
case 215:
|
|
30228
|
+
return MemcpyFixed<215>(dest, src);
|
|
30229
|
+
case 216:
|
|
30230
|
+
return MemcpyFixed<216>(dest, src);
|
|
30231
|
+
case 217:
|
|
30232
|
+
return MemcpyFixed<217>(dest, src);
|
|
30233
|
+
case 218:
|
|
30234
|
+
return MemcpyFixed<218>(dest, src);
|
|
30235
|
+
case 219:
|
|
30236
|
+
return MemcpyFixed<219>(dest, src);
|
|
30237
|
+
case 220:
|
|
30238
|
+
return MemcpyFixed<220>(dest, src);
|
|
30239
|
+
case 221:
|
|
30240
|
+
return MemcpyFixed<221>(dest, src);
|
|
30241
|
+
case 222:
|
|
30242
|
+
return MemcpyFixed<222>(dest, src);
|
|
30243
|
+
case 223:
|
|
30244
|
+
return MemcpyFixed<223>(dest, src);
|
|
30245
|
+
case 224:
|
|
30246
|
+
return MemcpyFixed<224>(dest, src);
|
|
30247
|
+
case 225:
|
|
30248
|
+
return MemcpyFixed<225>(dest, src);
|
|
30249
|
+
case 226:
|
|
30250
|
+
return MemcpyFixed<226>(dest, src);
|
|
30251
|
+
case 227:
|
|
30252
|
+
return MemcpyFixed<227>(dest, src);
|
|
30253
|
+
case 228:
|
|
30254
|
+
return MemcpyFixed<228>(dest, src);
|
|
30255
|
+
case 229:
|
|
30256
|
+
return MemcpyFixed<229>(dest, src);
|
|
30257
|
+
case 230:
|
|
30258
|
+
return MemcpyFixed<230>(dest, src);
|
|
30259
|
+
case 231:
|
|
30260
|
+
return MemcpyFixed<231>(dest, src);
|
|
30261
|
+
case 232:
|
|
30262
|
+
return MemcpyFixed<232>(dest, src);
|
|
30263
|
+
case 233:
|
|
30264
|
+
return MemcpyFixed<233>(dest, src);
|
|
30265
|
+
case 234:
|
|
30266
|
+
return MemcpyFixed<234>(dest, src);
|
|
30267
|
+
case 235:
|
|
30268
|
+
return MemcpyFixed<235>(dest, src);
|
|
30269
|
+
case 236:
|
|
30270
|
+
return MemcpyFixed<236>(dest, src);
|
|
30271
|
+
case 237:
|
|
30272
|
+
return MemcpyFixed<237>(dest, src);
|
|
30273
|
+
case 238:
|
|
30274
|
+
return MemcpyFixed<238>(dest, src);
|
|
30275
|
+
case 239:
|
|
30276
|
+
return MemcpyFixed<239>(dest, src);
|
|
30277
|
+
case 240:
|
|
30278
|
+
return MemcpyFixed<240>(dest, src);
|
|
30279
|
+
case 241:
|
|
30280
|
+
return MemcpyFixed<241>(dest, src);
|
|
30281
|
+
case 242:
|
|
30282
|
+
return MemcpyFixed<242>(dest, src);
|
|
30283
|
+
case 243:
|
|
30284
|
+
return MemcpyFixed<243>(dest, src);
|
|
30285
|
+
case 244:
|
|
30286
|
+
return MemcpyFixed<244>(dest, src);
|
|
30287
|
+
case 245:
|
|
30288
|
+
return MemcpyFixed<245>(dest, src);
|
|
30289
|
+
case 246:
|
|
30290
|
+
return MemcpyFixed<246>(dest, src);
|
|
30291
|
+
case 247:
|
|
30292
|
+
return MemcpyFixed<247>(dest, src);
|
|
30293
|
+
case 248:
|
|
30294
|
+
return MemcpyFixed<248>(dest, src);
|
|
30295
|
+
case 249:
|
|
30296
|
+
return MemcpyFixed<249>(dest, src);
|
|
30297
|
+
case 250:
|
|
30298
|
+
return MemcpyFixed<250>(dest, src);
|
|
30299
|
+
case 251:
|
|
30300
|
+
return MemcpyFixed<251>(dest, src);
|
|
30301
|
+
case 252:
|
|
30302
|
+
return MemcpyFixed<252>(dest, src);
|
|
30303
|
+
case 253:
|
|
30304
|
+
return MemcpyFixed<253>(dest, src);
|
|
30305
|
+
case 254:
|
|
30306
|
+
return MemcpyFixed<254>(dest, src);
|
|
30307
|
+
case 255:
|
|
30308
|
+
return MemcpyFixed<255>(dest, src);
|
|
30309
|
+
case 256:
|
|
30310
|
+
return MemcpyFixed<256>(dest, src);
|
|
30311
|
+
default:
|
|
30312
|
+
memcpy(dest, src, size);
|
|
30313
|
+
}
|
|
30314
|
+
// LCOV_EXCL_STOP
|
|
30315
|
+
}
|
|
30316
|
+
|
|
30317
|
+
//! This templated memcmp is significantly faster than std::memcmp,
|
|
30318
|
+
//! but only when you are calling memcmp with a const size in a loop.
|
|
30319
|
+
//! For instance `while (<cond>) { memcmp(<str1>, <str2>, const_size); ... }`
|
|
30320
|
+
static inline int FastMemcmp(const void *str1, const void *str2, const size_t size) {
|
|
30321
|
+
// LCOV_EXCL_START
|
|
30322
|
+
switch (size) {
|
|
30323
|
+
case 0:
|
|
30324
|
+
return 0;
|
|
30325
|
+
case 1:
|
|
30326
|
+
return MemcmpFixed<1>(str1, str2);
|
|
30327
|
+
case 2:
|
|
30328
|
+
return MemcmpFixed<2>(str1, str2);
|
|
30329
|
+
case 3:
|
|
30330
|
+
return MemcmpFixed<3>(str1, str2);
|
|
30331
|
+
case 4:
|
|
30332
|
+
return MemcmpFixed<4>(str1, str2);
|
|
30333
|
+
case 5:
|
|
30334
|
+
return MemcmpFixed<5>(str1, str2);
|
|
30335
|
+
case 6:
|
|
30336
|
+
return MemcmpFixed<6>(str1, str2);
|
|
30337
|
+
case 7:
|
|
30338
|
+
return MemcmpFixed<7>(str1, str2);
|
|
30339
|
+
case 8:
|
|
30340
|
+
return MemcmpFixed<8>(str1, str2);
|
|
30341
|
+
case 9:
|
|
30342
|
+
return MemcmpFixed<9>(str1, str2);
|
|
30343
|
+
case 10:
|
|
30344
|
+
return MemcmpFixed<10>(str1, str2);
|
|
30345
|
+
case 11:
|
|
30346
|
+
return MemcmpFixed<11>(str1, str2);
|
|
30347
|
+
case 12:
|
|
30348
|
+
return MemcmpFixed<12>(str1, str2);
|
|
30349
|
+
case 13:
|
|
30350
|
+
return MemcmpFixed<13>(str1, str2);
|
|
30351
|
+
case 14:
|
|
30352
|
+
return MemcmpFixed<14>(str1, str2);
|
|
30353
|
+
case 15:
|
|
30354
|
+
return MemcmpFixed<15>(str1, str2);
|
|
30355
|
+
case 16:
|
|
30356
|
+
return MemcmpFixed<16>(str1, str2);
|
|
30357
|
+
case 17:
|
|
30358
|
+
return MemcmpFixed<17>(str1, str2);
|
|
30359
|
+
case 18:
|
|
30360
|
+
return MemcmpFixed<18>(str1, str2);
|
|
30361
|
+
case 19:
|
|
30362
|
+
return MemcmpFixed<19>(str1, str2);
|
|
30363
|
+
case 20:
|
|
30364
|
+
return MemcmpFixed<20>(str1, str2);
|
|
30365
|
+
case 21:
|
|
30366
|
+
return MemcmpFixed<21>(str1, str2);
|
|
30367
|
+
case 22:
|
|
30368
|
+
return MemcmpFixed<22>(str1, str2);
|
|
30369
|
+
case 23:
|
|
30370
|
+
return MemcmpFixed<23>(str1, str2);
|
|
30371
|
+
case 24:
|
|
30372
|
+
return MemcmpFixed<24>(str1, str2);
|
|
30373
|
+
case 25:
|
|
30374
|
+
return MemcmpFixed<25>(str1, str2);
|
|
30375
|
+
case 26:
|
|
30376
|
+
return MemcmpFixed<26>(str1, str2);
|
|
30377
|
+
case 27:
|
|
30378
|
+
return MemcmpFixed<27>(str1, str2);
|
|
30379
|
+
case 28:
|
|
30380
|
+
return MemcmpFixed<28>(str1, str2);
|
|
30381
|
+
case 29:
|
|
30382
|
+
return MemcmpFixed<29>(str1, str2);
|
|
30383
|
+
case 30:
|
|
30384
|
+
return MemcmpFixed<30>(str1, str2);
|
|
30385
|
+
case 31:
|
|
30386
|
+
return MemcmpFixed<31>(str1, str2);
|
|
30387
|
+
case 32:
|
|
30388
|
+
return MemcmpFixed<32>(str1, str2);
|
|
30389
|
+
case 33:
|
|
30390
|
+
return MemcmpFixed<33>(str1, str2);
|
|
30391
|
+
case 34:
|
|
30392
|
+
return MemcmpFixed<34>(str1, str2);
|
|
30393
|
+
case 35:
|
|
30394
|
+
return MemcmpFixed<35>(str1, str2);
|
|
30395
|
+
case 36:
|
|
30396
|
+
return MemcmpFixed<36>(str1, str2);
|
|
30397
|
+
case 37:
|
|
30398
|
+
return MemcmpFixed<37>(str1, str2);
|
|
30399
|
+
case 38:
|
|
30400
|
+
return MemcmpFixed<38>(str1, str2);
|
|
30401
|
+
case 39:
|
|
30402
|
+
return MemcmpFixed<39>(str1, str2);
|
|
30403
|
+
case 40:
|
|
30404
|
+
return MemcmpFixed<40>(str1, str2);
|
|
30405
|
+
case 41:
|
|
30406
|
+
return MemcmpFixed<41>(str1, str2);
|
|
30407
|
+
case 42:
|
|
30408
|
+
return MemcmpFixed<42>(str1, str2);
|
|
30409
|
+
case 43:
|
|
30410
|
+
return MemcmpFixed<43>(str1, str2);
|
|
30411
|
+
case 44:
|
|
30412
|
+
return MemcmpFixed<44>(str1, str2);
|
|
30413
|
+
case 45:
|
|
30414
|
+
return MemcmpFixed<45>(str1, str2);
|
|
30415
|
+
case 46:
|
|
30416
|
+
return MemcmpFixed<46>(str1, str2);
|
|
30417
|
+
case 47:
|
|
30418
|
+
return MemcmpFixed<47>(str1, str2);
|
|
30419
|
+
case 48:
|
|
30420
|
+
return MemcmpFixed<48>(str1, str2);
|
|
30421
|
+
case 49:
|
|
30422
|
+
return MemcmpFixed<49>(str1, str2);
|
|
30423
|
+
case 50:
|
|
30424
|
+
return MemcmpFixed<50>(str1, str2);
|
|
30425
|
+
case 51:
|
|
30426
|
+
return MemcmpFixed<51>(str1, str2);
|
|
30427
|
+
case 52:
|
|
30428
|
+
return MemcmpFixed<52>(str1, str2);
|
|
30429
|
+
case 53:
|
|
30430
|
+
return MemcmpFixed<53>(str1, str2);
|
|
30431
|
+
case 54:
|
|
30432
|
+
return MemcmpFixed<54>(str1, str2);
|
|
30433
|
+
case 55:
|
|
30434
|
+
return MemcmpFixed<55>(str1, str2);
|
|
30435
|
+
case 56:
|
|
30436
|
+
return MemcmpFixed<56>(str1, str2);
|
|
30437
|
+
case 57:
|
|
30438
|
+
return MemcmpFixed<57>(str1, str2);
|
|
30439
|
+
case 58:
|
|
30440
|
+
return MemcmpFixed<58>(str1, str2);
|
|
30441
|
+
case 59:
|
|
30442
|
+
return MemcmpFixed<59>(str1, str2);
|
|
30443
|
+
case 60:
|
|
30444
|
+
return MemcmpFixed<60>(str1, str2);
|
|
30445
|
+
case 61:
|
|
30446
|
+
return MemcmpFixed<61>(str1, str2);
|
|
30447
|
+
case 62:
|
|
30448
|
+
return MemcmpFixed<62>(str1, str2);
|
|
30449
|
+
case 63:
|
|
30450
|
+
return MemcmpFixed<63>(str1, str2);
|
|
30451
|
+
case 64:
|
|
30452
|
+
return MemcmpFixed<64>(str1, str2);
|
|
30453
|
+
default:
|
|
30454
|
+
return memcmp(str1, str2, size);
|
|
30455
|
+
}
|
|
30456
|
+
// LCOV_EXCL_STOP
|
|
30457
|
+
}
|
|
30458
|
+
|
|
30459
|
+
} // namespace duckdb
|
|
30460
|
+
|
|
29767
30461
|
|
|
29768
30462
|
|
|
29769
30463
|
|
|
@@ -29920,7 +30614,7 @@ int MergeSorter::CompareUsingGlobalIndex(SortedBlock &l, SortedBlock &r, const i
|
|
|
29920
30614
|
|
|
29921
30615
|
int comp_res;
|
|
29922
30616
|
if (sort_layout.all_constant) {
|
|
29923
|
-
comp_res =
|
|
30617
|
+
comp_res = FastMemcmp(l_ptr, r_ptr, sort_layout.comparison_size);
|
|
29924
30618
|
} else {
|
|
29925
30619
|
l.blob_sorting_data->block_idx = l_block_idx;
|
|
29926
30620
|
l.blob_sorting_data->entry_idx = l_entry_idx;
|
|
@@ -30064,7 +30758,7 @@ void MergeSorter::ComputeMerge(const idx_t &count, bool left_smaller[]) {
|
|
|
30064
30758
|
if (sort_layout.all_constant) {
|
|
30065
30759
|
// All sorting columns are constant size
|
|
30066
30760
|
for (; compared < count && l_entry_idx < l_count && r_entry_idx < r_count; compared++) {
|
|
30067
|
-
left_smaller[compared] =
|
|
30761
|
+
left_smaller[compared] = FastMemcmp(l_radix_ptr, r_radix_ptr, sort_layout.comparison_size) < 0;
|
|
30068
30762
|
const bool &l_smaller = left_smaller[compared];
|
|
30069
30763
|
const bool r_smaller = !l_smaller;
|
|
30070
30764
|
// Use comparison bool (0 or 1) to increment entries and pointers
|
|
@@ -30312,8 +31006,8 @@ void MergeSorter::MergeData(SortedData &result_data, SortedData &l_data, SortedD
|
|
|
30312
31006
|
const bool &l_smaller = left_smaller[copied + i];
|
|
30313
31007
|
const bool r_smaller = !l_smaller;
|
|
30314
31008
|
const auto &entry_size = next_entry_sizes[copied + i];
|
|
30315
|
-
memcpy(result_heap_ptr, l_heap_ptr
|
|
30316
|
-
|
|
31009
|
+
memcpy(result_heap_ptr, (data_ptr_t)(l_smaller * (idx_t)l_heap_ptr + r_smaller * (idx_t)r_heap_ptr),
|
|
31010
|
+
entry_size);
|
|
30317
31011
|
D_ASSERT(Load<uint32_t>(result_heap_ptr) == entry_size);
|
|
30318
31012
|
result_heap_ptr += entry_size;
|
|
30319
31013
|
l_heap_ptr += l_smaller * entry_size;
|
|
@@ -30349,8 +31043,7 @@ void MergeSorter::MergeRows(data_ptr_t &l_ptr, idx_t &l_entry_idx, const idx_t &
|
|
|
30349
31043
|
const bool &l_smaller = left_smaller[copied + i];
|
|
30350
31044
|
const bool r_smaller = !l_smaller;
|
|
30351
31045
|
// Use comparison bool (0 or 1) to copy an entry from either side
|
|
30352
|
-
|
|
30353
|
-
memcpy(target_ptr, r_ptr, r_smaller * entry_size);
|
|
31046
|
+
FastMemcpy(target_ptr, (data_ptr_t)(l_smaller * (idx_t)l_ptr + r_smaller * (idx_t)r_ptr), entry_size);
|
|
30354
31047
|
target_ptr += entry_size;
|
|
30355
31048
|
// Use the comparison bool to increment entries and pointers
|
|
30356
31049
|
l_entry_idx += l_smaller;
|
|
@@ -30431,6 +31124,7 @@ void MergeSorter::FlushBlobs(const RowLayout &layout, const idx_t &source_count,
|
|
|
30431
31124
|
|
|
30432
31125
|
|
|
30433
31126
|
|
|
31127
|
+
|
|
30434
31128
|
namespace duckdb {
|
|
30435
31129
|
|
|
30436
31130
|
//! Calls std::sort on strings that are tied by their prefix after the radix sort
|
|
@@ -30470,7 +31164,7 @@ static void SortTiedBlobs(BufferManager &buffer_manager, const data_ptr_t datapt
|
|
|
30470
31164
|
buffer_manager.Allocate(MaxValue((end - start) * sort_layout.entry_size, (idx_t)Storage::BLOCK_SIZE));
|
|
30471
31165
|
data_ptr_t temp_ptr = temp_block->Ptr();
|
|
30472
31166
|
for (idx_t i = 0; i < end - start; i++) {
|
|
30473
|
-
|
|
31167
|
+
FastMemcpy(temp_ptr, entry_ptrs[i], sort_layout.entry_size);
|
|
30474
31168
|
temp_ptr += sort_layout.entry_size;
|
|
30475
31169
|
}
|
|
30476
31170
|
memcpy(dataptr + start * sort_layout.entry_size, temp_block->Ptr(), (end - start) * sort_layout.entry_size);
|
|
@@ -30530,7 +31224,7 @@ static void ComputeTies(data_ptr_t dataptr, const idx_t &count, const idx_t &col
|
|
|
30530
31224
|
// Align dataptr
|
|
30531
31225
|
dataptr += col_offset;
|
|
30532
31226
|
for (idx_t i = 0; i < count - 1; i++) {
|
|
30533
|
-
ties[i] = ties[i] &&
|
|
31227
|
+
ties[i] = ties[i] && FastMemcmp(dataptr, dataptr + sort_layout.entry_size, tie_size) == 0;
|
|
30534
31228
|
dataptr += sort_layout.entry_size;
|
|
30535
31229
|
}
|
|
30536
31230
|
}
|
|
@@ -30568,7 +31262,7 @@ void RadixSortLSD(BufferManager &buffer_manager, const data_ptr_t &dataptr, cons
|
|
|
30568
31262
|
data_ptr_t row_ptr = source_ptr + (count - 1) * row_width;
|
|
30569
31263
|
for (idx_t i = 0; i < count; i++) {
|
|
30570
31264
|
idx_t &radix_offset = --counts[*(row_ptr + offset)];
|
|
30571
|
-
|
|
31265
|
+
FastMemcpy(target_ptr + radix_offset * row_width, row_ptr, row_width);
|
|
30572
31266
|
row_ptr -= row_width;
|
|
30573
31267
|
}
|
|
30574
31268
|
swap = !swap;
|
|
@@ -30591,14 +31285,14 @@ inline void InsertionSort(const data_ptr_t orig_ptr, const data_ptr_t temp_ptr,
|
|
|
30591
31285
|
const data_ptr_t val = temp_val.get();
|
|
30592
31286
|
const auto comp_width = total_comp_width - offset;
|
|
30593
31287
|
for (idx_t i = 1; i < count; i++) {
|
|
30594
|
-
|
|
31288
|
+
FastMemcpy(val, source_ptr + i * row_width, row_width);
|
|
30595
31289
|
idx_t j = i;
|
|
30596
31290
|
while (j > 0 &&
|
|
30597
|
-
|
|
30598
|
-
|
|
31291
|
+
FastMemcmp(source_ptr + (j - 1) * row_width + total_offset, val + total_offset, comp_width) > 0) {
|
|
31292
|
+
FastMemcpy(source_ptr + j * row_width, source_ptr + (j - 1) * row_width, row_width);
|
|
30599
31293
|
j--;
|
|
30600
31294
|
}
|
|
30601
|
-
|
|
31295
|
+
FastMemcpy(source_ptr + j * row_width, val, row_width);
|
|
30602
31296
|
}
|
|
30603
31297
|
}
|
|
30604
31298
|
if (swap) {
|
|
@@ -30632,7 +31326,7 @@ void RadixSortMSD(const data_ptr_t orig_ptr, const data_ptr_t temp_ptr, const id
|
|
|
30632
31326
|
data_ptr_t row_ptr = source_ptr;
|
|
30633
31327
|
for (idx_t i = 0; i < count; i++) {
|
|
30634
31328
|
const idx_t &radix_offset = locations[*(row_ptr + total_offset)]++;
|
|
30635
|
-
|
|
31329
|
+
FastMemcpy(target_ptr + radix_offset * row_width, row_ptr, row_width);
|
|
30636
31330
|
row_ptr += row_width;
|
|
30637
31331
|
}
|
|
30638
31332
|
swap = !swap;
|
|
@@ -51460,7 +52154,6 @@ void Node4::Erase(ART &art, unique_ptr<Node> &node, int pos) {
|
|
|
51460
52154
|
auto new_length = node->prefix_length + childref->prefix_length + 1;
|
|
51461
52155
|
//! have to allocate space in our prefix array
|
|
51462
52156
|
unique_ptr<uint8_t[]> new_prefix = unique_ptr<uint8_t[]>(new uint8_t[new_length]);
|
|
51463
|
-
;
|
|
51464
52157
|
|
|
51465
52158
|
//! first move the existing prefix (if any)
|
|
51466
52159
|
for (uint32_t i = 0; i < childref->prefix_length; i++) {
|
|
@@ -54563,6 +55256,8 @@ private:
|
|
|
54563
55256
|
Vector statep;
|
|
54564
55257
|
//! The frame boundaries, used for the window functions
|
|
54565
55258
|
FrameBounds frame;
|
|
55259
|
+
//! The active data in the inputs. Used for the window functions
|
|
55260
|
+
FrameBounds active;
|
|
54566
55261
|
//! Reused result state container for the window functions
|
|
54567
55262
|
Vector statev;
|
|
54568
55263
|
|
|
@@ -70818,8 +71513,8 @@ WindowSegmentTree::WindowSegmentTree(AggregateFunction &aggregate, FunctionData
|
|
|
70818
71513
|
const LogicalType &result_type_p, ChunkCollection *input,
|
|
70819
71514
|
WindowAggregationMode mode_p)
|
|
70820
71515
|
: aggregate(aggregate), bind_info(bind_info), result_type(result_type_p), state(aggregate.state_size()),
|
|
70821
|
-
statep(Value::POINTER((idx_t)state.data())), frame(0, 0),
|
|
70822
|
-
internal_nodes(0), input_ref(input), mode(mode_p) {
|
|
71516
|
+
statep(Value::POINTER((idx_t)state.data())), frame(0, 0), active(0, 1),
|
|
71517
|
+
statev(Value::POINTER((idx_t)state.data())), internal_nodes(0), input_ref(input), mode(mode_p) {
|
|
70823
71518
|
#if STANDARD_VECTOR_SIZE < 512
|
|
70824
71519
|
throw NotImplementedException("Window functions are not supported for vector sizes < 512");
|
|
70825
71520
|
#endif
|
|
@@ -70831,6 +71526,7 @@ WindowSegmentTree::WindowSegmentTree(AggregateFunction &aggregate, FunctionData
|
|
|
70831
71526
|
// if we have a frame-by-frame method, share the single state
|
|
70832
71527
|
if (aggregate.window && UseWindowAPI()) {
|
|
70833
71528
|
AggregateInit();
|
|
71529
|
+
inputs.Reference(input_ref->GetChunk(0));
|
|
70834
71530
|
} else if (aggregate.combine && UseCombineAPI()) {
|
|
70835
71531
|
ConstructTree();
|
|
70836
71532
|
}
|
|
@@ -70997,9 +71693,38 @@ void WindowSegmentTree::Compute(Vector &result, idx_t rid, idx_t begin, idx_t en
|
|
|
70997
71693
|
frame = FrameBounds(begin, end);
|
|
70998
71694
|
|
|
70999
71695
|
// Extract the range
|
|
71000
|
-
|
|
71696
|
+
auto &coll = *input_ref;
|
|
71697
|
+
const auto prev_active = active;
|
|
71698
|
+
const FrameBounds combined(MinValue(frame.first, prev.first), MaxValue(frame.second, prev.second));
|
|
71699
|
+
|
|
71700
|
+
// The chunk bounds are the range that includes the begin and end - 1
|
|
71701
|
+
const FrameBounds prev_chunks(coll.LocateChunk(prev_active.first), coll.LocateChunk(prev_active.second - 1));
|
|
71702
|
+
const FrameBounds active_chunks(coll.LocateChunk(combined.first), coll.LocateChunk(combined.second - 1));
|
|
71703
|
+
|
|
71704
|
+
// Extract the range
|
|
71705
|
+
if (active_chunks.first == active_chunks.second) {
|
|
71706
|
+
// If all the data is in a single chunk, then just reference it
|
|
71707
|
+
if (prev_chunks != active_chunks || (!prev.first && !prev.second)) {
|
|
71708
|
+
inputs.Reference(coll.GetChunk(active_chunks.first));
|
|
71709
|
+
}
|
|
71710
|
+
} else if (active_chunks.first == prev_chunks.first && prev_chunks.first != prev_chunks.second) {
|
|
71711
|
+
// If the start chunk did not change, and we are not just a reference, then extend if necessary
|
|
71712
|
+
for (auto chunk_idx = prev_chunks.second + 1; chunk_idx <= active_chunks.second; ++chunk_idx) {
|
|
71713
|
+
inputs.Append(coll.GetChunk(chunk_idx), true);
|
|
71714
|
+
}
|
|
71715
|
+
} else {
|
|
71716
|
+
// If the first chunk changed, start over
|
|
71717
|
+
inputs.Reset();
|
|
71718
|
+
for (auto chunk_idx = active_chunks.first; chunk_idx <= active_chunks.second; ++chunk_idx) {
|
|
71719
|
+
inputs.Append(coll.GetChunk(chunk_idx), true);
|
|
71720
|
+
}
|
|
71721
|
+
}
|
|
71722
|
+
|
|
71723
|
+
active = FrameBounds(active_chunks.first * STANDARD_VECTOR_SIZE,
|
|
71724
|
+
MinValue((active_chunks.second + 1) * STANDARD_VECTOR_SIZE, coll.Count()));
|
|
71001
71725
|
|
|
71002
|
-
aggregate.window(inputs.data.data(), bind_info, inputs.ColumnCount(), state.data(), frame, prev, result, rid
|
|
71726
|
+
aggregate.window(inputs.data.data(), bind_info, inputs.ColumnCount(), state.data(), frame, prev, result, rid,
|
|
71727
|
+
active.first);
|
|
71003
71728
|
return;
|
|
71004
71729
|
}
|
|
71005
71730
|
|
|
@@ -75398,11 +76123,10 @@ struct ModeFunction {
|
|
|
75398
76123
|
|
|
75399
76124
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
75400
76125
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
75401
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid) {
|
|
76126
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid, idx_t bias) {
|
|
75402
76127
|
auto rdata = FlatVector::GetData<RESULT_TYPE>(result);
|
|
75403
76128
|
auto &rmask = FlatVector::Validity(result);
|
|
75404
76129
|
|
|
75405
|
-
const auto bias = MinValue(frame.first, prev.first);
|
|
75406
76130
|
if (!state->frequency_map) {
|
|
75407
76131
|
state->frequency_map = new unordered_map<KEY_TYPE, size_t>();
|
|
75408
76132
|
}
|
|
@@ -76049,11 +76773,11 @@ struct QuantileScalarOperation : public QuantileOperation {
|
|
|
76049
76773
|
|
|
76050
76774
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
76051
76775
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
76052
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx) {
|
|
76776
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx, idx_t bias) {
|
|
76053
76777
|
auto rdata = FlatVector::GetData<RESULT_TYPE>(result);
|
|
76054
76778
|
auto &rmask = FlatVector::Validity(result);
|
|
76055
76779
|
|
|
76056
|
-
QuantileNotNull not_null(dmask,
|
|
76780
|
+
QuantileNotNull not_null(dmask, bias);
|
|
76057
76781
|
|
|
76058
76782
|
// Lazily initialise frame state
|
|
76059
76783
|
auto prev_pos = state->pos;
|
|
@@ -76198,11 +76922,11 @@ struct QuantileListOperation : public QuantileOperation {
|
|
|
76198
76922
|
|
|
76199
76923
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
76200
76924
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
76201
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &list, idx_t lidx) {
|
|
76925
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &list, idx_t lidx, idx_t bias) {
|
|
76202
76926
|
D_ASSERT(bind_data_p);
|
|
76203
76927
|
auto bind_data = (QuantileBindData *)bind_data_p;
|
|
76204
76928
|
|
|
76205
|
-
QuantileNotNull not_null(dmask,
|
|
76929
|
+
QuantileNotNull not_null(dmask, bias);
|
|
76206
76930
|
|
|
76207
76931
|
// Result is a constant LIST<RESULT_TYPE> with a fixed length
|
|
76208
76932
|
auto ldata = FlatVector::GetData<RESULT_TYPE>(list);
|
|
@@ -76551,11 +77275,11 @@ struct MedianAbsoluteDeviationOperation : public QuantileOperation {
|
|
|
76551
77275
|
|
|
76552
77276
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
76553
77277
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
76554
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx) {
|
|
77278
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx, idx_t bias) {
|
|
76555
77279
|
auto rdata = FlatVector::GetData<RESULT_TYPE>(result);
|
|
76556
77280
|
auto &rmask = FlatVector::Validity(result);
|
|
76557
77281
|
|
|
76558
|
-
QuantileNotNull not_null(dmask,
|
|
77282
|
+
QuantileNotNull not_null(dmask, bias);
|
|
76559
77283
|
|
|
76560
77284
|
// Lazily initialise frame state
|
|
76561
77285
|
auto prev_pos = state->pos;
|
|
@@ -139036,6 +139760,11 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun
|
|
|
139036
139760
|
case ResultModifierType::DISTINCT_MODIFIER: {
|
|
139037
139761
|
auto &distinct = (DistinctModifier &)*mod;
|
|
139038
139762
|
auto bound_distinct = make_unique<BoundDistinctModifier>();
|
|
139763
|
+
if (distinct.distinct_on_targets.empty()) {
|
|
139764
|
+
for (idx_t i = 0; i < result.names.size(); i++) {
|
|
139765
|
+
distinct.distinct_on_targets.push_back(make_unique<ConstantExpression>(Value::INTEGER(1 + i)));
|
|
139766
|
+
}
|
|
139767
|
+
}
|
|
139039
139768
|
for (auto &distinct_on_target : distinct.distinct_on_targets) {
|
|
139040
139769
|
auto expr = BindOrderExpression(order_binder, move(distinct_on_target));
|
|
139041
139770
|
if (!expr) {
|
package/src/duckdb.hpp
CHANGED
|
@@ -10,8 +10,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|
|
10
10
|
|
|
11
11
|
#pragma once
|
|
12
12
|
#define DUCKDB_AMALGAMATION 1
|
|
13
|
-
#define DUCKDB_SOURCE_ID "
|
|
14
|
-
#define DUCKDB_VERSION "0.3.2-
|
|
13
|
+
#define DUCKDB_SOURCE_ID "847e60d0f"
|
|
14
|
+
#define DUCKDB_VERSION "0.3.2-dev175"
|
|
15
15
|
//===----------------------------------------------------------------------===//
|
|
16
16
|
// DuckDB
|
|
17
17
|
//
|
|
@@ -6961,12 +6961,12 @@ public:
|
|
|
6961
6961
|
|
|
6962
6962
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE, class OP>
|
|
6963
6963
|
static void UnaryWindow(Vector &input, FunctionData *bind_data, data_ptr_t state, const FrameBounds &frame,
|
|
6964
|
-
const FrameBounds &prev, Vector &result, idx_t rid) {
|
|
6964
|
+
const FrameBounds &prev, Vector &result, idx_t rid, idx_t bias) {
|
|
6965
6965
|
|
|
6966
|
-
auto idata = FlatVector::GetData<const INPUT_TYPE>(input) -
|
|
6966
|
+
auto idata = FlatVector::GetData<const INPUT_TYPE>(input) - bias;
|
|
6967
6967
|
const auto &ivalid = FlatVector::Validity(input);
|
|
6968
6968
|
OP::template Window<STATE, INPUT_TYPE, RESULT_TYPE>(idata, ivalid, bind_data, (STATE *)state, frame, prev,
|
|
6969
|
-
result, rid);
|
|
6969
|
+
result, rid, bias);
|
|
6970
6970
|
}
|
|
6971
6971
|
|
|
6972
6972
|
template <class STATE_TYPE, class OP>
|
|
@@ -8133,7 +8133,8 @@ typedef void (*aggregate_simple_update_t)(Vector inputs[], FunctionData *bind_da
|
|
|
8133
8133
|
//! The type used for updating complex windowed aggregate functions (optional)
|
|
8134
8134
|
typedef std::pair<idx_t, idx_t> FrameBounds;
|
|
8135
8135
|
typedef void (*aggregate_window_t)(Vector inputs[], FunctionData *bind_data, idx_t input_count, data_ptr_t state,
|
|
8136
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t
|
|
8136
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid,
|
|
8137
|
+
idx_t bias);
|
|
8137
8138
|
|
|
8138
8139
|
class AggregateFunction : public BaseScalarFunction {
|
|
8139
8140
|
public:
|
|
@@ -8275,10 +8276,10 @@ public:
|
|
|
8275
8276
|
|
|
8276
8277
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE, class OP>
|
|
8277
8278
|
static void UnaryWindow(Vector inputs[], FunctionData *bind_data, idx_t input_count, data_ptr_t state,
|
|
8278
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid) {
|
|
8279
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid, idx_t bias) {
|
|
8279
8280
|
D_ASSERT(input_count == 1);
|
|
8280
8281
|
AggregateExecutor::UnaryWindow<STATE, INPUT_TYPE, RESULT_TYPE, OP>(inputs[0], bind_data, state, frame, prev,
|
|
8281
|
-
result, rid);
|
|
8282
|
+
result, rid, bias);
|
|
8282
8283
|
}
|
|
8283
8284
|
|
|
8284
8285
|
template <class STATE, class A_TYPE, class B_TYPE, class OP>
|