From 455ae38cea25c03e84aa047be6448f1189ec79e2 Mon Sep 17 00:00:00 2001 From: Oliver Tan Date: Fri, 21 Aug 2020 16:08:16 -0700 Subject: [PATCH] builtins: use ST_Union as aggregate Add the ST_Union aggregate, removing the two-argument version temporarily as we cannot currently have an aggregate and non-aggregate at the same time. This is ok since we haven't released yet, and from reading it seems more likely people will use the aggregate version. Release note (sql change): Implement the ST_Union builtin as an aggregate. The previous alpha-available ST_Union for two arguments is deprecated. --- docs/generated/sql/aggregates.md | 2 + docs/generated/sql/functions.md | 3 - pkg/sql/distsql/columnar_operators_test.go | 10 +- pkg/sql/execinfra/server_config.go | 2 +- pkg/sql/execinfra/version_history.txt | 3 + pkg/sql/execinfrapb/processors_sql.pb.go | 415 +++++++++--------- pkg/sql/execinfrapb/processors_sql.proto | 1 + .../logictest/testdata/logic_test/geospatial | 170 +------ pkg/sql/opt/operator.go | 11 +- pkg/sql/opt/ops/scalar.opt | 5 + pkg/sql/opt/optbuilder/groupby.go | 2 + pkg/sql/sem/builtins/aggregate_builtins.go | 84 ++++ pkg/sql/sem/builtins/geo_builtins.go | 18 - 13 files changed, 336 insertions(+), 390 deletions(-) diff --git a/docs/generated/sql/aggregates.md b/docs/generated/sql/aggregates.md index 76c25dbcf759..3d3da7dd612f 100644 --- a/docs/generated/sql/aggregates.md +++ b/docs/generated/sql/aggregates.md @@ -195,6 +195,8 @@ st_makeline(arg1: geometry) → geometry

Forms a LineString from Point, MultiPoint or LineStrings. Other shapes will be ignored.

+st_union(arg1: geometry) → geometry

Applies a spatial union to the geometries provided.

+
stddev(arg1: decimal) → decimal

Calculates the standard deviation of the selected values.

stddev(arg1: float) → float

Calculates the standard deviation of the selected values.

diff --git a/docs/generated/sql/functions.md b/docs/generated/sql/functions.md index 3c18edee856d..83b60b9a5f98 100644 --- a/docs/generated/sql/functions.md +++ b/docs/generated/sql/functions.md @@ -1605,9 +1605,6 @@ Negative azimuth values and values greater than 2π (360 degrees) are supported.
st_translate(g: geometry, deltaX: float, deltaY: float) → geometry

Returns a modified Geometry translated by the given deltas

-st_union(geometry_a: geometry, geometry_b: geometry) → geometry

Returns the union of the given geometries as a single Geometry object.

-

This function utilizes the GEOS module.

-
st_within(geometry_a: geometry, geometry_b: geometry) → bool

Returns true if geometry_a is completely inside geometry_b.

This function utilizes the GEOS module.

This function variant will attempt to utilize any available geospatial index.

