本文整理匯總了Golang中github.com/cockroachdb/cockroach/pkg/sql/sqlbase.DatumToEncDatum函數的典型用法代碼示例。如果您正苦於以下問題:Golang DatumToEncDatum函數的具體用法?Golang DatumToEncDatum怎麽用?Golang DatumToEncDatum使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了DatumToEncDatum函數的10個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: TestStreamEncodeDecode
// TestStreamEncodeDecode generates random streams of EncDatums and passes them
// through a StreamEncoder and a StreamDecoder
func TestStreamEncodeDecode(t *testing.T) {
defer leaktest.AfterTest(t)()
rng, _ := randutil.NewPseudoRand()
for test := 0; test < 100; test++ {
rowLen := 1 + rng.Intn(20)
info := make([]DatumInfo, rowLen)
for i := range info {
info[i].Type = sqlbase.RandColumnType(rng)
info[i].Encoding = sqlbase.RandDatumEncoding(rng)
}
numRows := rng.Intn(100)
rows := make(sqlbase.EncDatumRows, numRows)
for i := range rows {
rows[i] = make(sqlbase.EncDatumRow, rowLen)
for j := range rows[i] {
rows[i][j] = sqlbase.DatumToEncDatum(info[j].Type,
sqlbase.RandDatum(rng, info[j].Type, true))
}
}
var trailerErr error
if rng.Intn(10) == 0 {
trailerErr = fmt.Errorf("test error %d", rng.Intn(100))
}
testRowStream(t, rng, rows, trailerErr)
}
}
示例2: eval
func (ev *evaluator) eval(row sqlbase.EncDatumRow) (sqlbase.EncDatumRow, error) {
outRow := ev.rowAlloc.AllocRow(len(ev.exprs))
for i := range ev.exprs {
datum, err := ev.exprs[i].eval(row)
if err != nil {
return nil, err
}
outRow[i] = sqlbase.DatumToEncDatum(ev.exprTypes[i], datum)
}
return outRow, nil
}
示例3: TestMergeJoiner
func TestMergeJoiner(t *testing.T) {
defer leaktest.AfterTest(t)()
v := [6]sqlbase.EncDatum{}
for i := range v {
v[i] = sqlbase.DatumToEncDatum(sqlbase.ColumnType_INT, parser.NewDInt(parser.DInt(i)))
}
null := sqlbase.EncDatum{Datum: parser.DNull}
testCases := []struct {
spec MergeJoinerSpec
inputs []sqlbase.EncDatumRows
expected sqlbase.EncDatumRows
}{
{
spec: MergeJoinerSpec{
LeftOrdering: convertToSpecOrdering(
sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: encoding.Ascending},
}),
LeftTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
RightOrdering: convertToSpecOrdering(
sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: encoding.Ascending},
}),
RightTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
Type: JoinType_INNER,
OutputColumns: []uint32{0, 3, 4},
// Implicit @1 = @3 constraint.
},
inputs: []sqlbase.EncDatumRows{
{
{v[0], v[0]},
{v[1], v[4]},
{v[2], v[4]},
{v[3], v[1]},
{v[4], v[5]},
{v[5], v[5]},
},
{
{v[1], v[0], v[4]},
{v[3], v[4], v[1]},
{v[4], v[4], v[5]},
},
},
expected: sqlbase.EncDatumRows{
{v[1], v[0], v[4]},
{v[3], v[4], v[1]},
{v[4], v[4], v[5]},
},
},
{
spec: MergeJoinerSpec{
LeftOrdering: convertToSpecOrdering(
sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: encoding.Ascending},
}),
LeftTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
RightOrdering: convertToSpecOrdering(
sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: encoding.Ascending},
}),
RightTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
Type: JoinType_INNER,
OutputColumns: []uint32{0, 1, 3},
// Implicit @1 = @3 constraint.
},
inputs: []sqlbase.EncDatumRows{
{
{v[0], v[0]},
{v[0], v[1]},
},
{
{v[0], v[4]},
{v[0], v[1]},
{v[0], v[0]},
{v[0], v[5]},
{v[0], v[4]},
},
},
expected: sqlbase.EncDatumRows{
{v[0], v[0], v[4]},
{v[0], v[0], v[1]},
{v[0], v[0], v[0]},
{v[0], v[0], v[5]},
{v[0], v[0], v[4]},
{v[0], v[1], v[4]},
//.........這裏部分代碼省略.........
示例4: TestHashJoiner
func TestHashJoiner(t *testing.T) {
defer leaktest.AfterTest(t)()
v := [10]sqlbase.EncDatum{}
for i := range v {
v[i] = sqlbase.DatumToEncDatum(sqlbase.ColumnType_INT, parser.NewDInt(parser.DInt(i)))
}
null := sqlbase.EncDatum{Datum: parser.DNull}
testCases := []struct {
spec HashJoinerSpec
inputs []sqlbase.EncDatumRows
expected sqlbase.EncDatumRows
}{
{
spec: HashJoinerSpec{
LeftEqColumns: []uint32{0},
LeftTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
RightEqColumns: []uint32{0},
RightTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
Type: JoinType_INNER,
OutputColumns: []uint32{0, 3, 4},
// Implicit @1 = @3 constraint.
},
inputs: []sqlbase.EncDatumRows{
{
{v[0], v[0]},
{v[1], v[4]},
{v[2], v[4]},
{v[3], v[1]},
{v[4], v[5]},
{v[5], v[5]},
},
{
{v[1], v[0], v[4]},
{v[3], v[4], v[1]},
{v[4], v[4], v[5]},
},
},
expected: sqlbase.EncDatumRows{
{v[1], v[0], v[4]},
{v[3], v[4], v[1]},
{v[4], v[4], v[5]},
},
},
{
spec: HashJoinerSpec{
LeftEqColumns: []uint32{0},
LeftTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
RightEqColumns: []uint32{0},
RightTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
},
Type: JoinType_INNER,
OutputColumns: []uint32{0, 1, 3},
// Implicit @1 = @3 constraint.
},
inputs: []sqlbase.EncDatumRows{
{
{v[0], v[0]},
{v[0], v[1]},
},
{
{v[0], v[4]},
{v[0], v[1]},
{v[0], v[0]},
{v[0], v[5]},
{v[0], v[4]},
},
},
expected: sqlbase.EncDatumRows{
{v[0], v[0], v[4]},
{v[0], v[0], v[1]},
{v[0], v[0], v[0]},
{v[0], v[0], v[5]},
{v[0], v[0], v[4]},
{v[0], v[1], v[4]},
{v[0], v[1], v[1]},
{v[0], v[1], v[0]},
{v[0], v[1], v[5]},
{v[0], v[1], v[4]},
},
},
{
spec: HashJoinerSpec{
LeftEqColumns: []uint32{0},
LeftTypes: []sqlbase.ColumnType_Kind{
sqlbase.ColumnType_INT,
sqlbase.ColumnType_INT,
//.........這裏部分代碼省略.........
示例5: TestJoinReader
func TestJoinReader(t *testing.T) {
defer leaktest.AfterTest(t)()
s, sqlDB, kvDB := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
// Create a table where each row is:
//
// | a | b | sum | s |
// |-----------------------------------------------------------------|
// | rowId/10 | rowId%10 | rowId/10 + rowId%10 | IntToEnglish(rowId) |
aFn := func(row int) parser.Datum {
return parser.NewDInt(parser.DInt(row / 10))
}
bFn := func(row int) parser.Datum {
return parser.NewDInt(parser.DInt(row % 10))
}
sumFn := func(row int) parser.Datum {
return parser.NewDInt(parser.DInt(row/10 + row%10))
}
sqlutils.CreateTable(t, sqlDB, "t",
"a INT, b INT, sum INT, s STRING, PRIMARY KEY (a,b), INDEX bs (b,s)",
99,
sqlutils.ToRowFn(aFn, bFn, sumFn, sqlutils.RowEnglishFn))
td := sqlbase.GetTableDescriptor(kvDB, "test", "t")
testCases := []struct {
spec JoinReaderSpec
input [][]parser.Datum
expected string
}{
{
spec: JoinReaderSpec{
OutputColumns: []uint32{0, 1, 2},
},
input: [][]parser.Datum{
{aFn(2), bFn(2)},
{aFn(5), bFn(5)},
{aFn(10), bFn(10)},
{aFn(15), bFn(15)},
},
expected: "[[0 2 2] [0 5 5] [1 0 1] [1 5 6]]",
},
{
spec: JoinReaderSpec{
Filter: Expression{Expr: "@3 <= 5"}, // sum <= 5
OutputColumns: []uint32{3},
},
input: [][]parser.Datum{
{aFn(1), bFn(1)},
{aFn(25), bFn(25)},
{aFn(5), bFn(5)},
{aFn(21), bFn(21)},
{aFn(34), bFn(34)},
{aFn(13), bFn(13)},
{aFn(51), bFn(51)},
{aFn(50), bFn(50)},
},
expected: "[['one'] ['five'] ['two-one'] ['one-three'] ['five-zero']]",
},
}
for _, c := range testCases {
js := c.spec
js.Table = *td
flowCtx := FlowCtx{
Context: context.Background(),
evalCtx: &parser.EvalContext{},
txnProto: &roachpb.Transaction{},
clientDB: kvDB,
}
in := &RowBuffer{}
for _, row := range c.input {
encRow := make(sqlbase.EncDatumRow, len(row))
for i, d := range row {
encRow[i] = sqlbase.DatumToEncDatum(sqlbase.ColumnType{Kind: sqlbase.ColumnType_INT}, d)
}
in.rows = append(in.rows, encRow)
}
out := &RowBuffer{}
jr, err := newJoinReader(&flowCtx, &js, in, out)
if err != nil {
t.Fatal(err)
}
jr.Run(nil)
if out.err != nil {
t.Fatal(out.err)
}
if !in.done {
t.Fatal("joinReader stopped accepting rows")
}
if !out.closed {
t.Fatalf("output RowReceiver not closed")
//.........這裏部分代碼省略.........
示例6: TestSorter
func TestSorter(t *testing.T) {
defer leaktest.AfterTest(t)()
columnTypeInt := &sqlbase.ColumnType{Kind: sqlbase.ColumnType_INT}
v := [6]sqlbase.EncDatum{}
for i := range v {
v[i] = sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(i)))
}
asc := encoding.Ascending
desc := encoding.Descending
testCases := []struct {
spec SorterSpec
input sqlbase.EncDatumRows
expected sqlbase.EncDatumRows
}{
{
// No specified input ordering and unspecified limit.
spec: SorterSpec{
OutputOrdering: convertToSpecOrdering(
sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: asc},
{ColIdx: 1, Direction: desc},
{ColIdx: 2, Direction: asc},
}),
},
input: sqlbase.EncDatumRows{
{v[1], v[0], v[4]},
{v[3], v[4], v[1]},
{v[4], v[4], v[4]},
{v[3], v[2], v[0]},
{v[4], v[4], v[5]},
{v[3], v[3], v[0]},
{v[0], v[0], v[0]},
},
expected: sqlbase.EncDatumRows{
{v[0], v[0], v[0]},
{v[1], v[0], v[4]},
{v[3], v[4], v[1]},
{v[3], v[3], v[0]},
{v[3], v[2], v[0]},
{v[4], v[4], v[4]},
{v[4], v[4], v[5]},
},
}, {
// No specified input ordering but specified limit.
spec: SorterSpec{
Limit: 4,
OutputOrdering: convertToSpecOrdering(
sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: asc},
{ColIdx: 1, Direction: asc},
{ColIdx: 2, Direction: asc},
}),
},
input: sqlbase.EncDatumRows{
{v[3], v[3], v[0]},
{v[3], v[4], v[1]},
{v[1], v[0], v[4]},
{v[0], v[0], v[0]},
{v[4], v[4], v[4]},
{v[4], v[4], v[5]},
{v[3], v[2], v[0]},
},
expected: sqlbase.EncDatumRows{
{v[0], v[0], v[0]},
{v[1], v[0], v[4]},
{v[3], v[2], v[0]},
{v[3], v[3], v[0]},
},
}, {
// Specified match ordering length but no specified limit.
spec: SorterSpec{
OrderingMatchLen: 2,
OutputOrdering: convertToSpecOrdering(
sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: asc},
{ColIdx: 1, Direction: asc},
{ColIdx: 2, Direction: asc},
}),
},
input: sqlbase.EncDatumRows{
{v[0], v[1], v[2]},
{v[0], v[1], v[0]},
{v[1], v[0], v[5]},
{v[1], v[1], v[5]},
{v[1], v[1], v[4]},
{v[3], v[4], v[3]},
{v[3], v[4], v[2]},
{v[3], v[5], v[1]},
{v[4], v[4], v[5]},
{v[4], v[4], v[4]},
},
expected: sqlbase.EncDatumRows{
{v[0], v[1], v[0]},
{v[0], v[1], v[2]},
{v[1], v[0], v[5]},
{v[1], v[1], v[4]},
{v[1], v[1], v[5]},
//.........這裏部分代碼省略.........
示例7: TestOrderedSync
func TestOrderedSync(t *testing.T) {
defer leaktest.AfterTest(t)()
columnTypeInt := &sqlbase.ColumnType{Kind: sqlbase.ColumnType_INT}
v := [6]sqlbase.EncDatum{}
for i := range v {
v[i] = sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(i)))
}
asc := encoding.Ascending
desc := encoding.Descending
testCases := []struct {
sources []sqlbase.EncDatumRows
ordering sqlbase.ColumnOrdering
expected sqlbase.EncDatumRows
}{
{
sources: []sqlbase.EncDatumRows{
{
{v[0], v[1], v[4]},
{v[0], v[1], v[2]},
{v[0], v[2], v[3]},
{v[1], v[1], v[3]},
},
{
{v[1], v[0], v[4]},
},
{
{v[0], v[0], v[0]},
{v[4], v[4], v[4]},
},
},
ordering: sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: asc},
{ColIdx: 1, Direction: asc},
},
expected: sqlbase.EncDatumRows{
{v[0], v[0], v[0]},
{v[0], v[1], v[4]},
{v[0], v[1], v[2]},
{v[0], v[2], v[3]},
{v[1], v[0], v[4]},
{v[1], v[1], v[3]},
{v[4], v[4], v[4]},
},
},
{
sources: []sqlbase.EncDatumRows{
{},
{
{v[1], v[0], v[4]},
},
{
{v[3], v[4], v[1]},
{v[4], v[4], v[4]},
{v[3], v[2], v[0]},
},
{
{v[4], v[4], v[5]},
{v[3], v[3], v[0]},
{v[0], v[0], v[0]},
},
},
ordering: sqlbase.ColumnOrdering{
{ColIdx: 1, Direction: desc},
{ColIdx: 0, Direction: asc},
{ColIdx: 2, Direction: asc},
},
expected: sqlbase.EncDatumRows{
{v[3], v[4], v[1]},
{v[4], v[4], v[4]},
{v[4], v[4], v[5]},
{v[3], v[3], v[0]},
{v[3], v[2], v[0]},
{v[0], v[0], v[0]},
{v[1], v[0], v[4]},
},
},
}
for testIdx, c := range testCases {
var sources []RowSource
for _, srcRows := range c.sources {
rowBuf := &RowBuffer{rows: srcRows}
sources = append(sources, rowBuf)
}
src, err := makeOrderedSync(c.ordering, sources)
if err != nil {
t.Fatal(err)
}
var retRows sqlbase.EncDatumRows
for {
row, err := src.NextRow()
if err != nil {
t.Fatal(err)
}
if row == nil {
break
}
retRows = append(retRows, row)
//.........這裏部分代碼省略.........
示例8: TestUnorderedSync
func TestUnorderedSync(t *testing.T) {
defer leaktest.AfterTest(t)()
columnTypeInt := &sqlbase.ColumnType{Kind: sqlbase.ColumnType_INT}
mrc := &MultiplexedRowChannel{}
mrc.Init(5)
for i := 1; i <= 5; i++ {
go func(i int) {
for j := 1; j <= 100; j++ {
a := sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(i)))
b := sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(j)))
row := sqlbase.EncDatumRow{a, b}
mrc.PushRow(row)
}
mrc.Close(nil)
}(i)
}
var retRows sqlbase.EncDatumRows
for {
row, err := mrc.NextRow()
if err != nil {
t.Fatal(err)
}
if row == nil {
break
}
retRows = append(retRows, row)
}
// Verify all elements.
for i := 1; i <= 5; i++ {
j := 1
for _, row := range retRows {
if int(*(row[0].Datum.(*parser.DInt))) == i {
if int(*(row[1].Datum.(*parser.DInt))) != j {
t.Errorf("Expected [%d %d], got %s", i, j, row)
}
j++
}
}
if j != 101 {
t.Errorf("Missing [%d %d]", i, j)
}
}
// Test case when one source closes with an error.
mrc = &MultiplexedRowChannel{}
mrc.Init(5)
for i := 1; i <= 5; i++ {
go func(i int) {
for j := 1; j <= 100; j++ {
a := sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(i)))
b := sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(j)))
row := sqlbase.EncDatumRow{a, b}
mrc.PushRow(row)
}
var err error
if i == 3 {
err = fmt.Errorf("Test error")
}
mrc.Close(err)
}(i)
}
for {
row, err := mrc.NextRow()
if err != nil {
if err.Error() != "Test error" {
t.Error(err)
}
break
}
if row == nil {
t.Error("Did not receive expected error")
}
}
}
示例9: TestEvaluator
func TestEvaluator(t *testing.T) {
defer leaktest.AfterTest(t)()
columnTypeInt := &sqlbase.ColumnType{Kind: sqlbase.ColumnType_INT}
columnTypeBool := &sqlbase.ColumnType{Kind: sqlbase.ColumnType_BOOL}
v := [15]sqlbase.EncDatum{}
for i := range v {
v[i] = sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(i)))
}
b := [2]sqlbase.EncDatum{}
b[0] = sqlbase.DatumToEncDatum(*columnTypeBool, parser.DBoolTrue)
b[1] = sqlbase.DatumToEncDatum(*columnTypeBool, parser.DBoolFalse)
nullInt := sqlbase.DatumToEncDatum(*columnTypeInt, parser.DNull)
testCases := []struct {
spec EvaluatorSpec
input sqlbase.EncDatumRows
expected sqlbase.EncDatumRows
}{
{
spec: EvaluatorSpec{
Exprs: []Expression{{Expr: "@2"}, {Expr: "(((@1)))"}},
},
input: sqlbase.EncDatumRows{
{v[1], v[2]},
{v[3], v[4]},
{v[6], v[2]},
{v[7], v[2]},
{v[8], v[4]},
{nullInt, nullInt},
},
expected: sqlbase.EncDatumRows{
{v[2], v[1]},
{v[4], v[3]},
{v[2], v[6]},
{v[2], v[7]},
{v[4], v[8]},
{nullInt, nullInt},
},
}, {
spec: EvaluatorSpec{
Exprs: []Expression{
{Expr: "@1 + @2"},
{Expr: "@1 - @2"},
{Expr: "@1 >= 8"},
},
},
input: sqlbase.EncDatumRows{
{v[10], v[0]},
{v[9], v[1]},
{v[8], v[2]},
{v[7], v[3]},
{v[6], v[4]},
},
expected: sqlbase.EncDatumRows{
{v[10], v[10], b[0]},
{v[10], v[8], b[0]},
{v[10], v[6], b[0]},
{v[10], v[4], b[1]},
{v[10], v[2], b[1]},
},
}, {
spec: EvaluatorSpec{
Exprs: []Expression{
{Expr: "@1 AND @1"},
{Expr: "@1 AND @2"},
{Expr: "NOT @1"},
},
},
input: sqlbase.EncDatumRows{
{b[0], b[1]},
},
expected: sqlbase.EncDatumRows{
{b[0], b[1], b[1]},
},
},
{
spec: EvaluatorSpec{
Exprs: []Expression{{Expr: "1"}},
},
input: sqlbase.EncDatumRows{
{v[1], v[2]},
{v[3], v[4]},
{v[6], v[2]},
{v[7], v[2]},
{v[8], v[4]},
},
expected: sqlbase.EncDatumRows{
{v[1]},
{v[1]},
{v[1]},
{v[1]},
{v[1]},
},
},
}
for _, c := range testCases {
//.........這裏部分代碼省略.........
示例10: TestAggregator
// TODO(irfansharif): Add tests to verify the following aggregation functions:
// AVG
// BOOL_AND
// BOOL_OR
// CONCAT_AGG
// STDDEV
// VARIANCE
func TestAggregator(t *testing.T) {
defer leaktest.AfterTest(t)()
columnTypeInt := &sqlbase.ColumnType{Kind: sqlbase.ColumnType_INT}
v := [15]sqlbase.EncDatum{}
null := sqlbase.EncDatum{Datum: parser.DNull}
for i := range v {
v[i] = sqlbase.DatumToEncDatum(*columnTypeInt, parser.NewDInt(parser.DInt(i)))
}
testCases := []struct {
spec AggregatorSpec
input sqlbase.EncDatumRows
expected sqlbase.EncDatumRows
}{
{
// SELECT MIN(@0), MAX(@0), COUNT(@0), AVG(@0), SUM(@0), STDDEV(@0),
// VARIANCE(@0) GROUP BY [] (no rows).
spec: AggregatorSpec{
Types: []*sqlbase.ColumnType{columnTypeInt},
Exprs: []AggregatorSpec_Expr{
{
Func: AggregatorSpec_MIN,
ColIdx: 0,
},
{
Func: AggregatorSpec_MAX,
ColIdx: 0,
},
{
Func: AggregatorSpec_COUNT,
ColIdx: 0,
},
{
Func: AggregatorSpec_AVG,
ColIdx: 0,
},
{
Func: AggregatorSpec_SUM,
ColIdx: 0,
},
{
Func: AggregatorSpec_STDDEV,
ColIdx: 0,
},
{
Func: AggregatorSpec_VARIANCE,
ColIdx: 0,
},
},
},
input: sqlbase.EncDatumRows{},
expected: sqlbase.EncDatumRows{
{null, null, v[0], null, null, null, null},
},
},
{
// SELECT @2, COUNT(@1), GROUP BY @2.
spec: AggregatorSpec{
Types: []*sqlbase.ColumnType{columnTypeInt, columnTypeInt},
GroupCols: []uint32{1},
Exprs: []AggregatorSpec_Expr{
{
Func: AggregatorSpec_IDENT,
ColIdx: 1,
},
{
Func: AggregatorSpec_COUNT,
ColIdx: 0,
},
},
},
input: sqlbase.EncDatumRows{
{v[1], v[2]},
{v[3], null},
{v[6], v[2]},
{v[7], v[2]},
{v[8], v[4]},
},
expected: sqlbase.EncDatumRows{
{null, v[1]},
{v[4], v[1]},
{v[2], v[3]},
},
},
{
// SELECT @2, COUNT(@1), GROUP BY @2.
spec: AggregatorSpec{
Types: []*sqlbase.ColumnType{columnTypeInt, columnTypeInt},
GroupCols: []uint32{1},
Exprs: []AggregatorSpec_Expr{
{
Func: AggregatorSpec_IDENT,
//.........這裏部分代碼省略.........