duckdb 0.3.2-dev145.0 → 0.3.2-dev173.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 +762 -28
- 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;
|
|
@@ -43103,6 +43797,7 @@ struct EnumTypeInfo : public ExtraTypeInfo {
|
|
|
43103
43797
|
TypeCatalogEntry *catalog_entry = nullptr;
|
|
43104
43798
|
|
|
43105
43799
|
public:
|
|
43800
|
+
// Equalities are only used in enums with different catalog entries
|
|
43106
43801
|
bool Equals(ExtraTypeInfo *other_p) override {
|
|
43107
43802
|
if (!other_p) {
|
|
43108
43803
|
return false;
|
|
@@ -43111,9 +43806,12 @@ public:
|
|
|
43111
43806
|
return false;
|
|
43112
43807
|
}
|
|
43113
43808
|
auto &other = (EnumTypeInfo &)*other_p;
|
|
43114
|
-
|
|
43809
|
+
// We must check if all elements are equal
|
|
43810
|
+
if (other.values_insert_order == values_insert_order) {
|
|
43811
|
+
return true;
|
|
43812
|
+
}
|
|
43813
|
+
return false;
|
|
43115
43814
|
}
|
|
43116
|
-
|
|
43117
43815
|
void Serialize(Serializer &serializer) const override {
|
|
43118
43816
|
serializer.Write<uint32_t>(values_insert_order.size());
|
|
43119
43817
|
serializer.WriteString(enum_name);
|
|
@@ -54559,6 +55257,8 @@ private:
|
|
|
54559
55257
|
Vector statep;
|
|
54560
55258
|
//! The frame boundaries, used for the window functions
|
|
54561
55259
|
FrameBounds frame;
|
|
55260
|
+
//! The active data in the inputs. Used for the window functions
|
|
55261
|
+
FrameBounds active;
|
|
54562
55262
|
//! Reused result state container for the window functions
|
|
54563
55263
|
Vector statev;
|
|
54564
55264
|
|
|
@@ -70814,8 +71514,8 @@ WindowSegmentTree::WindowSegmentTree(AggregateFunction &aggregate, FunctionData
|
|
|
70814
71514
|
const LogicalType &result_type_p, ChunkCollection *input,
|
|
70815
71515
|
WindowAggregationMode mode_p)
|
|
70816
71516
|
: aggregate(aggregate), bind_info(bind_info), result_type(result_type_p), state(aggregate.state_size()),
|
|
70817
|
-
statep(Value::POINTER((idx_t)state.data())), frame(0, 0),
|
|
70818
|
-
internal_nodes(0), input_ref(input), mode(mode_p) {
|
|
71517
|
+
statep(Value::POINTER((idx_t)state.data())), frame(0, 0), active(0, 1),
|
|
71518
|
+
statev(Value::POINTER((idx_t)state.data())), internal_nodes(0), input_ref(input), mode(mode_p) {
|
|
70819
71519
|
#if STANDARD_VECTOR_SIZE < 512
|
|
70820
71520
|
throw NotImplementedException("Window functions are not supported for vector sizes < 512");
|
|
70821
71521
|
#endif
|
|
@@ -70827,6 +71527,7 @@ WindowSegmentTree::WindowSegmentTree(AggregateFunction &aggregate, FunctionData
|
|
|
70827
71527
|
// if we have a frame-by-frame method, share the single state
|
|
70828
71528
|
if (aggregate.window && UseWindowAPI()) {
|
|
70829
71529
|
AggregateInit();
|
|
71530
|
+
inputs.Reference(input_ref->GetChunk(0));
|
|
70830
71531
|
} else if (aggregate.combine && UseCombineAPI()) {
|
|
70831
71532
|
ConstructTree();
|
|
70832
71533
|
}
|
|
@@ -70993,9 +71694,38 @@ void WindowSegmentTree::Compute(Vector &result, idx_t rid, idx_t begin, idx_t en
|
|
|
70993
71694
|
frame = FrameBounds(begin, end);
|
|
70994
71695
|
|
|
70995
71696
|
// Extract the range
|
|
70996
|
-
|
|
71697
|
+
auto &coll = *input_ref;
|
|
71698
|
+
const auto prev_active = active;
|
|
71699
|
+
const FrameBounds combined(MinValue(frame.first, prev.first), MaxValue(frame.second, prev.second));
|
|
71700
|
+
|
|
71701
|
+
// The chunk bounds are the range that includes the begin and end - 1
|
|
71702
|
+
const FrameBounds prev_chunks(coll.LocateChunk(prev_active.first), coll.LocateChunk(prev_active.second - 1));
|
|
71703
|
+
const FrameBounds active_chunks(coll.LocateChunk(combined.first), coll.LocateChunk(combined.second - 1));
|
|
71704
|
+
|
|
71705
|
+
// Extract the range
|
|
71706
|
+
if (active_chunks.first == active_chunks.second) {
|
|
71707
|
+
// If all the data is in a single chunk, then just reference it
|
|
71708
|
+
if (prev_chunks != active_chunks || (!prev.first && !prev.second)) {
|
|
71709
|
+
inputs.Reference(coll.GetChunk(active_chunks.first));
|
|
71710
|
+
}
|
|
71711
|
+
} else if (active_chunks.first == prev_chunks.first && prev_chunks.first != prev_chunks.second) {
|
|
71712
|
+
// If the start chunk did not change, and we are not just a reference, then extend if necessary
|
|
71713
|
+
for (auto chunk_idx = prev_chunks.second + 1; chunk_idx <= active_chunks.second; ++chunk_idx) {
|
|
71714
|
+
inputs.Append(coll.GetChunk(chunk_idx), true);
|
|
71715
|
+
}
|
|
71716
|
+
} else {
|
|
71717
|
+
// If the first chunk changed, start over
|
|
71718
|
+
inputs.Reset();
|
|
71719
|
+
for (auto chunk_idx = active_chunks.first; chunk_idx <= active_chunks.second; ++chunk_idx) {
|
|
71720
|
+
inputs.Append(coll.GetChunk(chunk_idx), true);
|
|
71721
|
+
}
|
|
71722
|
+
}
|
|
71723
|
+
|
|
71724
|
+
active = FrameBounds(active_chunks.first * STANDARD_VECTOR_SIZE,
|
|
71725
|
+
MinValue((active_chunks.second + 1) * STANDARD_VECTOR_SIZE, coll.Count()));
|
|
70997
71726
|
|
|
70998
|
-
aggregate.window(inputs.data.data(), bind_info, inputs.ColumnCount(), state.data(), frame, prev, result, rid
|
|
71727
|
+
aggregate.window(inputs.data.data(), bind_info, inputs.ColumnCount(), state.data(), frame, prev, result, rid,
|
|
71728
|
+
active.first);
|
|
70999
71729
|
return;
|
|
71000
71730
|
}
|
|
71001
71731
|
|
|
@@ -75394,11 +76124,10 @@ struct ModeFunction {
|
|
|
75394
76124
|
|
|
75395
76125
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
75396
76126
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
75397
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid) {
|
|
76127
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid, idx_t bias) {
|
|
75398
76128
|
auto rdata = FlatVector::GetData<RESULT_TYPE>(result);
|
|
75399
76129
|
auto &rmask = FlatVector::Validity(result);
|
|
75400
76130
|
|
|
75401
|
-
const auto bias = MinValue(frame.first, prev.first);
|
|
75402
76131
|
if (!state->frequency_map) {
|
|
75403
76132
|
state->frequency_map = new unordered_map<KEY_TYPE, size_t>();
|
|
75404
76133
|
}
|
|
@@ -76045,11 +76774,11 @@ struct QuantileScalarOperation : public QuantileOperation {
|
|
|
76045
76774
|
|
|
76046
76775
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
76047
76776
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
76048
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx) {
|
|
76777
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx, idx_t bias) {
|
|
76049
76778
|
auto rdata = FlatVector::GetData<RESULT_TYPE>(result);
|
|
76050
76779
|
auto &rmask = FlatVector::Validity(result);
|
|
76051
76780
|
|
|
76052
|
-
QuantileNotNull not_null(dmask,
|
|
76781
|
+
QuantileNotNull not_null(dmask, bias);
|
|
76053
76782
|
|
|
76054
76783
|
// Lazily initialise frame state
|
|
76055
76784
|
auto prev_pos = state->pos;
|
|
@@ -76194,11 +76923,11 @@ struct QuantileListOperation : public QuantileOperation {
|
|
|
76194
76923
|
|
|
76195
76924
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
76196
76925
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
76197
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &list, idx_t lidx) {
|
|
76926
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &list, idx_t lidx, idx_t bias) {
|
|
76198
76927
|
D_ASSERT(bind_data_p);
|
|
76199
76928
|
auto bind_data = (QuantileBindData *)bind_data_p;
|
|
76200
76929
|
|
|
76201
|
-
QuantileNotNull not_null(dmask,
|
|
76930
|
+
QuantileNotNull not_null(dmask, bias);
|
|
76202
76931
|
|
|
76203
76932
|
// Result is a constant LIST<RESULT_TYPE> with a fixed length
|
|
76204
76933
|
auto ldata = FlatVector::GetData<RESULT_TYPE>(list);
|
|
@@ -76547,11 +77276,11 @@ struct MedianAbsoluteDeviationOperation : public QuantileOperation {
|
|
|
76547
77276
|
|
|
76548
77277
|
template <class STATE, class INPUT_TYPE, class RESULT_TYPE>
|
|
76549
77278
|
static void Window(const INPUT_TYPE *data, const ValidityMask &dmask, FunctionData *bind_data_p, STATE *state,
|
|
76550
|
-
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx) {
|
|
77279
|
+
const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t ridx, idx_t bias) {
|
|
76551
77280
|
auto rdata = FlatVector::GetData<RESULT_TYPE>(result);
|
|
76552
77281
|
auto &rmask = FlatVector::Validity(result);
|
|
76553
77282
|
|
|
76554
|
-
QuantileNotNull not_null(dmask,
|
|
77283
|
+
QuantileNotNull not_null(dmask, bias);
|
|
76555
77284
|
|
|
76556
77285
|
// Lazily initialise frame state
|
|
76557
77286
|
auto prev_pos = state->pos;
|
|
@@ -139032,6 +139761,11 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun
|
|
|
139032
139761
|
case ResultModifierType::DISTINCT_MODIFIER: {
|
|
139033
139762
|
auto &distinct = (DistinctModifier &)*mod;
|
|
139034
139763
|
auto bound_distinct = make_unique<BoundDistinctModifier>();
|
|
139764
|
+
if (distinct.distinct_on_targets.empty()) {
|
|
139765
|
+
for (idx_t i = 0; i < result.names.size(); i++) {
|
|
139766
|
+
distinct.distinct_on_targets.push_back(make_unique<ConstantExpression>(Value::INTEGER(1 + i)));
|
|
139767
|
+
}
|
|
139768
|
+
}
|
|
139035
139769
|
for (auto &distinct_on_target : distinct.distinct_on_targets) {
|
|
139036
139770
|
auto expr = BindOrderExpression(order_binder, move(distinct_on_target));
|
|
139037
139771
|
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 "a73d33c14"
|
|
14
|
+
#define DUCKDB_VERSION "0.3.2-dev173"
|
|
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>
|