diff --git a/pkg/sql/distsql/columnar_operators_test.go b/pkg/sql/distsql/columnar_operators_test.go index 76fb4b834383..b8fe9c7e8994 100644 --- a/pkg/sql/distsql/columnar_operators_test.go +++ b/pkg/sql/distsql/columnar_operators_test.go @@ -68,6 +68,7 @@ var aggregateFuncToNumArguments = map[execinfrapb.AggregatorSpec_Func]int{ execinfrapb.AggregatorSpec_STDDEV_POP: 1, execinfrapb.AggregatorSpec_ST_MAKELINE: 1, execinfrapb.AggregatorSpec_ST_EXTENT: 1, + execinfrapb.AggregatorSpec_ST_UNION: 1, } // TestAggregateFuncToNumArguments ensures that all aggregate functions are @@ -183,9 +184,9 @@ func TestAggregatorAgainstProcessor(t *testing.T) { for j := range aggFnInputTypes { aggFnInputTypes[j] = sqlbase.RandType(rng) } - // There is a special case for concat_agg, string_agg, - // st_makeline, and st_extent when at least one argument is a - // tuple. Such cases pass GetAggregateInfo check below, + // There is a special case for some functions when at + // least one argument is a tuple. + // Such cases pass GetAggregateInfo check below, // but they are actually invalid, and during normal // execution it is caught during type-checking. // However, we don't want to do fully-fledged type @@ -195,7 +196,8 @@ func TestAggregatorAgainstProcessor(t *testing.T) { case execinfrapb.AggregatorSpec_CONCAT_AGG, execinfrapb.AggregatorSpec_STRING_AGG, execinfrapb.AggregatorSpec_ST_MAKELINE, - execinfrapb.AggregatorSpec_ST_EXTENT: + execinfrapb.AggregatorSpec_ST_EXTENT, + execinfrapb.AggregatorSpec_ST_UNION: for _, typ := range aggFnInputTypes { if typ.Family() == types.TupleFamily { invalid = true diff --git a/pkg/sql/execinfra/server_config.go b/pkg/sql/execinfra/server_config.go index c014d4c5cd8d..44d616240cff 100644 --- a/pkg/sql/execinfra/server_config.go +++ b/pkg/sql/execinfra/server_config.go @@ -64,7 +64,7 @@ import ( // // ATTENTION: When updating these fields, add to version_history.txt explaining // what changed. -const Version execinfrapb.DistSQLVersion = 32 +const Version execinfrapb.DistSQLVersion = 33 // MinAcceptedVersion is the oldest version that the server is // compatible with; see above. diff --git a/pkg/sql/execinfra/version_history.txt b/pkg/sql/execinfra/version_history.txt index deb5c8bf7ebf..9cf3c469e7a0 100644 --- a/pkg/sql/execinfra/version_history.txt +++ b/pkg/sql/execinfra/version_history.txt @@ -123,3 +123,6 @@ - Version: 32 (MinAcceptedVersion: 30) - Added an aggregator for ST_Extent. The change is backwards compatible (mixed versions will prevent parallelization). +- Version: 33 (MinAcceptedVersion: 30) + - Added an aggregator for ST_Union. The change is backwards compatible + (mixed versions will prevent parallelization). diff --git a/pkg/sql/execinfrapb/processors_sql.pb.go b/pkg/sql/execinfrapb/processors_sql.pb.go index 148c540a4c42..0eb801b2b4d4 100644 --- a/pkg/sql/execinfrapb/processors_sql.pb.go +++ b/pkg/sql/execinfrapb/processors_sql.pb.go @@ -64,7 +64,7 @@ func (x *ScanVisibility) UnmarshalJSON(data []byte) error { return nil } func (ScanVisibility) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{0} } // These mirror the aggregate functions supported by sql/parser. See @@ -105,6 +105,7 @@ const ( AggregatorSpec_STDDEV_POP AggregatorSpec_Func = 30 AggregatorSpec_ST_MAKELINE AggregatorSpec_Func = 31 AggregatorSpec_ST_EXTENT AggregatorSpec_Func = 32 + AggregatorSpec_ST_UNION AggregatorSpec_Func = 33 ) var AggregatorSpec_Func_name = map[int32]string{ @@ -140,6 +141,7 @@ var AggregatorSpec_Func_name = map[int32]string{ 30: "STDDEV_POP", 31: "ST_MAKELINE", 32: "ST_EXTENT", + 33: "ST_UNION", } var AggregatorSpec_Func_value = map[string]int32{ "ANY_NOT_NULL": 0, @@ -174,6 +176,7 @@ var AggregatorSpec_Func_value = map[string]int32{ "STDDEV_POP": 30, "ST_MAKELINE": 31, "ST_EXTENT": 32, + "ST_UNION": 33, } func (x AggregatorSpec_Func) Enum() *AggregatorSpec_Func { @@ -193,7 +196,7 @@ func (x *AggregatorSpec_Func) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Func) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{12, 0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{12, 0} } type AggregatorSpec_Type int32 @@ -239,7 +242,7 @@ func (x *AggregatorSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{12, 1} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{12, 1} } type WindowerSpec_WindowFunc int32 @@ -303,7 +306,7 @@ func (x *WindowerSpec_WindowFunc) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_WindowFunc) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 0} } // Mode indicates which mode of framing is used. @@ -347,7 +350,7 @@ func (x *WindowerSpec_Frame_Mode) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_Mode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 1, 0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 1, 0} } // BoundType indicates which type of boundary is used. @@ -394,7 +397,7 @@ func (x *WindowerSpec_Frame_BoundType) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_BoundType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 1, 1} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 1, 1} } // Exclusion specifies the type of frame exclusion. @@ -437,7 +440,7 @@ func (x *WindowerSpec_Frame_Exclusion) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_Exclusion) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 1, 2} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 1, 2} } // ValuesCoreSpec is the core of a processor that has no inputs and generates @@ -457,7 +460,7 @@ func (m *ValuesCoreSpec) Reset() { *m = ValuesCoreSpec{} } func (m *ValuesCoreSpec) String() string { return proto.CompactTextString(m) } func (*ValuesCoreSpec) ProtoMessage() {} func (*ValuesCoreSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{0} } func (m *ValuesCoreSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -565,7 +568,7 @@ func (m *TableReaderSpec) Reset() { *m = TableReaderSpec{} } func (m *TableReaderSpec) String() string { return proto.CompactTextString(m) } func (*TableReaderSpec) ProtoMessage() {} func (*TableReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{1} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{1} } func (m *TableReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -620,7 +623,7 @@ func (m *IndexSkipTableReaderSpec) Reset() { *m = IndexSkipTableReaderSp func (m *IndexSkipTableReaderSpec) String() string { return proto.CompactTextString(m) } func (*IndexSkipTableReaderSpec) ProtoMessage() {} func (*IndexSkipTableReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{2} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{2} } func (m *IndexSkipTableReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -727,7 +730,7 @@ func (m *JoinReaderSpec) Reset() { *m = JoinReaderSpec{} } func (m *JoinReaderSpec) String() string { return proto.CompactTextString(m) } func (*JoinReaderSpec) ProtoMessage() {} func (*JoinReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{3} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{3} } func (m *JoinReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -771,7 +774,7 @@ func (m *SorterSpec) Reset() { *m = SorterSpec{} } func (m *SorterSpec) String() string { return proto.CompactTextString(m) } func (*SorterSpec) ProtoMessage() {} func (*SorterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{4} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{4} } func (m *SorterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -833,7 +836,7 @@ func (m *DistinctSpec) Reset() { *m = DistinctSpec{} } func (m *DistinctSpec) String() string { return proto.CompactTextString(m) } func (*DistinctSpec) ProtoMessage() {} func (*DistinctSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{5} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{5} } func (m *DistinctSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +871,7 @@ func (m *OrdinalitySpec) Reset() { *m = OrdinalitySpec{} } func (m *OrdinalitySpec) String() string { return proto.CompactTextString(m) } func (*OrdinalitySpec) ProtoMessage() {} func (*OrdinalitySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{6} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{6} } func (m *OrdinalitySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -926,7 +929,7 @@ func (m *ZigzagJoinerSpec) Reset() { *m = ZigzagJoinerSpec{} } func (m *ZigzagJoinerSpec) String() string { return proto.CompactTextString(m) } func (*ZigzagJoinerSpec) ProtoMessage() {} func (*ZigzagJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{7} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{7} } func (m *ZigzagJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1002,7 +1005,7 @@ func (m *MergeJoinerSpec) Reset() { *m = MergeJoinerSpec{} } func (m *MergeJoinerSpec) String() string { return proto.CompactTextString(m) } func (*MergeJoinerSpec) ProtoMessage() {} func (*MergeJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{8} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{8} } func (m *MergeJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1089,7 +1092,7 @@ func (m *HashJoinerSpec) Reset() { *m = HashJoinerSpec{} } func (m *HashJoinerSpec) String() string { return proto.CompactTextString(m) } func (*HashJoinerSpec) ProtoMessage() {} func (*HashJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{9} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{9} } func (m *HashJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1183,7 +1186,7 @@ func (m *InvertedJoinerSpec) Reset() { *m = InvertedJoinerSpec{} } func (m *InvertedJoinerSpec) String() string { return proto.CompactTextString(m) } func (*InvertedJoinerSpec) ProtoMessage() {} func (*InvertedJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{10} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{10} } func (m *InvertedJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1236,7 +1239,7 @@ func (m *InvertedFiltererSpec) Reset() { *m = InvertedFiltererSpec{} } func (m *InvertedFiltererSpec) String() string { return proto.CompactTextString(m) } func (*InvertedFiltererSpec) ProtoMessage() {} func (*InvertedFiltererSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{11} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{11} } func (m *InvertedFiltererSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,7 +1285,7 @@ func (m *AggregatorSpec) Reset() { *m = AggregatorSpec{} } func (m *AggregatorSpec) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec) ProtoMessage() {} func (*AggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{12} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{12} } func (m *AggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1333,7 +1336,7 @@ func (m *AggregatorSpec_Aggregation) Reset() { *m = AggregatorSpec_Aggre func (m *AggregatorSpec_Aggregation) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec_Aggregation) ProtoMessage() {} func (*AggregatorSpec_Aggregation) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{12, 0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{12, 0} } func (m *AggregatorSpec_Aggregation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1404,7 +1407,7 @@ func (m *InterleavedReaderJoinerSpec) Reset() { *m = InterleavedReaderJo func (m *InterleavedReaderJoinerSpec) String() string { return proto.CompactTextString(m) } func (*InterleavedReaderJoinerSpec) ProtoMessage() {} func (*InterleavedReaderJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{13} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{13} } func (m *InterleavedReaderJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1460,7 +1463,7 @@ func (m *InterleavedReaderJoinerSpec_Table) Reset() { *m = InterleavedRe func (m *InterleavedReaderJoinerSpec_Table) String() string { return proto.CompactTextString(m) } func (*InterleavedReaderJoinerSpec_Table) ProtoMessage() {} func (*InterleavedReaderJoinerSpec_Table) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{13, 0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{13, 0} } func (m *InterleavedReaderJoinerSpec_Table) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1500,7 +1503,7 @@ func (m *ProjectSetSpec) Reset() { *m = ProjectSetSpec{} } func (m *ProjectSetSpec) String() string { return proto.CompactTextString(m) } func (*ProjectSetSpec) ProtoMessage() {} func (*ProjectSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{14} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{14} } func (m *ProjectSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1542,7 +1545,7 @@ func (m *WindowerSpec) Reset() { *m = WindowerSpec{} } func (m *WindowerSpec) String() string { return proto.CompactTextString(m) } func (*WindowerSpec) ProtoMessage() {} func (*WindowerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15} } func (m *WindowerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1578,7 +1581,7 @@ func (m *WindowerSpec_Func) Reset() { *m = WindowerSpec_Func{} } func (m *WindowerSpec_Func) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Func) ProtoMessage() {} func (*WindowerSpec_Func) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 0} } func (m *WindowerSpec_Func) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1614,7 +1617,7 @@ func (m *WindowerSpec_Frame) Reset() { *m = WindowerSpec_Frame{} } func (m *WindowerSpec_Frame) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame) ProtoMessage() {} func (*WindowerSpec_Frame) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 1} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 1} } func (m *WindowerSpec_Frame) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1655,7 +1658,7 @@ func (m *WindowerSpec_Frame_Bound) Reset() { *m = WindowerSpec_Frame_Bou func (m *WindowerSpec_Frame_Bound) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bound) ProtoMessage() {} func (*WindowerSpec_Frame_Bound) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 1, 0} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 1, 0} } func (m *WindowerSpec_Frame_Bound) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1691,7 +1694,7 @@ func (m *WindowerSpec_Frame_Bounds) Reset() { *m = WindowerSpec_Frame_Bo func (m *WindowerSpec_Frame_Bounds) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bounds) ProtoMessage() {} func (*WindowerSpec_Frame_Bounds) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 1, 1} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 1, 1} } func (m *WindowerSpec_Frame_Bounds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1741,7 +1744,7 @@ func (m *WindowerSpec_WindowFn) Reset() { *m = WindowerSpec_WindowFn{} } func (m *WindowerSpec_WindowFn) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_WindowFn) ProtoMessage() {} func (*WindowerSpec_WindowFn) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_d6f5455294315145, []int{15, 2} + return fileDescriptor_processors_sql_87f40537b51e0560, []int{15, 2} } func (m *WindowerSpec_WindowFn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8083,180 +8086,180 @@ var ( ) func init() { - proto.RegisterFile("sql/execinfrapb/processors_sql.proto", fileDescriptor_processors_sql_d6f5455294315145) -} - -var fileDescriptor_processors_sql_d6f5455294315145 = []byte{ - // 2726 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0xcf, 0x73, 0xdb, 0xc6, - 0xf5, 0x17, 0xf8, 0x43, 0x22, 0x1f, 0x7f, 0x68, 0xbd, 0x56, 0x62, 0x86, 0xf9, 0x7e, 0x65, 0x99, - 0x49, 0x63, 0xd9, 0x71, 0xa4, 0x46, 0xed, 0xa4, 0x93, 0xa4, 0x87, 0x80, 0x24, 0x28, 0x53, 0xa6, - 0x00, 0x1a, 0x24, 0x65, 0x27, 0x99, 0x09, 0x06, 0x22, 0x56, 0x14, 0x62, 0x10, 0xa0, 0x00, 0xd0, - 0x92, 0xf2, 0x0f, 0xf4, 0xda, 0x4e, 0x2f, 0x3d, 0x75, 0x72, 0x69, 0x6f, 0xbd, 0xf5, 0x9c, 0x5e, - 0x7a, 0xf0, 0x31, 0xd3, 0x43, 0x9b, 0x53, 0xa7, 0xb1, 0xfb, 0x0f, 0xf4, 0x94, 0xe9, 0xad, 0xb3, - 0x8b, 0x05, 0x04, 0x72, 0x44, 0xd7, 0xb4, 0x95, 0x78, 0x7a, 0xd1, 0x70, 0xdf, 0x8f, 0xcf, 0xbe, - 0x7d, 0xef, 0xed, 0xdb, 0xb7, 0x0b, 0xc1, 0x9b, 0xde, 0x91, 0xb5, 0x49, 0x4e, 0x48, 0xdf, 0xb4, - 0x0f, 0x5c, 0x7d, 0xb4, 0xbf, 0x39, 0x72, 0x9d, 0x3e, 0xf1, 0x3c, 0xc7, 0xf5, 0x34, 0xef, 0xc8, - 0xda, 0x18, 0xb9, 0x8e, 0xef, 0xe0, 0x52, 0xdf, 0xe9, 0x3f, 0x70, 0x1d, 0xbd, 0x7f, 0xb8, 0x41, - 0x89, 0x86, 0xe9, 0xf9, 0xde, 0x91, 0xe5, 0x8e, 0xed, 0xf2, 0x1b, 0x54, 0xbf, 0xaf, 0xfb, 0xba, - 0xe5, 0x0c, 0x36, 0x0d, 0xe2, 0xf5, 0x47, 0xfb, 0x9b, 0x9e, 0xef, 0x8e, 0xfb, 0xfe, 0xd8, 0x25, - 0x46, 0xa0, 0x5e, 0xae, 0x9c, 0x23, 0xf4, 0xb9, 0x63, 0xda, 0x9a, 0x7f, 0x3a, 0x22, 0x5c, 0x66, - 0xed, 0x1c, 0x19, 0xcb, 0xe9, 0x3f, 0x30, 0xed, 0x01, 0x97, 0x78, 0x85, 0x4a, 0x50, 0x0d, 0x2f, - 0xf8, 0xcb, 0xc9, 0xe5, 0xe9, 0x15, 0x18, 0xba, 0xaf, 0x73, 0xde, 0x8f, 0x9e, 0xb2, 0xba, 0x7d, - 0xdd, 0x0b, 0xe7, 0xbe, 0x49, 0xc5, 0x9c, 0x91, 0xbf, 0x69, 0xda, 0x0f, 0x89, 0xeb, 0x13, 0x83, - 0x9c, 0x8c, 0xdc, 0x4d, 0x6f, 0xa4, 0xdb, 0x1a, 0xfd, 0x45, 0x3c, 0xcf, 0x74, 0x6c, 0x2e, 0xbb, - 0x32, 0x70, 0x06, 0x0e, 0xfb, 0xb9, 0x49, 0x7f, 0x05, 0xd4, 0xca, 0xaf, 0x05, 0x28, 0xee, 0xe9, - 0xd6, 0x98, 0x78, 0x35, 0xc7, 0x25, 0x9d, 0x11, 0xe9, 0xe3, 0x1a, 0x2c, 0xf5, 0x1d, 0x6b, 0x3c, - 0xb4, 0xbd, 0x92, 0xb0, 0x96, 0x5c, 0xcf, 0x6d, 0xbd, 0xb1, 0x31, 0xcb, 0x8b, 0x1b, 0x75, 0xdd, - 0x1f, 0x0f, 0x9b, 0xf6, 0x81, 0x53, 0x4d, 0x3d, 0xfa, 0xfb, 0xd5, 0x05, 0x35, 0xd4, 0xc4, 0xaf, - 0x43, 0xd6, 0xd5, 0x8f, 0xb5, 0xfd, 0x53, 0x9f, 0x78, 0xa5, 0xc4, 0x5a, 0x72, 0x3d, 0xaf, 0x66, - 0x5c, 0xfd, 0xb8, 0x4a, 0xc7, 0xf8, 0x2a, 0x64, 0xec, 0xf1, 0x50, 0x73, 0x9d, 0x63, 0xaf, 0x94, - 0x5c, 0x13, 0xd6, 0x53, 0xa1, 0xb6, 0x3d, 0x1e, 0xaa, 0xce, 0xb1, 0x57, 0xf9, 0x57, 0x1a, 0x96, - 0xbb, 0xfa, 0xbe, 0x45, 0x54, 0xa2, 0x1b, 0xc4, 0x65, 0x66, 0x55, 0x21, 0xed, 0x53, 0x52, 0x49, - 0x58, 0x13, 0xd6, 0x73, 0x5b, 0x6f, 0x4d, 0x19, 0xe5, 0x1d, 0x59, 0xcc, 0x31, 0x4c, 0xad, 0x4e, - 0xbc, 0xbe, 0x6b, 0x8e, 0x7c, 0xc7, 0xe5, 0xc8, 0x81, 0x2a, 0xbe, 0x06, 0x59, 0xd3, 0x36, 0xc8, - 0x89, 0x66, 0x1a, 0x27, 0xa5, 0xc4, 0x9a, 0xb0, 0x5e, 0xe0, 0xfc, 0x0c, 0x23, 0x37, 0x8d, 0x13, - 0xbc, 0x0a, 0x4b, 0x2e, 0x79, 0x48, 0x5c, 0x8f, 0x30, 0xd3, 0x32, 0xa1, 0x69, 0x9c, 0x88, 0x25, - 0x48, 0x53, 0xff, 0x7a, 0xa5, 0x14, 0xf3, 0xcd, 0x8d, 0xd9, 0xbe, 0x99, 0x58, 0x80, 0x6e, 0x87, - 0x96, 0x30, 0x6d, 0xfc, 0x06, 0x80, 0x65, 0x0e, 0x4d, 0x5f, 0x3b, 0x34, 0x6d, 0xbf, 0x94, 0x5e, - 0x13, 0xd6, 0x93, 0x5c, 0x20, 0xcb, 0xe8, 0xb7, 0x4d, 0xdb, 0xa7, 0x7e, 0x32, 0x3d, 0xad, 0x7f, - 0x48, 0xfa, 0x0f, 0x4a, 0x8b, 0x71, 0x63, 0x4c, 0xaf, 0x46, 0x89, 0x58, 0x06, 0x78, 0x68, 0x7a, - 0xe6, 0xbe, 0x69, 0x99, 0xfe, 0x69, 0x69, 0x69, 0x4d, 0x58, 0x2f, 0x6e, 0xad, 0xcf, 0xb6, 0xa8, - 0xd3, 0xd7, 0xed, 0xbd, 0x48, 0x9e, 0x83, 0xc5, 0x10, 0xf0, 0x87, 0x70, 0x65, 0xa8, 0x9f, 0x68, - 0xbe, 0x39, 0x24, 0x9e, 0xaf, 0x0f, 0x47, 0x9a, 0x3e, 0x20, 0x9a, 0xad, 0xdb, 0x8e, 0x57, 0xca, - 0xc6, 0xe2, 0xb4, 0x32, 0xd4, 0x4f, 0xba, 0xa1, 0x8c, 0x38, 0x20, 0x32, 0x95, 0xc0, 0x9f, 0x02, - 0xe2, 0x79, 0xaf, 0x79, 0xbe, 0x4b, 0xec, 0x81, 0x7f, 0x58, 0x02, 0x66, 0xd2, 0xcd, 0x19, 0xb1, - 0xa2, 0xf6, 0xb4, 0x02, 0x95, 0x0e, 0xd7, 0xe0, 0x33, 0x2c, 0x5b, 0x93, 0x64, 0xbc, 0x0f, 0x97, - 0x43, 0xf0, 0x63, 0xdd, 0xf4, 0xb5, 0x91, 0x63, 0x99, 0xfd, 0xd3, 0x52, 0x8e, 0xe1, 0xdf, 0xfa, - 0xef, 0xf8, 0xf7, 0x74, 0xd3, 0x6f, 0x33, 0x1d, 0x3e, 0xc3, 0x25, 0x6b, 0x9a, 0x81, 0xdf, 0x82, - 0xdc, 0x48, 0x77, 0x75, 0xcb, 0x22, 0x96, 0xf9, 0x05, 0x29, 0xe5, 0x63, 0x1e, 0x8f, 0x33, 0xb0, - 0x0c, 0x45, 0xef, 0xd4, 0xf3, 0xc9, 0x50, 0x0b, 0xf7, 0x49, 0x61, 0x2d, 0xb9, 0x5e, 0xdc, 0xba, - 0x3e, 0xcb, 0x0c, 0x26, 0x5c, 0x63, 0xb2, 0x77, 0x4c, 0xdb, 0x50, 0x0b, 0x5e, 0x8c, 0xe2, 0xed, - 0xa4, 0x32, 0x19, 0x94, 0xad, 0xfc, 0x3b, 0x09, 0xa5, 0x26, 0xcd, 0xc2, 0xce, 0x03, 0x73, 0xf4, - 0x92, 0x92, 0x3f, 0x4a, 0xee, 0xe4, 0x0b, 0x25, 0xf7, 0x64, 0x5a, 0xa6, 0x5e, 0x38, 0x2d, 0x63, - 0x7b, 0x32, 0x7d, 0xde, 0x9e, 0x3c, 0x2f, 0xf3, 0x16, 0xbf, 0xe7, 0xcc, 0x5b, 0xba, 0xc0, 0xcc, - 0xab, 0x7c, 0x97, 0x86, 0xe2, 0x8e, 0x63, 0xda, 0x3f, 0x7c, 0xc4, 0x6f, 0x40, 0xd1, 0x72, 0x9c, - 0x07, 0xe3, 0x51, 0x94, 0xcb, 0x34, 0xf4, 0x85, 0x6a, 0x02, 0x09, 0x6a, 0x21, 0xe0, 0xf0, 0x34, - 0xa5, 0xe7, 0x82, 0x13, 0x9c, 0x2b, 0x2c, 0xa4, 0xb9, 0xad, 0x37, 0x67, 0x87, 0x54, 0x8a, 0x4e, - 0x1f, 0x3e, 0xe3, 0xa2, 0x63, 0x53, 0x1a, 0x7e, 0x1f, 0x52, 0xf4, 0x0c, 0xe4, 0xe1, 0xb9, 0x3a, - 0x63, 0x55, 0xd4, 0x17, 0xdd, 0xd3, 0x11, 0xe1, 0xca, 0x4c, 0xe5, 0xc2, 0x8b, 0xdd, 0xfb, 0xf0, - 0xea, 0xe4, 0xd2, 0x35, 0xdd, 0x25, 0xda, 0x03, 0x72, 0x5a, 0xca, 0xc4, 0x92, 0xec, 0xf2, 0x84, - 0x13, 0x44, 0x97, 0xdc, 0x21, 0xa7, 0xe7, 0x26, 0x5c, 0xf6, 0x7b, 0x4e, 0x38, 0xb8, 0xc8, 0x52, - 0xf7, 0x2e, 0x5c, 0x1a, 0xea, 0xa6, 0xed, 0xeb, 0xa6, 0xad, 0x39, 0xae, 0x41, 0x5c, 0xd3, 0x1e, - 0xb0, 0x62, 0x1a, 0x2e, 0x1b, 0x85, 0x6c, 0x85, 0x73, 0xcf, 0xa9, 0x7a, 0xf9, 0x17, 0xac, 0x7a, - 0x69, 0xb4, 0x48, 0xfb, 0x0f, 0xe8, 0x38, 0xae, 0xcf, 0xb3, 0xfe, 0x2e, 0x2c, 0x3b, 0x63, 0x7f, - 0x34, 0xf6, 0xcf, 0xac, 0x0a, 0xf2, 0xbf, 0x32, 0x3b, 0xd0, 0xa1, 0x85, 0xdc, 0xf2, 0x62, 0x00, - 0x10, 0xd9, 0xbd, 0x05, 0x38, 0xc4, 0xd2, 0x86, 0xba, 0xdf, 0x3f, 0xd4, 0x2c, 0x62, 0x4f, 0xec, - 0x06, 0x14, 0xf2, 0x77, 0x29, 0xbb, 0x45, 0xec, 0xca, 0x57, 0x02, 0xe4, 0xeb, 0xa6, 0xe7, 0x9b, - 0x76, 0xdf, 0x67, 0x76, 0x5d, 0x87, 0x65, 0x26, 0x44, 0x0c, 0x2d, 0xde, 0x1b, 0x15, 0xd4, 0x22, - 0x27, 0x87, 0x9b, 0xe4, 0x06, 0x20, 0x83, 0x2b, 0x46, 0x92, 0x09, 0x26, 0xb9, 0x1c, 0xd2, 0x43, - 0xd1, 0x2d, 0xc0, 0xf6, 0xd8, 0xb2, 0x82, 0xb4, 0x0b, 0x99, 0x13, 0x4d, 0x07, 0x62, 0x7c, 0xd1, - 0x25, 0xa1, 0x2d, 0xf8, 0x2d, 0xc8, 0x13, 0xd7, 0x75, 0x5c, 0xcd, 0xb1, 0x35, 0x63, 0x3c, 0x62, - 0x1b, 0x31, 0x1b, 0xe6, 0x36, 0xe3, 0x28, 0x76, 0x7d, 0x3c, 0xaa, 0x20, 0x28, 0x2a, 0xae, 0x61, - 0xda, 0x3a, 0xcd, 0x74, 0xba, 0x82, 0xca, 0x6f, 0x92, 0x80, 0x3e, 0x31, 0x07, 0x5f, 0xe8, 0x03, - 0xba, 0xb9, 0xb8, 0xbb, 0xeb, 0xb0, 0xc8, 0x2a, 0x45, 0xd8, 0xe9, 0xcd, 0x57, 0x65, 0xb8, 0x2e, - 0x6e, 0x00, 0x90, 0xa3, 0x89, 0xd5, 0xe6, 0xb6, 0xae, 0xcd, 0x8e, 0x17, 0x5f, 0x7f, 0xd8, 0xee, - 0x90, 0xa3, 0x33, 0xdf, 0x15, 0x83, 0x72, 0xe5, 0x04, 0xa6, 0x4f, 0xd4, 0x22, 0xc6, 0xe1, 0x6b, - 0xba, 0xa0, 0x5a, 0x74, 0x07, 0xf2, 0x07, 0xe6, 0x09, 0x31, 0xb4, 0x87, 0xac, 0x01, 0x2e, 0xa5, - 0x99, 0xe5, 0x4f, 0x29, 0x29, 0x93, 0x8d, 0xb2, 0x9a, 0x63, 0xda, 0x01, 0xf1, 0x05, 0x0a, 0x5b, - 0xe5, 0xaf, 0x49, 0x58, 0xde, 0x25, 0xee, 0x80, 0xc4, 0x22, 0xb3, 0x0b, 0x05, 0x8b, 0x1c, 0xbc, - 0xc0, 0x36, 0xc8, 0x53, 0xf5, 0x68, 0x13, 0x28, 0x50, 0x74, 0xcd, 0xc1, 0x61, 0x0c, 0x2f, 0x31, - 0x27, 0x5e, 0x81, 0xe9, 0x47, 0x80, 0xb1, 0x00, 0xa4, 0x5f, 0xc6, 0x61, 0x70, 0x03, 0x0a, 0x74, - 0x73, 0x68, 0xe4, 0x68, 0xac, 0x47, 0xe7, 0x41, 0xb8, 0x6f, 0xf2, 0x94, 0x25, 0x71, 0x0e, 0xfe, - 0x00, 0xae, 0x30, 0x57, 0x9e, 0xe5, 0xe8, 0x8c, 0x42, 0x4f, 0x0e, 0x7c, 0xe9, 0x68, 0xb2, 0xd0, - 0xff, 0x1c, 0x4a, 0x81, 0xdf, 0xce, 0x51, 0xce, 0xc6, 0x94, 0x57, 0x98, 0xd4, 0x94, 0x76, 0xe5, - 0x57, 0x49, 0x28, 0xde, 0xd6, 0xbd, 0xc3, 0x58, 0x5c, 0x6f, 0xc2, 0xf2, 0x94, 0x31, 0x41, 0x21, - 0xe1, 0x07, 0x6e, 0xdc, 0x04, 0x7c, 0x0b, 0xd0, 0xf4, 0xe4, 0x41, 0x2d, 0x61, 0xc2, 0xc5, 0xc9, - 0x29, 0x5f, 0x7a, 0x44, 0xde, 0x86, 0xe2, 0x90, 0x26, 0xf1, 0x59, 0x85, 0x8c, 0x87, 0xa4, 0x10, - 0xf0, 0x42, 0x63, 0x5f, 0x5e, 0x4c, 0xfe, 0x92, 0x00, 0xdc, 0xe4, 0xb7, 0xe5, 0x58, 0x5c, 0x7e, - 0xa0, 0x76, 0x4b, 0x81, 0x42, 0x78, 0x55, 0x7f, 0xde, 0xea, 0x95, 0x0f, 0x01, 0x58, 0xc0, 0x5e, - 0x72, 0xd4, 0x77, 0x52, 0x99, 0x24, 0x4a, 0x55, 0x7e, 0x2f, 0xc0, 0x4a, 0xe8, 0xd4, 0x86, 0x69, - 0xf9, 0xc4, 0xe5, 0x6e, 0xdd, 0x00, 0x14, 0xad, 0xb7, 0xef, 0x58, 0xcc, 0x33, 0x42, 0xcc, 0x33, - 0xc5, 0x90, 0x5b, 0x73, 0x2c, 0xea, 0x9f, 0xcf, 0xa6, 0xfd, 0x13, 0x94, 0xa9, 0x9f, 0x4c, 0x99, - 0xe4, 0x8c, 0xfc, 0x8d, 0xf8, 0x93, 0xc7, 0x06, 0xbd, 0x83, 0x9c, 0x2d, 0xaf, 0xed, 0x3a, 0xbe, - 0x73, 0x9e, 0xbb, 0x2a, 0x7f, 0xc8, 0x40, 0x51, 0x1c, 0x0c, 0x5c, 0x32, 0xd0, 0x7d, 0x27, 0x30, - 0xf1, 0x1a, 0xc0, 0xc0, 0x75, 0x82, 0x2e, 0x30, 0xbe, 0xbf, 0xb2, 0x8c, 0x5a, 0x73, 0x2c, 0x0f, - 0x7f, 0x06, 0x79, 0x9d, 0x2b, 0x99, 0x4e, 0x74, 0x3b, 0xfa, 0xe9, 0x6c, 0x4f, 0x4f, 0x4e, 0x11, - 0x0d, 0x63, 0x41, 0x8c, 0xe3, 0xe1, 0x1f, 0xf3, 0x16, 0x85, 0x18, 0x5a, 0xcc, 0x94, 0x54, 0x64, - 0x0a, 0xe2, 0xdc, 0xed, 0xc8, 0xa2, 0x6d, 0x1e, 0xb1, 0x34, 0x8b, 0xd8, 0x3b, 0xcf, 0x6c, 0xc9, - 0x74, 0xfc, 0xca, 0xbf, 0x48, 0x40, 0x2e, 0x66, 0x1e, 0x05, 0x3e, 0x18, 0xdb, 0x7d, 0x16, 0xa4, - 0x79, 0x80, 0x1b, 0x63, 0xbb, 0x1f, 0x02, 0x53, 0x00, 0xbc, 0x06, 0x99, 0xa8, 0xa7, 0x49, 0xc4, - 0x76, 0x65, 0x44, 0xc5, 0x6f, 0x42, 0xf1, 0x80, 0xe5, 0x4a, 0x94, 0x19, 0x74, 0x33, 0x14, 0xd4, - 0x7c, 0x40, 0xe5, 0x19, 0x71, 0x85, 0xbd, 0x46, 0x31, 0x76, 0x9a, 0xf5, 0x51, 0x8b, 0xfd, 0x80, - 0x71, 0x1b, 0xb2, 0xba, 0x3b, 0x18, 0x0f, 0x89, 0xed, 0x7b, 0xa5, 0x45, 0x16, 0x91, 0x79, 0x72, - 0xff, 0x4c, 0x99, 0xe7, 0xf0, 0x3f, 0x93, 0x90, 0xa2, 0xab, 0xc0, 0x08, 0xf2, 0xa2, 0xfc, 0xb1, - 0x26, 0x2b, 0x5d, 0x4d, 0xee, 0xb5, 0x5a, 0x68, 0x01, 0x2f, 0x41, 0x52, 0xdc, 0xdb, 0x46, 0x02, - 0xce, 0x43, 0xa6, 0xaa, 0x28, 0x2d, 0x4d, 0x94, 0xeb, 0x28, 0x81, 0x73, 0xb0, 0xc4, 0x46, 0x8a, - 0x8a, 0x92, 0xb8, 0x08, 0x50, 0x53, 0xe4, 0x9a, 0xd8, 0xd5, 0xc4, 0xed, 0x6d, 0x94, 0xc2, 0x59, - 0x48, 0xd7, 0x94, 0x9e, 0xdc, 0x45, 0x69, 0xaa, 0xbe, 0x2b, 0xde, 0x47, 0x4b, 0xec, 0x47, 0x53, - 0x46, 0x19, 0x0c, 0xb0, 0xd8, 0xe9, 0xd6, 0xeb, 0xd2, 0x1e, 0xca, 0x52, 0x62, 0xa7, 0xb7, 0x8b, - 0x80, 0xc2, 0x75, 0x7a, 0xbb, 0x5a, 0x53, 0xee, 0xa2, 0x1c, 0x9d, 0x69, 0x4f, 0x54, 0x9b, 0xa2, - 0x5c, 0x93, 0x50, 0x9e, 0xb2, 0xee, 0x2b, 0x2a, 0x43, 0x2e, 0x04, 0x33, 0xf5, 0xe4, 0xae, 0xa6, - 0x2a, 0xf7, 0x3a, 0xa8, 0xc8, 0xf4, 0xee, 0xaa, 0xf5, 0x66, 0xa3, 0x81, 0x96, 0x31, 0x86, 0x62, - 0xa3, 0x29, 0x8b, 0x2d, 0x2d, 0xd2, 0x46, 0x74, 0x41, 0x01, 0x8d, 0xcf, 0x79, 0x09, 0x17, 0x20, - 0x2b, 0xaa, 0xaa, 0xf8, 0x31, 0x43, 0xc4, 0x74, 0xb2, 0x9d, 0x8e, 0x22, 0xb3, 0xd1, 0x65, 0xca, - 0xa4, 0xa3, 0x2a, 0x1b, 0xae, 0xd0, 0xe9, 0x3a, 0x5d, 0xb5, 0x29, 0x6f, 0xb3, 0xf1, 0x2b, 0x6c, - 0xd5, 0xcd, 0x2e, 0x73, 0xc1, 0xab, 0x74, 0x21, 0x74, 0xa0, 0xa8, 0xe8, 0x0a, 0xce, 0x40, 0xaa, - 0xa6, 0xa8, 0x2a, 0x2a, 0xe1, 0x12, 0xac, 0xb4, 0x25, 0xb5, 0x26, 0xc9, 0xdd, 0x66, 0x4b, 0xd2, - 0xea, 0xcd, 0x4e, 0x4d, 0x6b, 0xee, 0xb6, 0x5b, 0xe8, 0xb5, 0x29, 0x4e, 0x4d, 0x91, 0xbb, 0x01, - 0xa7, 0x8c, 0x2f, 0xc3, 0x32, 0xb3, 0x41, 0xa9, 0xee, 0x48, 0xb5, 0xc0, 0x89, 0xaf, 0xe3, 0x15, - 0x40, 0x81, 0x29, 0x31, 0xea, 0xff, 0x51, 0x0b, 0xf6, 0x44, 0x55, 0x6b, 0x2b, 0x6d, 0xf4, 0xff, - 0x81, 0x79, 0x74, 0x59, 0x6c, 0xbc, 0x8a, 0x97, 0x21, 0xd7, 0xe9, 0x6a, 0xbb, 0xe2, 0x1d, 0xa9, - 0xd5, 0x94, 0x25, 0x74, 0x95, 0x2e, 0xa7, 0xd3, 0xd5, 0xa4, 0xfb, 0x5d, 0x49, 0xee, 0xa2, 0xb5, - 0xca, 0x2d, 0x48, 0xd1, 0x4d, 0x40, 0xad, 0x15, 0x7b, 0x5d, 0x05, 0x2d, 0xb0, 0x60, 0xd4, 0xc4, - 0x96, 0xa8, 0x22, 0x81, 0xa2, 0xc9, 0x8a, 0xac, 0xf1, 0x71, 0xa2, 0xf2, 0xa7, 0x45, 0x78, 0xbd, - 0x69, 0xfb, 0xc4, 0xb5, 0x88, 0xfe, 0x90, 0x18, 0xc1, 0xfd, 0x3c, 0x76, 0x6c, 0x7c, 0x3c, 0xd5, - 0x40, 0x7f, 0x38, 0x3b, 0x03, 0x9f, 0x02, 0x13, 0x1c, 0x2b, 0x53, 0x5d, 0x75, 0xec, 0xd1, 0x23, - 0x71, 0xde, 0xa3, 0xc7, 0xe4, 0x0b, 0x62, 0xf2, 0xfc, 0x17, 0xc4, 0x0b, 0xbd, 0xb3, 0xa7, 0xe7, - 0x6f, 0x0a, 0xfe, 0xd7, 0x5f, 0x66, 0xca, 0x5f, 0x25, 0x20, 0xcd, 0xa2, 0x83, 0x3f, 0x82, 0x94, - 0x41, 0xbc, 0xfe, 0x73, 0x35, 0x08, 0x4c, 0xf3, 0x59, 0xfa, 0x83, 0x1a, 0xa4, 0x46, 0x8e, 0x17, - 0x84, 0xf3, 0xa9, 0xef, 0x6f, 0x6d, 0xc7, 0xf3, 0xdb, 0xc1, 0x37, 0x01, 0x9a, 0x41, 0xe1, 0x3c, - 0x54, 0x19, 0xd7, 0x21, 0x13, 0xb5, 0xf9, 0xa9, 0x39, 0xdb, 0xfc, 0x48, 0xf3, 0xec, 0x2d, 0x30, - 0xfd, 0x22, 0x6f, 0x81, 0x95, 0x3f, 0x0b, 0x50, 0x6c, 0xbb, 0xce, 0xe7, 0xa4, 0xef, 0x77, 0x48, - 0x70, 0x99, 0xfe, 0x08, 0xd2, 0x34, 0x23, 0xc3, 0x3d, 0x33, 0x4f, 0x4a, 0x06, 0x8a, 0x78, 0x1b, - 0x2e, 0x0d, 0x88, 0x4d, 0x5c, 0xdd, 0x8f, 0xb5, 0x9b, 0xc1, 0xc5, 0xb3, 0x3c, 0x1d, 0x18, 0x32, - 0xdc, 0x08, 0xbe, 0xba, 0x74, 0x55, 0x14, 0x29, 0x85, 0x7d, 0xe8, 0x75, 0x40, 0xf6, 0x98, 0xbd, - 0x68, 0x78, 0xda, 0x88, 0xb8, 0xda, 0x80, 0xd8, 0xc1, 0xa5, 0x53, 0x2d, 0xd8, 0xe3, 0x21, 0x3d, - 0x6a, 0xdb, 0xc4, 0xdd, 0x26, 0x76, 0xe5, 0xdb, 0x02, 0xe4, 0xef, 0x99, 0xb6, 0xe1, 0x1c, 0xf3, - 0x9d, 0xbf, 0xc6, 0x1e, 0x8b, 0x7d, 0x93, 0x1d, 0xea, 0xa7, 0xfc, 0x35, 0x20, 0x4e, 0xc2, 0x1d, - 0xc8, 0x1e, 0x33, 0x8d, 0x46, 0x64, 0xdc, 0xe6, 0xec, 0xa5, 0xc6, 0xc1, 0xf9, 0xa0, 0x11, 0x9d, - 0x55, 0x11, 0x4e, 0xf9, 0x8f, 0x02, 0x3f, 0xa5, 0x3a, 0x50, 0x08, 0x7b, 0x08, 0xd2, 0x78, 0xde, - 0x13, 0x5b, 0x9d, 0xc4, 0xc0, 0x77, 0x01, 0xf8, 0x54, 0x14, 0x31, 0xc1, 0x10, 0xdf, 0x9d, 0xcf, - 0x66, 0x8a, 0x1a, 0x03, 0xf9, 0x20, 0xf5, 0xe8, 0xcb, 0xab, 0x42, 0xf9, 0xcb, 0x25, 0x48, 0x37, - 0x5c, 0x7d, 0x48, 0xf0, 0x1d, 0x48, 0x0d, 0x1d, 0x83, 0x70, 0x73, 0x9f, 0x15, 0x9c, 0xe9, 0x6e, - 0xec, 0x3a, 0x46, 0x54, 0x5e, 0x28, 0x08, 0xbe, 0x0b, 0x8b, 0xfb, 0xce, 0xd8, 0x36, 0xbc, 0x19, - 0x7d, 0xe2, 0xd3, 0xe1, 0xaa, 0x4c, 0x35, 0x2c, 0x76, 0x01, 0x10, 0xfe, 0x04, 0xb2, 0xe4, 0xa4, - 0x6f, 0x8d, 0x69, 0xd2, 0xb1, 0x6d, 0x58, 0xdc, 0x7a, 0x6f, 0x2e, 0x54, 0x29, 0xd4, 0x8e, 0x1e, - 0x38, 0x42, 0x42, 0xf9, 0x3b, 0x01, 0xd2, 0x6c, 0x52, 0x3a, 0x0b, 0x9b, 0x8f, 0x16, 0x4c, 0xee, - 0x8a, 0xf7, 0xe6, 0xb7, 0x3d, 0x56, 0x6e, 0xcf, 0xe0, 0xe8, 0xc1, 0x60, 0xda, 0xbe, 0xe6, 0x1c, - 0x1c, 0x78, 0x24, 0xe8, 0xbd, 0xc2, 0xef, 0x36, 0x59, 0xd3, 0xf6, 0x15, 0x46, 0xc6, 0xd7, 0x20, - 0x4f, 0x77, 0x85, 0x11, 0x8a, 0xd1, 0x95, 0xe6, 0xd5, 0x1c, 0xa3, 0x71, 0x91, 0x1d, 0xc8, 0x05, - 0x4c, 0xf6, 0xb5, 0x93, 0x57, 0x92, 0x39, 0xbe, 0x05, 0x42, 0xa0, 0x4d, 0x6d, 0x2a, 0xff, 0x56, - 0x80, 0xc5, 0xc0, 0xdd, 0x58, 0x86, 0xb4, 0xe7, 0xeb, 0xae, 0xcf, 0x0b, 0xe9, 0xd6, 0xfc, 0xcb, - 0x8e, 0x0a, 0x0c, 0x85, 0xc1, 0x75, 0x48, 0x12, 0xdb, 0xe0, 0x09, 0xf0, 0x1c, 0x68, 0x2a, 0x55, - 0xaf, 0x5c, 0x87, 0x14, 0xcd, 0x2e, 0xda, 0xb6, 0xa9, 0xa2, 0xbc, 0x2d, 0xa1, 0x05, 0xda, 0x21, - 0xb0, 0x0e, 0x4b, 0xa0, 0x1d, 0xc2, 0xb6, 0xaa, 0xf4, 0xda, 0x1d, 0x94, 0xa8, 0x7c, 0x01, 0xd9, - 0xc8, 0xf7, 0xf8, 0x0a, 0x5c, 0xee, 0xc9, 0x55, 0xa5, 0x27, 0xd7, 0xa5, 0xba, 0xd6, 0x56, 0xa5, - 0x9a, 0x54, 0x6f, 0xca, 0xdb, 0x68, 0x61, 0x92, 0xd1, 0x50, 0x5a, 0x2d, 0xe5, 0x1e, 0x65, 0x08, - 0xb4, 0xa3, 0x51, 0x1a, 0x8d, 0x8e, 0xd4, 0x8d, 0x89, 0x27, 0x62, 0xd4, 0x33, 0xd9, 0x24, 0x6d, - 0x65, 0x6a, 0x3d, 0x55, 0x95, 0x82, 0x56, 0x0f, 0xa5, 0x2a, 0x9f, 0x42, 0x36, 0xca, 0x2e, 0xda, - 0xd5, 0xc9, 0x8a, 0x26, 0xdd, 0xaf, 0xb5, 0x7a, 0x9d, 0xa6, 0x22, 0x07, 0x93, 0xb2, 0x61, 0x5d, - 0xd2, 0xe2, 0x7a, 0x02, 0xbe, 0x04, 0x85, 0x90, 0xc1, 0xd6, 0x81, 0x12, 0x54, 0x3b, 0x24, 0x75, - 0x9b, 0x52, 0x07, 0x25, 0xcb, 0x7f, 0x4b, 0x40, 0x26, 0xac, 0x3b, 0x58, 0x8a, 0x5d, 0x03, 0x72, - 0x5b, 0x6f, 0x3f, 0xab, 0x57, 0xa7, 0x2f, 0x01, 0x17, 0x73, 0x12, 0x55, 0x21, 0x7d, 0x40, 0xe3, - 0xc5, 0x6f, 0xb8, 0xb7, 0xe6, 0x89, 0xb1, 0x1a, 0xa8, 0xe2, 0x75, 0x98, 0xb8, 0x56, 0xb0, 0x26, - 0x24, 0x1d, 0x5e, 0xc6, 0x26, 0x2e, 0x1c, 0x65, 0xc8, 0xe8, 0xee, 0xc0, 0x6b, 0x1a, 0x27, 0x5e, - 0x69, 0x89, 0x55, 0xf5, 0x68, 0x4c, 0x51, 0x82, 0xd7, 0x65, 0x8e, 0x92, 0x89, 0x1d, 0xe2, 0x13, - 0x9c, 0x9d, 0x54, 0x26, 0x81, 0x92, 0xfc, 0x66, 0xf1, 0x3b, 0x01, 0xe0, 0xac, 0x3a, 0xd2, 0x1e, - 0x53, 0x55, 0xee, 0x69, 0x72, 0x6f, 0xb7, 0x2a, 0xa9, 0x3c, 0xcf, 0x44, 0xf9, 0x4e, 0xd0, 0x7d, - 0xd6, 0x25, 0xb9, 0x23, 0x69, 0x6c, 0xcc, 0x82, 0xc4, 0xbb, 0xe5, 0x80, 0x92, 0xa4, 0xcd, 0x6c, - 0xad, 0xb7, 0xcb, 0x7a, 0xea, 0x6e, 0x70, 0xc9, 0x60, 0x9d, 0x74, 0x70, 0xc9, 0x68, 0x89, 0xdb, - 0x68, 0x91, 0xc2, 0xb5, 0x24, 0xb1, 0x8e, 0x96, 0x68, 0xfe, 0x34, 0x9a, 0x6a, 0xa7, 0xab, 0xed, - 0x89, 0xad, 0x9e, 0x84, 0x32, 0x14, 0xbf, 0x25, 0x46, 0xe3, 0x2c, 0x45, 0x93, 0xbb, 0xb7, 0xf9, - 0x10, 0x6e, 0xfe, 0x0c, 0x8a, 0x93, 0x1f, 0x4d, 0x68, 0xe2, 0xb7, 0x7b, 0xd5, 0x56, 0xb3, 0x86, - 0x16, 0xf0, 0x6b, 0xf0, 0x4a, 0xf0, 0x9b, 0xb6, 0xfe, 0xec, 0x76, 0xc4, 0x59, 0x42, 0xf5, 0x9d, - 0x47, 0xdf, 0xae, 0x2e, 0x3c, 0x7a, 0xbc, 0x2a, 0x7c, 0xfd, 0x78, 0x55, 0xf8, 0xe6, 0xf1, 0xaa, - 0xf0, 0x8f, 0xc7, 0xab, 0xc2, 0x2f, 0x9f, 0xac, 0x2e, 0x7c, 0xfd, 0x64, 0x75, 0xe1, 0x9b, 0x27, - 0xab, 0x0b, 0x9f, 0xe4, 0x62, 0xff, 0xcb, 0xf0, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x93, 0x56, - 0x71, 0x9c, 0xbb, 0x21, 0x00, 0x00, + proto.RegisterFile("sql/execinfrapb/processors_sql.proto", fileDescriptor_processors_sql_87f40537b51e0560) +} + +var fileDescriptor_processors_sql_87f40537b51e0560 = []byte{ + // 2734 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcd, 0x73, 0xdb, 0xc6, + 0xf5, 0x02, 0x3f, 0x24, 0xf2, 0xf1, 0x43, 0xeb, 0xb5, 0x12, 0x33, 0xcc, 0xef, 0x27, 0xcb, 0x4c, + 0x1a, 0xcb, 0x8e, 0x23, 0x35, 0x6a, 0x27, 0x9d, 0x24, 0x3d, 0x04, 0x24, 0x41, 0x99, 0x32, 0x05, + 0xd0, 0x20, 0x29, 0x3b, 0xc9, 0x4c, 0x30, 0x10, 0xb1, 0xa2, 0x10, 0x83, 0x00, 0x05, 0x80, 0x96, + 0x94, 0x7f, 0xa0, 0xd7, 0x76, 0x7a, 0xe9, 0xa9, 0x93, 0x4b, 0xfb, 0x17, 0xf4, 0xd6, 0x99, 0xf4, + 0xd2, 0x83, 0x8f, 0x99, 0x1e, 0xda, 0x9c, 0x3a, 0x8d, 0xfd, 0x17, 0xb4, 0x97, 0x4c, 0x6f, 0x9d, + 0x5d, 0x2c, 0x20, 0x90, 0x23, 0xba, 0xa6, 0xad, 0xc4, 0xd3, 0x8b, 0x86, 0xfb, 0xbe, 0xf6, 0x7d, + 0xed, 0xdb, 0xf7, 0x16, 0x82, 0x37, 0xbd, 0x23, 0x6b, 0x93, 0x9c, 0x90, 0xbe, 0x69, 0x1f, 0xb8, + 0xfa, 0x68, 0x7f, 0x73, 0xe4, 0x3a, 0x7d, 0xe2, 0x79, 0x8e, 0xeb, 0x69, 0xde, 0x91, 0xb5, 0x31, + 0x72, 0x1d, 0xdf, 0xc1, 0xa5, 0xbe, 0xd3, 0x7f, 0xe0, 0x3a, 0x7a, 0xff, 0x70, 0x83, 0x02, 0x0d, + 0xd3, 0xf3, 0xbd, 0x23, 0xcb, 0x1d, 0xdb, 0xe5, 0x37, 0x28, 0x7f, 0x5f, 0xf7, 0x75, 0xcb, 0x19, + 0x6c, 0x1a, 0xc4, 0xeb, 0x8f, 0xf6, 0x37, 0x3d, 0xdf, 0x1d, 0xf7, 0xfd, 0xb1, 0x4b, 0x8c, 0x80, + 0xbd, 0x5c, 0x39, 0x87, 0xe8, 0x73, 0xc7, 0xb4, 0x35, 0xff, 0x74, 0x44, 0x38, 0xcd, 0xda, 0x39, + 0x34, 0x96, 0xd3, 0x7f, 0x60, 0xda, 0x03, 0x4e, 0xf1, 0x0a, 0xa5, 0xa0, 0x1c, 0x5e, 0xf0, 0x97, + 0x83, 0xcb, 0xd3, 0x16, 0x18, 0xba, 0xaf, 0x73, 0xdc, 0x8f, 0x9e, 0x62, 0xdd, 0xbe, 0xee, 0x85, + 0x7b, 0xdf, 0xa4, 0x64, 0xce, 0xc8, 0xdf, 0x34, 0xed, 0x87, 0xc4, 0xf5, 0x89, 0x41, 0x4e, 0x46, + 0xee, 0xa6, 0x37, 0xd2, 0x6d, 0x8d, 0xfe, 0x22, 0x9e, 0x67, 0x3a, 0x36, 0xa7, 0x5d, 0x19, 0x38, + 0x03, 0x87, 0xfd, 0xdc, 0xa4, 0xbf, 0x02, 0x68, 0xe5, 0xd7, 0x02, 0x14, 0xf7, 0x74, 0x6b, 0x4c, + 0xbc, 0x9a, 0xe3, 0x92, 0xce, 0x88, 0xf4, 0x71, 0x0d, 0x96, 0xfa, 0x8e, 0x35, 0x1e, 0xda, 0x5e, + 0x49, 0x58, 0x4b, 0xae, 0xe7, 0xb6, 0xde, 0xd8, 0x98, 0xe5, 0xc5, 0x8d, 0xba, 0xee, 0x8f, 0x87, + 0x4d, 0xfb, 0xc0, 0xa9, 0xa6, 0x1e, 0xfd, 0xfd, 0xea, 0x82, 0x1a, 0x72, 0xe2, 0xd7, 0x21, 0xeb, + 0xea, 0xc7, 0xda, 0xfe, 0xa9, 0x4f, 0xbc, 0x52, 0x62, 0x2d, 0xb9, 0x9e, 0x57, 0x33, 0xae, 0x7e, + 0x5c, 0xa5, 0x6b, 0x7c, 0x15, 0x32, 0xf6, 0x78, 0xa8, 0xb9, 0xce, 0xb1, 0x57, 0x4a, 0xae, 0x09, + 0xeb, 0xa9, 0x90, 0xdb, 0x1e, 0x0f, 0x55, 0xe7, 0xd8, 0xab, 0xfc, 0x33, 0x0d, 0xcb, 0x5d, 0x7d, + 0xdf, 0x22, 0x2a, 0xd1, 0x0d, 0xe2, 0x32, 0xb5, 0xaa, 0x90, 0xf6, 0x29, 0xa8, 0x24, 0xac, 0x09, + 0xeb, 0xb9, 0xad, 0xb7, 0xa6, 0x94, 0xf2, 0x8e, 0x2c, 0xe6, 0x18, 0xc6, 0x56, 0x27, 0x5e, 0xdf, + 0x35, 0x47, 0xbe, 0xe3, 0x72, 0xc9, 0x01, 0x2b, 0xbe, 0x06, 0x59, 0xd3, 0x36, 0xc8, 0x89, 0x66, + 0x1a, 0x27, 0xa5, 0xc4, 0x9a, 0xb0, 0x5e, 0xe0, 0xf8, 0x0c, 0x03, 0x37, 0x8d, 0x13, 0xbc, 0x0a, + 0x4b, 0x2e, 0x79, 0x48, 0x5c, 0x8f, 0x30, 0xd5, 0x32, 0xa1, 0x6a, 0x1c, 0x88, 0x25, 0x48, 0x53, + 0xff, 0x7a, 0xa5, 0x14, 0xf3, 0xcd, 0x8d, 0xd9, 0xbe, 0x99, 0x30, 0x40, 0xb7, 0x43, 0x4d, 0x18, + 0x37, 0x7e, 0x03, 0xc0, 0x32, 0x87, 0xa6, 0xaf, 0x1d, 0x9a, 0xb6, 0x5f, 0x4a, 0xaf, 0x09, 0xeb, + 0x49, 0x4e, 0x90, 0x65, 0xf0, 0xdb, 0xa6, 0xed, 0x53, 0x3f, 0x99, 0x9e, 0xd6, 0x3f, 0x24, 0xfd, + 0x07, 0xa5, 0xc5, 0xb8, 0x32, 0xa6, 0x57, 0xa3, 0x40, 0x2c, 0x03, 0x3c, 0x34, 0x3d, 0x73, 0xdf, + 0xb4, 0x4c, 0xff, 0xb4, 0xb4, 0xb4, 0x26, 0xac, 0x17, 0xb7, 0xd6, 0x67, 0x6b, 0xd4, 0xe9, 0xeb, + 0xf6, 0x5e, 0x44, 0xcf, 0x85, 0xc5, 0x24, 0xe0, 0x0f, 0xe1, 0xca, 0x50, 0x3f, 0xd1, 0x7c, 0x73, + 0x48, 0x3c, 0x5f, 0x1f, 0x8e, 0x34, 0x7d, 0x40, 0x34, 0x5b, 0xb7, 0x1d, 0xaf, 0x94, 0x8d, 0xc5, + 0x69, 0x65, 0xa8, 0x9f, 0x74, 0x43, 0x1a, 0x71, 0x40, 0x64, 0x4a, 0x81, 0x3f, 0x05, 0xc4, 0xf3, + 0x5e, 0xf3, 0x7c, 0x97, 0xd8, 0x03, 0xff, 0xb0, 0x04, 0x4c, 0xa5, 0x9b, 0x33, 0x62, 0x45, 0xf5, + 0x69, 0x05, 0x2c, 0x1d, 0xce, 0xc1, 0x77, 0x58, 0xb6, 0x26, 0xc1, 0x78, 0x1f, 0x2e, 0x87, 0xc2, + 0x8f, 0x75, 0xd3, 0xd7, 0x46, 0x8e, 0x65, 0xf6, 0x4f, 0x4b, 0x39, 0x26, 0xff, 0xd6, 0x7f, 0x97, + 0x7f, 0x4f, 0x37, 0xfd, 0x36, 0xe3, 0xe1, 0x3b, 0x5c, 0xb2, 0xa6, 0x11, 0xf8, 0x2d, 0xc8, 0x8d, + 0x74, 0x57, 0xb7, 0x2c, 0x62, 0x99, 0x5f, 0x90, 0x52, 0x3e, 0xe6, 0xf1, 0x38, 0x02, 0xcb, 0x50, + 0xf4, 0x4e, 0x3d, 0x9f, 0x0c, 0xb5, 0xf0, 0x9c, 0x14, 0xd6, 0x92, 0xeb, 0xc5, 0xad, 0xeb, 0xb3, + 0xd4, 0x60, 0xc4, 0x35, 0x46, 0x7b, 0xc7, 0xb4, 0x0d, 0xb5, 0xe0, 0xc5, 0x20, 0xde, 0x4e, 0x2a, + 0x93, 0x41, 0xd9, 0xca, 0xbf, 0x93, 0x50, 0x6a, 0xd2, 0x2c, 0xec, 0x3c, 0x30, 0x47, 0x2f, 0x29, + 0xf9, 0xa3, 0xe4, 0x4e, 0xbe, 0x50, 0x72, 0x4f, 0xa6, 0x65, 0xea, 0x85, 0xd3, 0x32, 0x76, 0x26, + 0xd3, 0xe7, 0x9d, 0xc9, 0xf3, 0x32, 0x6f, 0xf1, 0x7b, 0xce, 0xbc, 0xa5, 0x0b, 0xcc, 0xbc, 0xca, + 0x77, 0x69, 0x28, 0xee, 0x38, 0xa6, 0xfd, 0xc3, 0x47, 0xfc, 0x06, 0x14, 0x2d, 0xc7, 0x79, 0x30, + 0x1e, 0x45, 0xb9, 0x4c, 0x43, 0x5f, 0xa8, 0x26, 0x90, 0xa0, 0x16, 0x02, 0x0c, 0x4f, 0x53, 0x7a, + 0x2f, 0x38, 0xc1, 0xbd, 0xc2, 0x42, 0x9a, 0xdb, 0x7a, 0x73, 0x76, 0x48, 0xa5, 0xe8, 0xf6, 0xe1, + 0x3b, 0x2e, 0x3a, 0x36, 0x85, 0xe1, 0xf7, 0x21, 0x45, 0xef, 0x40, 0x1e, 0x9e, 0xab, 0x33, 0xac, + 0xa2, 0xbe, 0xe8, 0x9e, 0x8e, 0x08, 0x67, 0x66, 0x2c, 0x17, 0x5e, 0xec, 0xde, 0x87, 0x57, 0x27, + 0x4d, 0xd7, 0x74, 0x97, 0x68, 0x0f, 0xc8, 0x69, 0x29, 0x13, 0x4b, 0xb2, 0xcb, 0x13, 0x4e, 0x10, + 0x5d, 0x72, 0x87, 0x9c, 0x9e, 0x9b, 0x70, 0xd9, 0xef, 0x39, 0xe1, 0xe0, 0x22, 0x4b, 0xdd, 0xbb, + 0x70, 0x69, 0xa8, 0x9b, 0xb6, 0xaf, 0x9b, 0xb6, 0xe6, 0xb8, 0x06, 0x71, 0x4d, 0x7b, 0xc0, 0x8a, + 0x69, 0x68, 0x36, 0x0a, 0xd1, 0x0a, 0xc7, 0x9e, 0x53, 0xf5, 0xf2, 0x2f, 0x58, 0xf5, 0xd2, 0x68, + 0x91, 0xf6, 0x1f, 0xd0, 0x71, 0x5c, 0x9f, 0x67, 0xfd, 0x5d, 0x58, 0x76, 0xc6, 0xfe, 0x68, 0xec, + 0x9f, 0x69, 0x15, 0xe4, 0x7f, 0x65, 0x76, 0xa0, 0x43, 0x0d, 0xb9, 0xe6, 0xc5, 0x40, 0x40, 0xa4, + 0xf7, 0x16, 0xe0, 0x50, 0x96, 0x36, 0xd4, 0xfd, 0xfe, 0xa1, 0x66, 0x11, 0x7b, 0xe2, 0x34, 0xa0, + 0x10, 0xbf, 0x4b, 0xd1, 0x2d, 0x62, 0x57, 0xbe, 0x12, 0x20, 0x5f, 0x37, 0x3d, 0xdf, 0xb4, 0xfb, + 0x3e, 0xd3, 0xeb, 0x3a, 0x2c, 0x33, 0x22, 0x62, 0x68, 0xf1, 0xde, 0xa8, 0xa0, 0x16, 0x39, 0x38, + 0x3c, 0x24, 0x37, 0x00, 0x19, 0x9c, 0x31, 0xa2, 0x4c, 0x30, 0xca, 0xe5, 0x10, 0x1e, 0x92, 0x6e, + 0x01, 0xb6, 0xc7, 0x96, 0x15, 0xa4, 0x5d, 0x88, 0x9c, 0x68, 0x3a, 0x10, 0xc3, 0x8b, 0x2e, 0x09, + 0x75, 0xc1, 0x6f, 0x41, 0x9e, 0xb8, 0xae, 0xe3, 0x6a, 0x8e, 0xad, 0x19, 0xe3, 0x11, 0x3b, 0x88, + 0xd9, 0x30, 0xb7, 0x19, 0x46, 0xb1, 0xeb, 0xe3, 0x51, 0x05, 0x41, 0x51, 0x71, 0x0d, 0xd3, 0xd6, + 0x69, 0xa6, 0x53, 0x0b, 0x2a, 0xbf, 0x49, 0x02, 0xfa, 0xc4, 0x1c, 0x7c, 0xa1, 0x0f, 0xe8, 0xe1, + 0xe2, 0xee, 0xae, 0xc3, 0x22, 0xab, 0x14, 0x61, 0xa7, 0x37, 0x5f, 0x95, 0xe1, 0xbc, 0xb8, 0x01, + 0x40, 0x8e, 0x26, 0xac, 0xcd, 0x6d, 0x5d, 0x9b, 0x1d, 0x2f, 0x6e, 0x7f, 0xd8, 0xee, 0x90, 0xa3, + 0x33, 0xdf, 0x15, 0x83, 0x72, 0xe5, 0x04, 0xaa, 0x4f, 0xd4, 0x22, 0x86, 0xe1, 0x36, 0x5d, 0x50, + 0x2d, 0xba, 0x03, 0xf9, 0x03, 0xf3, 0x84, 0x18, 0xda, 0x43, 0xd6, 0x00, 0x97, 0xd2, 0x4c, 0xf3, + 0xa7, 0x94, 0x94, 0xc9, 0x46, 0x59, 0xcd, 0x31, 0xee, 0x00, 0xf8, 0x02, 0x85, 0xad, 0xf2, 0xd7, + 0x24, 0x2c, 0xef, 0x12, 0x77, 0x40, 0x62, 0x91, 0xd9, 0x85, 0x82, 0x45, 0x0e, 0x5e, 0xe0, 0x18, + 0xe4, 0x29, 0x7b, 0x74, 0x08, 0x14, 0x28, 0xba, 0xe6, 0xe0, 0x30, 0x26, 0x2f, 0x31, 0xa7, 0xbc, + 0x02, 0xe3, 0x8f, 0x04, 0xc6, 0x02, 0x90, 0x7e, 0x19, 0x97, 0xc1, 0x0d, 0x28, 0xd0, 0xc3, 0xa1, + 0x91, 0xa3, 0xb1, 0x1e, 0xdd, 0x07, 0xe1, 0xb9, 0xc9, 0x53, 0x94, 0xc4, 0x31, 0xf8, 0x03, 0xb8, + 0xc2, 0x5c, 0x79, 0x96, 0xa3, 0x33, 0x0a, 0x3d, 0x39, 0xf0, 0xa5, 0xa3, 0xc9, 0x42, 0xff, 0x73, + 0x28, 0x05, 0x7e, 0x3b, 0x87, 0x39, 0x1b, 0x63, 0x5e, 0x61, 0x54, 0x53, 0xdc, 0x95, 0x5f, 0x25, + 0xa1, 0x78, 0x5b, 0xf7, 0x0e, 0x63, 0x71, 0xbd, 0x09, 0xcb, 0x53, 0xca, 0x04, 0x85, 0x84, 0x5f, + 0xb8, 0x71, 0x15, 0xf0, 0x2d, 0x40, 0xd3, 0x9b, 0x07, 0xb5, 0x84, 0x11, 0x17, 0x27, 0xb7, 0x7c, + 0xe9, 0x11, 0x79, 0x1b, 0x8a, 0x43, 0x9a, 0xc4, 0x67, 0x15, 0x32, 0x1e, 0x92, 0x42, 0x80, 0x0b, + 0x95, 0x7d, 0x79, 0x31, 0xf9, 0x4b, 0x02, 0x70, 0x93, 0x4f, 0xcb, 0xb1, 0xb8, 0xfc, 0x40, 0xed, + 0x96, 0x02, 0x85, 0x70, 0x54, 0x7f, 0xde, 0xea, 0x95, 0x0f, 0x05, 0xb0, 0x80, 0xbd, 0xe4, 0xa8, + 0xef, 0xa4, 0x32, 0x49, 0x94, 0xaa, 0xfc, 0x5e, 0x80, 0x95, 0xd0, 0xa9, 0x0d, 0xd3, 0xf2, 0x89, + 0xcb, 0xdd, 0xba, 0x01, 0x28, 0xb2, 0xb7, 0xef, 0x58, 0xcc, 0x33, 0x42, 0xcc, 0x33, 0xc5, 0x10, + 0x5b, 0x73, 0x2c, 0xea, 0x9f, 0xcf, 0xa6, 0xfd, 0x13, 0x94, 0xa9, 0x9f, 0x4c, 0xa9, 0xe4, 0x8c, + 0xfc, 0x8d, 0xf8, 0x93, 0xc7, 0x06, 0x9d, 0x41, 0xce, 0xcc, 0x6b, 0xbb, 0x8e, 0xef, 0x9c, 0xe7, + 0xae, 0xca, 0x1f, 0x33, 0x50, 0x14, 0x07, 0x03, 0x97, 0x0c, 0x74, 0xdf, 0x09, 0x54, 0xbc, 0x06, + 0x30, 0x70, 0x9d, 0xa0, 0x0b, 0x8c, 0x9f, 0xaf, 0x2c, 0x83, 0xd6, 0x1c, 0xcb, 0xc3, 0x9f, 0x41, + 0x5e, 0xe7, 0x4c, 0xa6, 0x13, 0x4d, 0x47, 0x3f, 0x9d, 0xed, 0xe9, 0xc9, 0x2d, 0xa2, 0x65, 0x2c, + 0x88, 0x71, 0x79, 0xf8, 0xc7, 0xbc, 0x45, 0x21, 0x86, 0x16, 0x53, 0x25, 0x15, 0xa9, 0x82, 0x38, + 0x76, 0x3b, 0xd2, 0x68, 0x9b, 0x47, 0x2c, 0xcd, 0x22, 0xf6, 0xce, 0x33, 0x6b, 0x32, 0x1d, 0xbf, + 0xf2, 0x2f, 0x12, 0x90, 0x8b, 0xa9, 0x47, 0x05, 0x1f, 0x8c, 0xed, 0x3e, 0x0b, 0xd2, 0x3c, 0x82, + 0x1b, 0x63, 0xbb, 0x1f, 0x0a, 0xa6, 0x02, 0xf0, 0x1a, 0x64, 0xa2, 0x9e, 0x26, 0x11, 0x3b, 0x95, + 0x11, 0x14, 0xbf, 0x09, 0xc5, 0x03, 0x96, 0x2b, 0x51, 0x66, 0xd0, 0xc3, 0x50, 0x50, 0xf3, 0x01, + 0x94, 0x67, 0xc4, 0x15, 0xf6, 0x1a, 0xc5, 0xd0, 0x69, 0xd6, 0x47, 0x2d, 0xf6, 0x03, 0xc4, 0x6d, + 0xc8, 0xea, 0xee, 0x60, 0x3c, 0x24, 0xb6, 0xef, 0x95, 0x16, 0x59, 0x44, 0xe6, 0xc9, 0xfd, 0x33, + 0x66, 0x9e, 0xc3, 0xff, 0x4a, 0x42, 0x8a, 0x5a, 0x81, 0x11, 0xe4, 0x45, 0xf9, 0x63, 0x4d, 0x56, + 0xba, 0x9a, 0xdc, 0x6b, 0xb5, 0xd0, 0x02, 0x5e, 0x82, 0xa4, 0xb8, 0xb7, 0x8d, 0x04, 0x9c, 0x87, + 0x4c, 0x55, 0x51, 0x5a, 0x9a, 0x28, 0xd7, 0x51, 0x02, 0xe7, 0x60, 0x89, 0xad, 0x14, 0x15, 0x25, + 0x71, 0x11, 0xa0, 0xa6, 0xc8, 0x35, 0xb1, 0xab, 0x89, 0xdb, 0xdb, 0x28, 0x85, 0xb3, 0x90, 0xae, + 0x29, 0x3d, 0xb9, 0x8b, 0xd2, 0x94, 0x7d, 0x57, 0xbc, 0x8f, 0x96, 0xd8, 0x8f, 0xa6, 0x8c, 0x32, + 0x18, 0x60, 0xb1, 0xd3, 0xad, 0xd7, 0xa5, 0x3d, 0x94, 0xa5, 0xc0, 0x4e, 0x6f, 0x17, 0x01, 0x15, + 0xd7, 0xe9, 0xed, 0x6a, 0x4d, 0xb9, 0x8b, 0x72, 0x74, 0xa7, 0x3d, 0x51, 0x6d, 0x8a, 0x72, 0x4d, + 0x42, 0x79, 0x8a, 0xba, 0xaf, 0xa8, 0x4c, 0x72, 0x21, 0xd8, 0xa9, 0x27, 0x77, 0x35, 0x55, 0xb9, + 0xd7, 0x41, 0x45, 0xc6, 0x77, 0x57, 0xad, 0x37, 0x1b, 0x0d, 0xb4, 0x8c, 0x31, 0x14, 0x1b, 0x4d, + 0x59, 0x6c, 0x69, 0x11, 0x37, 0xa2, 0x06, 0x05, 0x30, 0xbe, 0xe7, 0x25, 0x5c, 0x80, 0xac, 0xa8, + 0xaa, 0xe2, 0xc7, 0x4c, 0x22, 0xa6, 0x9b, 0xed, 0x74, 0x14, 0x99, 0xad, 0x2e, 0x53, 0x24, 0x5d, + 0x55, 0xd9, 0x72, 0x85, 0x6e, 0xd7, 0xe9, 0xaa, 0x4d, 0x79, 0x9b, 0xad, 0x5f, 0x61, 0x56, 0x37, + 0xbb, 0xcc, 0x05, 0xaf, 0x52, 0x43, 0xe8, 0x42, 0x51, 0xd1, 0x15, 0x9c, 0x81, 0x54, 0x4d, 0x51, + 0x55, 0x54, 0xc2, 0x25, 0x58, 0x69, 0x4b, 0x6a, 0x4d, 0x92, 0xbb, 0xcd, 0x96, 0xa4, 0xd5, 0x9b, + 0x9d, 0x9a, 0xd6, 0xdc, 0x6d, 0xb7, 0xd0, 0x6b, 0x53, 0x98, 0x9a, 0x22, 0x77, 0x03, 0x4c, 0x19, + 0x5f, 0x86, 0x65, 0xa6, 0x83, 0x52, 0xdd, 0x91, 0x6a, 0x81, 0x13, 0x5f, 0xc7, 0x2b, 0x80, 0x02, + 0x55, 0x62, 0xd0, 0xff, 0xa3, 0x1a, 0xec, 0x89, 0xaa, 0xd6, 0x56, 0xda, 0xe8, 0xff, 0x03, 0xf5, + 0xa8, 0x59, 0x6c, 0xbd, 0x8a, 0x97, 0x21, 0xd7, 0xe9, 0x6a, 0xbb, 0xe2, 0x1d, 0xa9, 0xd5, 0x94, + 0x25, 0x74, 0x95, 0x9a, 0xd3, 0xe9, 0x6a, 0xd2, 0xfd, 0xae, 0x24, 0x77, 0xd1, 0x1a, 0xb5, 0xb5, + 0xd3, 0xd5, 0x7a, 0x72, 0x53, 0x91, 0xd1, 0xb5, 0xca, 0x2d, 0x48, 0xd1, 0x23, 0x41, 0x75, 0x17, + 0x7b, 0x5d, 0x05, 0x2d, 0xb0, 0xd0, 0xd4, 0xc4, 0x96, 0xa8, 0x22, 0x81, 0xca, 0x96, 0x15, 0x59, + 0xe3, 0xeb, 0x44, 0xe5, 0x4f, 0x8b, 0xf0, 0x7a, 0xd3, 0xf6, 0x89, 0x6b, 0x11, 0xfd, 0x21, 0x31, + 0x82, 0x69, 0x3d, 0x76, 0x89, 0x7c, 0x3c, 0xd5, 0x4e, 0x7f, 0x38, 0x3b, 0x1f, 0x9f, 0x22, 0x26, + 0xb8, 0x64, 0xa6, 0x7a, 0xec, 0xd8, 0x13, 0x48, 0xe2, 0xbc, 0x27, 0x90, 0xc9, 0xf7, 0xc4, 0xe4, + 0xf9, 0xef, 0x89, 0x17, 0x3a, 0xc1, 0xa7, 0xe7, 0x6f, 0x11, 0xfe, 0xd7, 0xdf, 0x69, 0xca, 0x5f, + 0x25, 0x20, 0xcd, 0xa2, 0x83, 0x3f, 0x82, 0x94, 0x41, 0xbc, 0xfe, 0x73, 0xb5, 0x0b, 0x8c, 0xf3, + 0x59, 0xba, 0x85, 0x1a, 0xa4, 0x46, 0x8e, 0x17, 0x84, 0xf3, 0xa9, 0xaf, 0x71, 0x6d, 0xc7, 0xf3, + 0xdb, 0xc1, 0x17, 0x02, 0x9a, 0x41, 0xe1, 0x3e, 0x94, 0x19, 0xd7, 0x21, 0x13, 0x35, 0xfd, 0xa9, + 0x39, 0x9b, 0xfe, 0x88, 0xf3, 0xec, 0x65, 0x30, 0xfd, 0x22, 0x2f, 0x83, 0x95, 0x3f, 0x0b, 0x50, + 0x6c, 0xbb, 0xce, 0xe7, 0xa4, 0xef, 0x77, 0x48, 0x30, 0x5a, 0x7f, 0x04, 0x69, 0x9a, 0x91, 0xe1, + 0x99, 0x99, 0x27, 0x25, 0x03, 0x46, 0xbc, 0x0d, 0x97, 0x06, 0xc4, 0x26, 0xae, 0xee, 0xc7, 0x9a, + 0xcf, 0x60, 0x0c, 0x2d, 0x4f, 0x07, 0x86, 0x0c, 0x37, 0x82, 0x6f, 0x30, 0x5d, 0x15, 0x45, 0x4c, + 0x61, 0x57, 0x7a, 0x1d, 0x90, 0x3d, 0x66, 0xef, 0x1b, 0x9e, 0x36, 0x22, 0xae, 0x36, 0x20, 0x76, + 0x30, 0x82, 0xaa, 0x05, 0x7b, 0x3c, 0xa4, 0x17, 0x6f, 0x9b, 0xb8, 0xdb, 0xc4, 0xae, 0x7c, 0x5b, + 0x80, 0xfc, 0x3d, 0xd3, 0x36, 0x9c, 0x63, 0x7e, 0xf2, 0xd7, 0xd8, 0xd3, 0xb1, 0x6f, 0xb2, 0x2b, + 0xfe, 0x94, 0xbf, 0x0d, 0xc4, 0x41, 0xb8, 0x03, 0xd9, 0x63, 0xc6, 0xd1, 0x88, 0x94, 0xdb, 0x9c, + 0x6d, 0x6a, 0x5c, 0x38, 0x5f, 0x34, 0xa2, 0x9b, 0x2b, 0x92, 0x53, 0xfe, 0x83, 0xc0, 0xef, 0xac, + 0x0e, 0x14, 0xc2, 0x8e, 0x82, 0x34, 0x9e, 0xf7, 0xfe, 0x56, 0x27, 0x65, 0xe0, 0xbb, 0x00, 0x7c, + 0x2b, 0x2a, 0x31, 0xc1, 0x24, 0xbe, 0x3b, 0x9f, 0xce, 0x54, 0x6a, 0x4c, 0xc8, 0x07, 0xa9, 0x47, + 0x5f, 0x5e, 0x15, 0xca, 0x5f, 0x2e, 0x41, 0xba, 0xe1, 0xea, 0x43, 0x82, 0xef, 0x40, 0x6a, 0xe8, + 0x18, 0x84, 0xab, 0xfb, 0xac, 0xc2, 0x19, 0xef, 0xc6, 0xae, 0x63, 0x44, 0xe5, 0x85, 0x0a, 0xc1, + 0x77, 0x61, 0x71, 0xdf, 0x19, 0xdb, 0x86, 0x37, 0xa3, 0x6b, 0x7c, 0xba, 0xb8, 0x2a, 0x63, 0x0d, + 0x8b, 0x5d, 0x20, 0x08, 0x7f, 0x02, 0x59, 0x72, 0xd2, 0xb7, 0xc6, 0x34, 0xe9, 0xd8, 0x31, 0x2c, + 0x6e, 0xbd, 0x37, 0x97, 0x54, 0x29, 0xe4, 0x8e, 0x9e, 0x3b, 0x42, 0x40, 0xf9, 0x3b, 0x01, 0xd2, + 0x6c, 0x53, 0xba, 0x0b, 0xdb, 0x8f, 0x16, 0x4c, 0xee, 0x8a, 0xf7, 0xe6, 0xd7, 0x3d, 0x56, 0x6e, + 0xcf, 0xc4, 0xd1, 0x8b, 0xc1, 0xb4, 0x7d, 0xcd, 0x39, 0x38, 0xf0, 0x48, 0xd0, 0x89, 0x85, 0x5f, + 0x71, 0xb2, 0xa6, 0xed, 0x2b, 0x0c, 0x8c, 0xaf, 0x41, 0x9e, 0x9e, 0x0a, 0x23, 0x24, 0xa3, 0x96, + 0xe6, 0xd5, 0x1c, 0x83, 0x71, 0x92, 0x1d, 0xc8, 0x05, 0x48, 0xf6, 0xed, 0x93, 0x57, 0x92, 0x39, + 0xbe, 0x0c, 0x42, 0xc0, 0x4d, 0x75, 0x2a, 0xff, 0x56, 0x80, 0xc5, 0xc0, 0xdd, 0x58, 0x86, 0xb4, + 0xe7, 0xeb, 0xae, 0xcf, 0x0b, 0xe9, 0xd6, 0xfc, 0x66, 0x47, 0x05, 0x86, 0x8a, 0xc1, 0x75, 0x48, + 0x12, 0xdb, 0xe0, 0x09, 0xf0, 0x1c, 0xd2, 0x54, 0xca, 0x5e, 0xb9, 0x0e, 0x29, 0x9a, 0x5d, 0xb4, + 0x89, 0x53, 0x45, 0x79, 0x5b, 0x42, 0x0b, 0xb4, 0x43, 0x60, 0xfd, 0x96, 0x40, 0x3b, 0x84, 0x6d, + 0x55, 0xe9, 0xb5, 0x3b, 0x28, 0x51, 0xf9, 0x02, 0xb2, 0x91, 0xef, 0xf1, 0x15, 0xb8, 0xdc, 0x93, + 0xab, 0x4a, 0x4f, 0xae, 0x4b, 0x75, 0xad, 0xad, 0x4a, 0x35, 0xa9, 0xde, 0x94, 0xb7, 0xd1, 0xc2, + 0x24, 0xa2, 0xa1, 0xb4, 0x5a, 0xca, 0x3d, 0x8a, 0x10, 0x68, 0x7f, 0xa3, 0x34, 0x1a, 0x1d, 0xa9, + 0x1b, 0x23, 0x4f, 0xc4, 0xa0, 0x67, 0xb4, 0x49, 0xda, 0xd8, 0xd4, 0x7a, 0xaa, 0x2a, 0x05, 0x8d, + 0x1f, 0x4a, 0x55, 0x3e, 0x85, 0x6c, 0x94, 0x5d, 0xb4, 0xc7, 0x93, 0x15, 0x4d, 0xba, 0x5f, 0x6b, + 0xf5, 0x3a, 0xb4, 0xb5, 0x61, 0x9b, 0xb2, 0x65, 0x5d, 0xd2, 0xe2, 0x7c, 0x02, 0xbe, 0x04, 0x85, + 0x10, 0xc1, 0xec, 0x40, 0x09, 0xca, 0x1d, 0x82, 0xba, 0x4d, 0xa9, 0x83, 0x92, 0xe5, 0xbf, 0x25, + 0x20, 0x13, 0xd6, 0x1d, 0x2c, 0xc5, 0x86, 0x82, 0xdc, 0xd6, 0xdb, 0xcf, 0xea, 0xd5, 0xe9, 0x91, + 0xe0, 0x62, 0x6e, 0xa2, 0x2a, 0xa4, 0x0f, 0x68, 0xbc, 0xf8, 0xbc, 0x7b, 0x6b, 0x9e, 0x18, 0xab, + 0x01, 0x2b, 0x5e, 0x87, 0x89, 0x21, 0x83, 0x35, 0x21, 0xe9, 0x70, 0x34, 0x9b, 0x18, 0x3f, 0xca, + 0x90, 0xd1, 0xdd, 0x81, 0xd7, 0x34, 0x4e, 0xbc, 0xd2, 0x12, 0xab, 0xea, 0xd1, 0x9a, 0x4a, 0x09, + 0xde, 0x9a, 0xb9, 0x94, 0x4c, 0xec, 0x12, 0x9f, 0xc0, 0xec, 0xa4, 0x32, 0x09, 0x94, 0xe4, 0x73, + 0xc6, 0xef, 0x04, 0x80, 0xb3, 0xea, 0x48, 0x7b, 0x4c, 0x55, 0xb9, 0xa7, 0xc9, 0xbd, 0xdd, 0xaa, + 0xa4, 0xf2, 0x3c, 0x13, 0xe5, 0x3b, 0x41, 0xf7, 0x59, 0x97, 0xe4, 0x8e, 0xa4, 0xb1, 0x35, 0x0b, + 0x12, 0xef, 0x9d, 0x03, 0x48, 0x92, 0xb6, 0xb6, 0xb5, 0xde, 0x2e, 0xeb, 0xb0, 0xbb, 0xc1, 0xc8, + 0xc1, 0xfa, 0xea, 0x60, 0xe4, 0x68, 0x89, 0xdb, 0x68, 0x91, 0x8a, 0x6b, 0x49, 0x62, 0x1d, 0x2d, + 0xd1, 0xfc, 0x69, 0x34, 0xd5, 0x4e, 0x57, 0xdb, 0x13, 0x5b, 0x3d, 0x09, 0x65, 0xa8, 0xfc, 0x96, + 0x18, 0xad, 0xb3, 0x54, 0x9a, 0xdc, 0xbd, 0xcd, 0x97, 0x70, 0xf3, 0x67, 0x50, 0x9c, 0xfc, 0x84, + 0x42, 0x13, 0xbf, 0xdd, 0xab, 0xb6, 0x9a, 0x35, 0xb4, 0x80, 0x5f, 0x83, 0x57, 0x82, 0xdf, 0x74, + 0x10, 0x60, 0xb3, 0x12, 0x47, 0x09, 0xd5, 0x77, 0x1e, 0x7d, 0xbb, 0xba, 0xf0, 0xe8, 0xf1, 0xaa, + 0xf0, 0xf5, 0xe3, 0x55, 0xe1, 0x9b, 0xc7, 0xab, 0xc2, 0x3f, 0x1e, 0xaf, 0x0a, 0xbf, 0x7c, 0xb2, + 0xba, 0xf0, 0xf5, 0x93, 0xd5, 0x85, 0x6f, 0x9e, 0xac, 0x2e, 0x7c, 0x92, 0x8b, 0xfd, 0x67, 0xc3, + 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x21, 0x86, 0xfa, 0xc9, 0x21, 0x00, 0x00, } diff --git a/pkg/sql/execinfrapb/processors_sql.proto b/pkg/sql/execinfrapb/processors_sql.proto index 4cce0af21f57..bd774b7696b8 100644 --- a/pkg/sql/execinfrapb/processors_sql.proto +++ b/pkg/sql/execinfrapb/processors_sql.proto @@ -611,6 +611,7 @@ message AggregatorSpec { STDDEV_POP = 30; ST_MAKELINE = 31; ST_EXTENT = 32; + ST_UNION = 33; } enum Type { diff --git a/pkg/sql/logictest/testdata/logic_test/geospatial b/pkg/sql/logictest/testdata/logic_test/geospatial index 39f2f304f222..84dceb31e5bd 100644 --- a/pkg/sql/logictest/testdata/logic_test/geospatial +++ b/pkg/sql/logictest/testdata/logic_test/geospatial @@ -986,159 +986,6 @@ Square (right) false false Square overlapping left and right square false false # Topology operators -query TTT -SELECT - a.dsc, - b.dsc, - ST_AsEWKT(ST_Union(a.geom, b.geom)) -FROM geom_operators_test a -JOIN geom_operators_test b ON (1=1) -ORDER BY a.dsc, b.dsc ----- -Empty GeometryCollection Empty GeometryCollection GEOMETRYCOLLECTION EMPTY -Empty GeometryCollection Empty LineString LINESTRING EMPTY -Empty GeometryCollection Empty Point POINT EMPTY -Empty GeometryCollection Faraway point POINT (5 5) -Empty GeometryCollection Line going through left and right square LINESTRING (-0.5 0.5, 0.5 0.5) -Empty GeometryCollection NULL NULL -Empty GeometryCollection Nested Geometry Collection GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0))) -Empty GeometryCollection Point middle of Left Square POINT (-0.5 0.5) -Empty GeometryCollection Point middle of Right Square POINT (0.5 0.5) -Empty GeometryCollection Square (left) POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)) -Empty GeometryCollection Square (right) POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) -Empty GeometryCollection Square overlapping left and right square POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)) -Empty LineString Empty GeometryCollection GEOMETRYCOLLECTION EMPTY -Empty LineString Empty LineString LINESTRING EMPTY -Empty LineString Empty Point POINT EMPTY -Empty LineString Faraway point POINT (5 5) -Empty LineString Line going through left and right square LINESTRING (-0.5 0.5, 0.5 0.5) -Empty LineString NULL NULL -Empty LineString Nested Geometry Collection GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0))) -Empty LineString Point middle of Left Square POINT (-0.5 0.5) -Empty LineString Point middle of Right Square POINT (0.5 0.5) -Empty LineString Square (left) POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)) -Empty LineString Square (right) POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) -Empty LineString Square overlapping left and right square POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)) -Empty Point Empty GeometryCollection GEOMETRYCOLLECTION EMPTY -Empty Point Empty LineString LINESTRING EMPTY -Empty Point Empty Point POINT EMPTY -Empty Point Faraway point POINT (5 5) -Empty Point Line going through left and right square LINESTRING (-0.5 0.5, 0.5 0.5) -Empty Point NULL NULL -Empty Point Nested Geometry Collection GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0))) -Empty Point Point middle of Left Square POINT (-0.5 0.5) -Empty Point Point middle of Right Square POINT (0.5 0.5) -Empty Point Square (left) POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)) -Empty Point Square (right) POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) -Empty Point Square overlapping left and right square POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)) -Faraway point Empty GeometryCollection POINT (5 5) -Faraway point Empty LineString POINT (5 5) -Faraway point Empty Point POINT (5 5) -Faraway point Faraway point POINT (5 5) -Faraway point Line going through left and right square GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (-0.5 0.5, 0.5 0.5)) -Faraway point NULL NULL -Faraway point Nested Geometry Collection GEOMETRYCOLLECTION (POINT (5 5), GEOMETRYCOLLECTION (POINT (0 0))) -Faraway point Point middle of Left Square MULTIPOINT (5 5, -0.5 0.5) -Faraway point Point middle of Right Square MULTIPOINT (5 5, 0.5 0.5) -Faraway point Square (left) GEOMETRYCOLLECTION (POINT (5 5), POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0))) -Faraway point Square (right) GEOMETRYCOLLECTION (POINT (5 5), POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))) -Faraway point Square overlapping left and right square GEOMETRYCOLLECTION (POINT (5 5), POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0))) -Line going through left and right square Empty GeometryCollection LINESTRING (-0.5 0.5, 0.5 0.5) -Line going through left and right square Empty LineString LINESTRING (-0.5 0.5, 0.5 0.5) -Line going through left and right square Empty Point LINESTRING (-0.5 0.5, 0.5 0.5) -Line going through left and right square Faraway point GEOMETRYCOLLECTION (LINESTRING (-0.5 0.5, 0.5 0.5), POINT (5 5)) -Line going through left and right square Line going through left and right square LINESTRING (-0.5 0.5, 0.5 0.5) -Line going through left and right square NULL NULL -Line going through left and right square Nested Geometry Collection GEOMETRYCOLLECTION (LINESTRING (-0.5 0.5, 0.5 0.5), GEOMETRYCOLLECTION (POINT (0 0))) -Line going through left and right square Point middle of Left Square LINESTRING (-0.5 0.5, 0.5 0.5) -Line going through left and right square Point middle of Right Square LINESTRING (-0.5 0.5, 0.5 0.5) -Line going through left and right square Square (left) GEOMETRYCOLLECTION (LINESTRING (0 0.5, 0.5 0.5), POLYGON ((0 0.5, 0 0, -1 0, -1 1, 0 1, 0 0.5))) -Line going through left and right square Square (right) GEOMETRYCOLLECTION (LINESTRING (-0.5 0.5, 0 0.5), POLYGON ((0 0.5, 0 1, 1 1, 1 0, 0 0, 0 0.5))) -Line going through left and right square Square overlapping left and right square GEOMETRYCOLLECTION (LINESTRING (-0.5 0.5, -0.1 0.5), POLYGON ((-0.1 0.5, -0.1 1, 1 1, 1 0, -0.1 0, -0.1 0.5))) -NULL Empty GeometryCollection NULL -NULL Empty LineString NULL -NULL Empty Point NULL -NULL Faraway point NULL -NULL Line going through left and right square NULL -NULL NULL NULL -NULL Nested Geometry Collection NULL -NULL Point middle of Left Square NULL -NULL Point middle of Right Square NULL -NULL Square (left) NULL -NULL Square (right) NULL -NULL Square overlapping left and right square NULL -Nested Geometry Collection Empty GeometryCollection GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0))) -Nested Geometry Collection Empty LineString GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0))) -Nested Geometry Collection Empty Point GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0))) -Nested Geometry Collection Faraway point GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0)), POINT (5 5)) -Nested Geometry Collection Line going through left and right square GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0)), LINESTRING (-0.5 0.5, 0.5 0.5)) -Nested Geometry Collection NULL NULL -Nested Geometry Collection Nested Geometry Collection POINT (0 0) -Nested Geometry Collection Point middle of Left Square GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0)), POINT (-0.5 0.5)) -Nested Geometry Collection Point middle of Right Square GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 0)), POINT (0.5 0.5)) -Nested Geometry Collection Square (left) POLYGON ((-1 0, -1 1, 0 1, 0 0, -1 0)) -Nested Geometry Collection Square (right) POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0)) -Nested Geometry Collection Square overlapping left and right square POLYGON ((-0.1 0, -0.1 1, 1 1, 1 0, -0.1 0)) -Point middle of Left Square Empty GeometryCollection POINT (-0.5 0.5) -Point middle of Left Square Empty LineString POINT (-0.5 0.5) -Point middle of Left Square Empty Point POINT (-0.5 0.5) -Point middle of Left Square Faraway point MULTIPOINT (-0.5 0.5, 5 5) -Point middle of Left Square Line going through left and right square LINESTRING (-0.5 0.5, 0.5 0.5) -Point middle of Left Square NULL NULL -Point middle of Left Square Nested Geometry Collection GEOMETRYCOLLECTION (POINT (-0.5 0.5), GEOMETRYCOLLECTION (POINT (0 0))) -Point middle of Left Square Point middle of Left Square POINT (-0.5 0.5) -Point middle of Left Square Point middle of Right Square MULTIPOINT (-0.5 0.5, 0.5 0.5) -Point middle of Left Square Square (left) POLYGON ((-1 0, -1 1, 0 1, 0 0, -1 0)) -Point middle of Left Square Square (right) GEOMETRYCOLLECTION (POINT (-0.5 0.5), POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))) -Point middle of Left Square Square overlapping left and right square GEOMETRYCOLLECTION (POINT (-0.5 0.5), POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0))) -Point middle of Right Square Empty GeometryCollection POINT (0.5 0.5) -Point middle of Right Square Empty LineString POINT (0.5 0.5) -Point middle of Right Square Empty Point POINT (0.5 0.5) -Point middle of Right Square Faraway point MULTIPOINT (0.5 0.5, 5 5) -Point middle of Right Square Line going through left and right square LINESTRING (-0.5 0.5, 0.5 0.5) -Point middle of Right Square NULL NULL -Point middle of Right Square Nested Geometry Collection GEOMETRYCOLLECTION (POINT (0.5 0.5), GEOMETRYCOLLECTION (POINT (0 0))) -Point middle of Right Square Point middle of Left Square MULTIPOINT (0.5 0.5, -0.5 0.5) -Point middle of Right Square Point middle of Right Square POINT (0.5 0.5) -Point middle of Right Square Square (left) GEOMETRYCOLLECTION (POINT (0.5 0.5), POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0))) -Point middle of Right Square Square (right) POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0)) -Point middle of Right Square Square overlapping left and right square POLYGON ((-0.1 0, -0.1 1, 1 1, 1 0, -0.1 0)) -Square (left) Empty GeometryCollection POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)) -Square (left) Empty LineString POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)) -Square (left) Empty Point POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)) -Square (left) Faraway point GEOMETRYCOLLECTION (POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)), POINT (5 5)) -Square (left) Line going through left and right square GEOMETRYCOLLECTION (LINESTRING (0 0.5, 0.5 0.5), POLYGON ((0 0.5, 0 0, -1 0, -1 1, 0 1, 0 0.5))) -Square (left) NULL NULL -Square (left) Nested Geometry Collection POLYGON ((-1 0, -1 1, 0 1, 0 0, -1 0)) -Square (left) Point middle of Left Square POLYGON ((-1 0, -1 1, 0 1, 0 0, -1 0)) -Square (left) Point middle of Right Square GEOMETRYCOLLECTION (POLYGON ((-1 0, 0 0, 0 1, -1 1, -1 0)), POINT (0.5 0.5)) -Square (left) Square (left) POLYGON ((0 0, -1 0, -1 1, 0 1, 0 0)) -Square (left) Square (right) POLYGON ((0 0, -1 0, -1 1, 0 1, 1 1, 1 0, 0 0)) -Square (left) Square overlapping left and right square POLYGON ((-0.1 0, -1 0, -1 1, -0.1 1, 0 1, 1 1, 1 0, 0 0, -0.1 0)) -Square (right) Empty GeometryCollection POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) -Square (right) Empty LineString POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) -Square (right) Empty Point POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) -Square (right) Faraway point GEOMETRYCOLLECTION (POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)), POINT (5 5)) -Square (right) Line going through left and right square GEOMETRYCOLLECTION (LINESTRING (-0.5 0.5, 0 0.5), POLYGON ((0 0.5, 0 1, 1 1, 1 0, 0 0, 0 0.5))) -Square (right) NULL NULL -Square (right) Nested Geometry Collection POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0)) -Square (right) Point middle of Left Square GEOMETRYCOLLECTION (POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)), POINT (-0.5 0.5)) -Square (right) Point middle of Right Square POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0)) -Square (right) Square (left) POLYGON ((0 1, 1 1, 1 0, 0 0, -1 0, -1 1, 0 1)) -Square (right) Square (right) POLYGON ((1 0, 0 0, 0 1, 1 1, 1 0)) -Square (right) Square overlapping left and right square POLYGON ((1 0, 0 0, -0.1 0, -0.1 1, 0 1, 1 1, 1 0)) -Square overlapping left and right square Empty GeometryCollection POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)) -Square overlapping left and right square Empty LineString POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)) -Square overlapping left and right square Empty Point POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)) -Square overlapping left and right square Faraway point GEOMETRYCOLLECTION (POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)), POINT (5 5)) -Square overlapping left and right square Line going through left and right square GEOMETRYCOLLECTION (LINESTRING (-0.5 0.5, -0.1 0.5), POLYGON ((-0.1 0.5, -0.1 1, 1 1, 1 0, -0.1 0, -0.1 0.5))) -Square overlapping left and right square NULL NULL -Square overlapping left and right square Nested Geometry Collection POLYGON ((-0.1 0, -0.1 1, 1 1, 1 0, -0.1 0)) -Square overlapping left and right square Point middle of Left Square GEOMETRYCOLLECTION (POLYGON ((-0.1 0, 1 0, 1 1, -0.1 1, -0.1 0)), POINT (-0.5 0.5)) -Square overlapping left and right square Point middle of Right Square POLYGON ((-0.1 0, -0.1 1, 1 1, 1 0, -0.1 0)) -Square overlapping left and right square Square (left) POLYGON ((0 0, -0.1 0, -1 0, -1 1, -0.1 1, 0 1, 1 1, 1 0, 0 0)) -Square overlapping left and right square Square (right) POLYGON ((0 0, -0.1 0, -0.1 1, 0 1, 1 1, 1 0, 0 0)) -Square overlapping left and right square Square overlapping left and right square POLYGON ((1 0, -0.1 0, -0.1 1, 1 1, 1 0)) query TTTB SELECT @@ -4342,6 +4189,23 @@ SELECT ST_Extent(g::geometry) FROM ( VALUES (NULL), ('POINT EMPTY') ) t(g) ---- NULL +query T +SELECT ST_AsEWKT(ST_Union(g::geometry)) FROM ( VALUES (NULL) ) tbl(g) +---- +NULL + +query T +SELECT ST_AsEWKT(ST_Union(g::geometry)) FROM ( VALUES (NULL), ('POINT(1 0)') ) tbl(g) +---- +POINT (1 0) + +statement error operation on mixed SRIDs forbidden +SELECT ST_AsEWKT(ST_Union(g::geometry)) FROM ( VALUES ('POINT(1 0)'), ('SRID=3857;POINT(1 0)') ) tbl(g) + +query T +SELECT ST_AsEWKT(ST_Union(g::geometry)) FROM ( VALUES (NULL), ('POINT(1 0)'), ('LINESTRING(0 0, 5 0)')) tbl(g) +---- +LINESTRING (0 0, 5 0) subtest set_point_test diff --git a/pkg/sql/opt/operator.go b/pkg/sql/opt/operator.go index d68f1bda401d..340455f64464 100644 --- a/pkg/sql/opt/operator.go +++ b/pkg/sql/opt/operator.go @@ -209,6 +209,7 @@ var AggregateOpReverseMap = map[Operator]string{ VarPopOp: "var_pop", StdDevPopOp: "stddev_pop", STMakeLineOp: "st_makeline", + STUnionOp: "st_union", STExtentOp: "st_extent", } @@ -305,7 +306,7 @@ func AggregateIgnoresNulls(op Operator) bool { case AnyNotNullAggOp, AvgOp, BitAndAggOp, BitOrAggOp, BoolAndOp, BoolOrOp, ConstNotNullAggOp, CorrOp, CountOp, MaxOp, MinOp, SqrDiffOp, StdDevOp, StringAggOp, SumOp, SumIntOp, VarianceOp, XorAggOp, PercentileDiscOp, - PercentileContOp, STMakeLineOp, STExtentOp, StdDevPopOp, VarPopOp: + PercentileContOp, STMakeLineOp, STExtentOp, STUnionOp, StdDevPopOp, VarPopOp: return true case ArrayAggOp, ConcatAggOp, ConstAggOp, CountRowsOp, FirstAggOp, JsonAggOp, @@ -328,7 +329,7 @@ func AggregateIsNullOnEmpty(op Operator) bool { ConstNotNullAggOp, CorrOp, FirstAggOp, JsonAggOp, JsonbAggOp, MaxOp, MinOp, SqrDiffOp, StdDevOp, STMakeLineOp, StringAggOp, SumOp, SumIntOp, VarianceOp, XorAggOp, PercentileDiscOp, PercentileContOp, - JsonObjectAggOp, JsonbObjectAggOp, StdDevPopOp, STExtentOp, VarPopOp: + JsonObjectAggOp, JsonbObjectAggOp, StdDevPopOp, STExtentOp, STUnionOp, VarPopOp: return true case CountOp, CountRowsOp: @@ -354,7 +355,7 @@ func AggregateIsNeverNullOnNonNullInput(op Operator) bool { ConstNotNullAggOp, CountOp, CountRowsOp, FirstAggOp, JsonAggOp, JsonbAggOp, MaxOp, MinOp, SqrDiffOp, STMakeLineOp, StringAggOp, SumOp, SumIntOp, XorAggOp, PercentileDiscOp, PercentileContOp, - JsonObjectAggOp, JsonbObjectAggOp, StdDevPopOp, STExtentOp, VarPopOp: + JsonObjectAggOp, JsonbObjectAggOp, StdDevPopOp, STExtentOp, STUnionOp, VarPopOp: return true case VarianceOp, StdDevOp, CorrOp: @@ -395,7 +396,7 @@ func AggregatesCanMerge(inner, outer Operator) bool { case AnyNotNullAggOp, BitAndAggOp, BitOrAggOp, BoolAndOp, BoolOrOp, ConstAggOp, ConstNotNullAggOp, FirstAggOp, - MaxOp, MinOp, STMakeLineOp, STExtentOp, SumOp, SumIntOp, XorAggOp: + MaxOp, MinOp, STMakeLineOp, STExtentOp, STUnionOp, SumOp, SumIntOp, XorAggOp: return inner == outer case CountOp, CountRowsOp: @@ -418,7 +419,7 @@ func AggregatesCanMerge(inner, outer Operator) bool { func AggregateIgnoresDuplicates(op Operator) bool { switch op { case AnyNotNullAggOp, BitAndAggOp, BitOrAggOp, BoolAndOp, BoolOrOp, - ConstAggOp, ConstNotNullAggOp, FirstAggOp, MaxOp, MinOp, STExtentOp: + ConstAggOp, ConstNotNullAggOp, FirstAggOp, MaxOp, MinOp, STExtentOp, STUnionOp: return true case ArrayAggOp, AvgOp, ConcatAggOp, CountOp, CorrOp, CountRowsOp, SumIntOp, diff --git a/pkg/sql/opt/ops/scalar.opt b/pkg/sql/opt/ops/scalar.opt index 2cb9c8562440..77727f8c6c76 100644 --- a/pkg/sql/opt/ops/scalar.opt +++ b/pkg/sql/opt/ops/scalar.opt @@ -873,6 +873,11 @@ define STExtent { Input ScalarExpr } +[Scalar, Aggregate] +define STUnion { + Input ScalarExpr +} + [Scalar, Aggregate] define XorAgg { Input ScalarExpr diff --git a/pkg/sql/opt/optbuilder/groupby.go b/pkg/sql/opt/optbuilder/groupby.go index a3d896391e9a..00caca9e2136 100644 --- a/pkg/sql/opt/optbuilder/groupby.go +++ b/pkg/sql/opt/optbuilder/groupby.go @@ -827,6 +827,8 @@ func (b *Builder) constructAggregate(name string, args []opt.ScalarExpr) opt.Sca return b.factory.ConstructSTMakeLine(args[0]) case "st_extent": return b.factory.ConstructSTExtent(args[0]) + case "st_union": + return b.factory.ConstructSTUnion(args[0]) case "xor_agg": return b.factory.ConstructXorAgg(args[0]) case "json_agg": diff --git a/pkg/sql/sem/builtins/aggregate_builtins.go b/pkg/sql/sem/builtins/aggregate_builtins.go index da3b6ea204cc..5625fc780526 100644 --- a/pkg/sql/sem/builtins/aggregate_builtins.go +++ b/pkg/sql/sem/builtins/aggregate_builtins.go @@ -20,6 +20,8 @@ import ( "github.com/cockroachdb/apd/v2" "github.com/cockroachdb/cockroach/pkg/geo" + "github.com/cockroachdb/cockroach/pkg/geo/geopb" + "github.com/cockroachdb/cockroach/pkg/geo/geos" "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgcode" "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" @@ -398,6 +400,26 @@ var aggregates = map[string]builtinDefinition{ tree.VolatilityImmutable, ), ), + "st_union": makeBuiltin( + tree.FunctionProperties{ + Class: tree.AggregateClass, + NullableArgs: true, + AvailableOnPublicSchema: true, + }, + makeAggOverload( + []*types.T{types.Geometry}, + types.Geometry, + func( + params []*types.T, evalCtx *tree.EvalContext, arguments tree.Datums, + ) tree.AggregateFunc { + return &stUnionAgg{} + }, + infoBuilder{ + info: "Applies a spatial union to the geometries provided.", + }.String(), + tree.VolatilityImmutable, + ), + ), AnyNotNull: makePrivate(makeBuiltin(aggProps(), makeAggOverloadWithReturnType( @@ -649,6 +671,66 @@ func (agg *stMakeLineAgg) Size() int64 { return sizeOfSTMakeLineAggregate } +type stUnionAgg struct { + srid geopb.SRID + // TODO(#geo): store the current union object in C memory, to avoid the EWKB round trips. + ewkb geopb.EWKB + set bool +} + +// Add implements the AggregateFunc interface. +func (agg *stUnionAgg) Add(_ context.Context, firstArg tree.Datum, otherArgs ...tree.Datum) error { + if firstArg == tree.DNull { + return nil + } + geomArg := tree.MustBeDGeometry(firstArg) + if !agg.set { + agg.ewkb = geomArg.EWKB() + agg.set = true + agg.srid = geomArg.SRID() + return nil + } + if agg.srid != geomArg.SRID() { + c, err := geo.ParseGeometryFromEWKB(agg.ewkb) + if err != nil { + return err + } + return geo.NewMismatchingSRIDsError(geomArg.Geometry, c) + } + var err error + // TODO(#geo):We are allocating a slice for the result each time we + // call geos.Union in cStringToSafeGoBytes. + // We could change geos.Union to accept the existing slice. + agg.ewkb, err = geos.Union(agg.ewkb, geomArg.EWKB()) + return err +} + +// Result implements the AggregateFunc interface. +func (agg *stUnionAgg) Result() (tree.Datum, error) { + if !agg.set { + return tree.DNull, nil + } + g, err := geo.ParseGeometryFromEWKB(agg.ewkb) + if err != nil { + return nil, err + } + return tree.NewDGeometry(g), nil +} + +// Reset implements the AggregateFunc interface. +func (agg *stUnionAgg) Reset(context.Context) { + agg.ewkb = nil + agg.set = false +} + +// Close implements the AggregateFunc interface. +func (agg *stUnionAgg) Close(context.Context) {} + +// Size implements the AggregateFunc interface. +func (agg *stUnionAgg) Size() int64 { + return sizeOfSTUnionAggregate +} + type stExtentAgg struct { bbox *geo.CartesianBoundingBox } @@ -739,6 +821,7 @@ var _ tree.AggregateFunc = &bitBitOrAggregate{} var _ tree.AggregateFunc = &percentileDiscAggregate{} var _ tree.AggregateFunc = &percentileContAggregate{} var _ tree.AggregateFunc = &stMakeLineAgg{} +var _ tree.AggregateFunc = &stUnionAgg{} var _ tree.AggregateFunc = &stExtentAgg{} const sizeOfArrayAggregate = int64(unsafe.Sizeof(arrayAggregate{})) @@ -779,6 +862,7 @@ const sizeOfBitBitOrAggregate = int64(unsafe.Sizeof(bitBitOrAggregate{})) const sizeOfPercentileDiscAggregate = int64(unsafe.Sizeof(percentileDiscAggregate{})) const sizeOfPercentileContAggregate = int64(unsafe.Sizeof(percentileContAggregate{})) const sizeOfSTMakeLineAggregate = int64(unsafe.Sizeof(stMakeLineAgg{})) +const sizeOfSTUnionAggregate = int64(unsafe.Sizeof(stUnionAgg{})) const sizeOfSTExtentAggregate = int64(unsafe.Sizeof(stExtentAgg{})) // singleDatumAggregateBase is a utility struct that helps aggregate builtins diff --git a/pkg/sql/sem/builtins/geo_builtins.go b/pkg/sql/sem/builtins/geo_builtins.go index 4624ee697076..c501a2c08a0d 100644 --- a/pkg/sql/sem/builtins/geo_builtins.go +++ b/pkg/sql/sem/builtins/geo_builtins.go @@ -2973,24 +2973,6 @@ For flags=1, validity considers self-intersecting rings forming holes as valid a tree.VolatilityImmutable, ), ), - "st_union": makeBuiltin( - defProps(), - geometryOverload2( - func(ctx *tree.EvalContext, a *tree.DGeometry, b *tree.DGeometry) (tree.Datum, error) { - union, err := geomfn.Union(a.Geometry, b.Geometry) - if err != nil { - return nil, err - } - return tree.NewDGeometry(union), err - }, - types.Geometry, - infoBuilder{ - info: "Returns the union of the given geometries as a single Geometry object.", - libraryUsage: usesGEOS, - }, - tree.VolatilityImmutable, - ), - ), // // Transformations