Merge pull request #8752 from benbjohnson/1479-meta-queries

Use system cursors for measurement, series, and tag key meta queries.
pull/8770/head
Ben Johnson 2017-08-30 08:35:35 -06:00 committed by GitHub
commit 57d42ac4af
12 changed files with 155 additions and 142 deletions

View File

@ -21,6 +21,7 @@
- [#8662](https://github.com/influxdata/influxdb/pull/8662): Improve test coverage across both indexes. - [#8662](https://github.com/influxdata/influxdb/pull/8662): Improve test coverage across both indexes.
- [#8611](https://github.com/influxdata/influxdb/issues/8611): Respect X-Request-Id/Request-Id headers. - [#8611](https://github.com/influxdata/influxdb/issues/8611): Respect X-Request-Id/Request-Id headers.
- [#8572](https://github.com/influxdata/influxdb/issues/8668): InfluxDB now uses MIT licensed version of BurntSushi/toml. - [#8572](https://github.com/influxdata/influxdb/issues/8668): InfluxDB now uses MIT licensed version of BurntSushi/toml.
- [#8752](https://github.com/influxdata/influxdb/pull/8752): Use system cursors for measurement, series, and tag key meta queries.
### Bugfixes ### Bugfixes

View File

@ -449,6 +449,7 @@ func (e *StatementExecutor) executeSelectStatement(stmt *influxql.SelectStatemen
em.Location = stmt.Location em.Location = stmt.Location
} }
em.OmitTime = stmt.OmitTime em.OmitTime = stmt.OmitTime
em.EmitName = stmt.EmitName
defer em.Close() defer em.Close()
// Emit rows to the results channel. // Emit rows to the results channel.

View File

@ -1004,6 +1004,12 @@ type SelectStatement struct {
// Removes the "time" column from the output. // Removes the "time" column from the output.
OmitTime bool OmitTime bool
// Removes measurement name from resulting query. Useful for meta queries.
StripName bool
// Overrides the output measurement name.
EmitName string
// Removes duplicate rows from raw queries. // Removes duplicate rows from raw queries.
Dedupe bool Dedupe bool
} }

View File

@ -88,21 +88,25 @@ func rewriteShowFieldKeyCardinalityStatement(stmt *ShowFieldKeyCardinalityStatem
} }
func rewriteShowMeasurementsStatement(stmt *ShowMeasurementsStatement) (Statement, error) { func rewriteShowMeasurementsStatement(stmt *ShowMeasurementsStatement) (Statement, error) {
// Check for time in WHERE clause (not supported). var sources Sources
if HasTimeExpr(stmt.Condition) { if stmt.Source != nil {
return nil, errors.New("SHOW MEASUREMENTS doesn't support time in WHERE clause") sources = Sources{stmt.Source}
} }
condition := stmt.Condition return &SelectStatement{
if stmt.Source != nil { Fields: []*Field{
condition = rewriteSourcesCondition(Sources([]Source{stmt.Source}), stmt.Condition) {Expr: &VarRef{Val: "_name"}, Alias: "name"},
} },
return &ShowMeasurementsStatement{ Sources: rewriteSources2(sources, stmt.Database),
Database: stmt.Database, Condition: stmt.Condition,
Condition: condition,
Limit: stmt.Limit,
Offset: stmt.Offset, Offset: stmt.Offset,
Limit: stmt.Limit,
SortFields: stmt.SortFields, SortFields: stmt.SortFields,
OmitTime: true,
StripName: true,
EmitName: "measurements",
Dedupe: true,
IsRawQuery: true,
}, nil }, nil
} }
@ -140,25 +144,22 @@ func rewriteShowMeasurementCardinalityStatement(stmt *ShowMeasurementCardinality
Offset: stmt.Offset, Offset: stmt.Offset,
Limit: stmt.Limit, Limit: stmt.Limit,
OmitTime: true, OmitTime: true,
StripName: true,
}, nil }, nil
} }
func rewriteShowSeriesStatement(stmt *ShowSeriesStatement) (Statement, error) { func rewriteShowSeriesStatement(stmt *ShowSeriesStatement) (Statement, error) {
// Check for time in WHERE clause (not supported).
if HasTimeExpr(stmt.Condition) {
return nil, errors.New("SHOW SERIES doesn't support time in WHERE clause")
}
return &SelectStatement{ return &SelectStatement{
Fields: []*Field{ Fields: []*Field{
{Expr: &VarRef{Val: "key"}}, {Expr: &VarRef{Val: "_seriesKey"}, Alias: "key"},
}, },
Sources: rewriteSources(stmt.Sources, "_series", stmt.Database), Sources: rewriteSources2(stmt.Sources, stmt.Database),
Condition: rewriteSourcesCondition(stmt.Sources, stmt.Condition), Condition: stmt.Condition,
Offset: stmt.Offset, Offset: stmt.Offset,
Limit: stmt.Limit, Limit: stmt.Limit,
SortFields: stmt.SortFields, SortFields: stmt.SortFields,
OmitTime: true, OmitTime: true,
StripName: true,
Dedupe: true, Dedupe: true,
IsRawQuery: true, IsRawQuery: true,
}, nil }, nil
@ -248,11 +249,6 @@ func rewriteShowTagValuesStatement(stmt *ShowTagValuesStatement) (Statement, err
} }
func rewriteShowTagValuesCardinalityStatement(stmt *ShowTagValuesCardinalityStatement) (Statement, error) { func rewriteShowTagValuesCardinalityStatement(stmt *ShowTagValuesCardinalityStatement) (Statement, error) {
// Check for time in WHERE clause (not supported).
if HasTimeExpr(stmt.Condition) {
return nil, errors.New("SHOW TAG VALUES CARDINALITY doesn't support time in WHERE clause")
}
// Use all measurements, if zero. // Use all measurements, if zero.
if len(stmt.Sources) == 0 { if len(stmt.Sources) == 0 {
stmt.Sources = Sources{ stmt.Sources = Sources{
@ -324,17 +320,18 @@ func rewriteShowTagValuesCardinalityStatement(stmt *ShowTagValuesCardinalityStat
} }
func rewriteShowTagKeysStatement(stmt *ShowTagKeysStatement) (Statement, error) { func rewriteShowTagKeysStatement(stmt *ShowTagKeysStatement) (Statement, error) {
// Check for time in WHERE clause (not supported).
if HasTimeExpr(stmt.Condition) {
return nil, errors.New("SHOW TAG KEYS doesn't support time in WHERE clause")
}
return &SelectStatement{ return &SelectStatement{
Fields: []*Field{ Fields: []*Field{
{Expr: &VarRef{Val: "tagKey"}}, {
Expr: &Call{
Name: "distinct",
Args: []Expr{&VarRef{Val: "_tagKey"}},
},
Alias: "tagKey",
},
}, },
Sources: rewriteSources(stmt.Sources, "_tagKeys", stmt.Database), Sources: rewriteSources2(stmt.Sources, stmt.Database),
Condition: rewriteSourcesCondition(stmt.Sources, stmt.Condition), Condition: stmt.Condition,
Offset: stmt.Offset, Offset: stmt.Offset,
Limit: stmt.Limit, Limit: stmt.Limit,
SortFields: stmt.SortFields, SortFields: stmt.SortFields,
@ -457,3 +454,20 @@ func rewriteSourcesCondition(sources Sources, cond Expr) Expr {
} }
return scond return scond
} }
func rewriteSources2(sources Sources, database string) Sources {
if len(sources) == 0 {
sources = Sources{&Measurement{Regex: &RegexLiteral{Val: matchAllRegex.Copy()}}}
}
for _, source := range sources {
switch source := source.(type) {
case *Measurement:
if source.Database == "" {
source.Database = database
}
}
}
return sources
}
var matchAllRegex = regexp.MustCompile(`.+`)

View File

@ -53,91 +53,91 @@ func TestRewriteStatement(t *testing.T) {
}, },
{ {
stmt: `SHOW SERIES`, stmt: `SHOW SERIES`,
s: `SELECT "key" FROM _series`, s: `SELECT _seriesKey AS "key" FROM /.+/`,
}, },
{ {
stmt: `SHOW SERIES ON db0`, stmt: `SHOW SERIES ON db0`,
s: `SELECT "key" FROM db0.._series`, s: `SELECT _seriesKey AS "key" FROM db0../.+/`,
}, },
{ {
stmt: `SHOW SERIES FROM cpu`, stmt: `SHOW SERIES FROM cpu`,
s: `SELECT "key" FROM _series WHERE _name = 'cpu'`, s: `SELECT _seriesKey AS "key" FROM cpu`,
}, },
{ {
stmt: `SHOW SERIES ON db0 FROM cpu`, stmt: `SHOW SERIES ON db0 FROM cpu`,
s: `SELECT "key" FROM db0.._series WHERE _name = 'cpu'`, s: `SELECT _seriesKey AS "key" FROM db0..cpu`,
}, },
{ {
stmt: `SHOW SERIES FROM mydb.myrp1.cpu`, stmt: `SHOW SERIES FROM mydb.myrp1.cpu`,
s: `SELECT "key" FROM mydb.myrp1._series WHERE _name = 'cpu'`, s: `SELECT _seriesKey AS "key" FROM mydb.myrp1.cpu`,
}, },
{ {
stmt: `SHOW SERIES ON db0 FROM mydb.myrp1.cpu`, stmt: `SHOW SERIES ON db0 FROM mydb.myrp1.cpu`,
s: `SELECT "key" FROM mydb.myrp1._series WHERE _name = 'cpu'`, s: `SELECT _seriesKey AS "key" FROM mydb.myrp1.cpu`,
}, },
{ {
stmt: `SHOW SERIES FROM mydb.myrp1./c.*/`, stmt: `SHOW SERIES FROM mydb.myrp1./c.*/`,
s: `SELECT "key" FROM mydb.myrp1._series WHERE _name =~ /c.*/`, s: `SELECT _seriesKey AS "key" FROM mydb.myrp1./c.*/`,
}, },
{ {
stmt: `SHOW SERIES ON db0 FROM mydb.myrp1./c.*/`, stmt: `SHOW SERIES ON db0 FROM mydb.myrp1./c.*/`,
s: `SELECT "key" FROM mydb.myrp1._series WHERE _name =~ /c.*/`, s: `SELECT _seriesKey AS "key" FROM mydb.myrp1./c.*/`,
}, },
{ {
stmt: `SHOW TAG KEYS`, stmt: `SHOW TAG KEYS`,
s: `SELECT tagKey FROM _tagKeys`, s: `SELECT distinct(_tagKey) AS tagKey FROM /.+/`,
}, },
{ {
stmt: `SHOW TAG KEYS ON db0`, stmt: `SHOW TAG KEYS ON db0`,
s: `SELECT tagKey FROM db0.._tagKeys`, s: `SELECT distinct(_tagKey) AS tagKey FROM db0../.+/`,
}, },
{ {
stmt: `SHOW TAG KEYS FROM cpu`, stmt: `SHOW TAG KEYS FROM cpu`,
s: `SELECT tagKey FROM _tagKeys WHERE _name = 'cpu'`, s: `SELECT distinct(_tagKey) AS tagKey FROM cpu`,
}, },
{ {
stmt: `SHOW TAG KEYS ON db0 FROM cpu`, stmt: `SHOW TAG KEYS ON db0 FROM cpu`,
s: `SELECT tagKey FROM db0.._tagKeys WHERE _name = 'cpu'`, s: `SELECT distinct(_tagKey) AS tagKey FROM db0..cpu`,
}, },
{ {
stmt: `SHOW TAG KEYS FROM /c.*/`, stmt: `SHOW TAG KEYS FROM /c.*/`,
s: `SELECT tagKey FROM _tagKeys WHERE _name =~ /c.*/`, s: `SELECT distinct(_tagKey) AS tagKey FROM /c.*/`,
}, },
{ {
stmt: `SHOW TAG KEYS ON db0 FROM /c.*/`, stmt: `SHOW TAG KEYS ON db0 FROM /c.*/`,
s: `SELECT tagKey FROM db0.._tagKeys WHERE _name =~ /c.*/`, s: `SELECT distinct(_tagKey) AS tagKey FROM db0../c.*/`,
}, },
{ {
stmt: `SHOW TAG KEYS FROM cpu WHERE region = 'uswest'`, stmt: `SHOW TAG KEYS FROM cpu WHERE region = 'uswest'`,
s: `SELECT tagKey FROM _tagKeys WHERE (_name = 'cpu') AND (region = 'uswest')`, s: `SELECT distinct(_tagKey) AS tagKey FROM cpu WHERE region = 'uswest'`,
}, },
{ {
stmt: `SHOW TAG KEYS ON db0 FROM cpu WHERE region = 'uswest'`, stmt: `SHOW TAG KEYS ON db0 FROM cpu WHERE region = 'uswest'`,
s: `SELECT tagKey FROM db0.._tagKeys WHERE (_name = 'cpu') AND (region = 'uswest')`, s: `SELECT distinct(_tagKey) AS tagKey FROM db0..cpu WHERE region = 'uswest'`,
}, },
{ {
stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu`, stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu`,
s: `SELECT tagKey FROM mydb.myrp1._tagKeys WHERE _name = 'cpu'`, s: `SELECT distinct(_tagKey) AS tagKey FROM mydb.myrp1.cpu`,
}, },
{ {
stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu`, stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu`,
s: `SELECT tagKey FROM mydb.myrp1._tagKeys WHERE _name = 'cpu'`, s: `SELECT distinct(_tagKey) AS tagKey FROM mydb.myrp1.cpu`,
}, },
{ {
stmt: `SHOW TAG KEYS FROM mydb.myrp1./c.*/`, stmt: `SHOW TAG KEYS FROM mydb.myrp1./c.*/`,
s: `SELECT tagKey FROM mydb.myrp1._tagKeys WHERE _name =~ /c.*/`, s: `SELECT distinct(_tagKey) AS tagKey FROM mydb.myrp1./c.*/`,
}, },
{ {
stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1./c.*/`, stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1./c.*/`,
s: `SELECT tagKey FROM mydb.myrp1._tagKeys WHERE _name =~ /c.*/`, s: `SELECT distinct(_tagKey) AS tagKey FROM mydb.myrp1./c.*/`,
}, },
{ {
stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu WHERE region = 'uswest'`, stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu WHERE region = 'uswest'`,
s: `SELECT tagKey FROM mydb.myrp1._tagKeys WHERE (_name = 'cpu') AND (region = 'uswest')`, s: `SELECT distinct(_tagKey) AS tagKey FROM mydb.myrp1.cpu WHERE region = 'uswest'`,
}, },
{ {
stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu WHERE region = 'uswest'`, stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu WHERE region = 'uswest'`,
s: `SELECT tagKey FROM mydb.myrp1._tagKeys WHERE (_name = 'cpu') AND (region = 'uswest')`, s: `SELECT distinct(_tagKey) AS tagKey FROM mydb.myrp1.cpu WHERE region = 'uswest'`,
}, },
{ {
stmt: `SELECT value FROM cpu`, stmt: `SELECT value FROM cpu`,

View File

@ -20,6 +20,9 @@ type Emitter struct {
// The columns to attach to each row. // The columns to attach to each row.
Columns []string Columns []string
// Overridden measurement name to emit.
EmitName string
// The time zone location. // The time zone location.
Location *time.Location Location *time.Location
@ -139,6 +142,10 @@ func (e *Emitter) loadBuf() (t int64, name string, tags Tags, err error) {
// createRow creates a new row attached to the emitter. // createRow creates a new row attached to the emitter.
func (e *Emitter) createRow(name string, tags Tags, values []interface{}) { func (e *Emitter) createRow(name string, tags Tags, values []interface{}) {
if e.EmitName != "" {
name = e.EmitName
}
e.tags = tags e.tags = tags
e.row = &models.Row{ e.row = &models.Row{
Name: name, Name: name,

View File

@ -216,6 +216,7 @@ type IteratorOptions struct {
Offset *int64 `protobuf:"varint,13,opt,name=Offset" json:"Offset,omitempty"` Offset *int64 `protobuf:"varint,13,opt,name=Offset" json:"Offset,omitempty"`
SLimit *int64 `protobuf:"varint,14,opt,name=SLimit" json:"SLimit,omitempty"` SLimit *int64 `protobuf:"varint,14,opt,name=SLimit" json:"SLimit,omitempty"`
SOffset *int64 `protobuf:"varint,15,opt,name=SOffset" json:"SOffset,omitempty"` SOffset *int64 `protobuf:"varint,15,opt,name=SOffset" json:"SOffset,omitempty"`
StripName *bool `protobuf:"varint,22,opt,name=StripName" json:"StripName,omitempty"`
Dedupe *bool `protobuf:"varint,16,opt,name=Dedupe" json:"Dedupe,omitempty"` Dedupe *bool `protobuf:"varint,16,opt,name=Dedupe" json:"Dedupe,omitempty"`
MaxSeriesN *int64 `protobuf:"varint,18,opt,name=MaxSeriesN" json:"MaxSeriesN,omitempty"` MaxSeriesN *int64 `protobuf:"varint,18,opt,name=MaxSeriesN" json:"MaxSeriesN,omitempty"`
Ordered *bool `protobuf:"varint,20,opt,name=Ordered" json:"Ordered,omitempty"` Ordered *bool `protobuf:"varint,20,opt,name=Ordered" json:"Ordered,omitempty"`
@ -353,6 +354,13 @@ func (m *IteratorOptions) GetSOffset() int64 {
return 0 return 0
} }
func (m *IteratorOptions) GetStripName() bool {
if m != nil && m.StripName != nil {
return *m.StripName
}
return false
}
func (m *IteratorOptions) GetDedupe() bool { func (m *IteratorOptions) GetDedupe() bool {
if m != nil && m.Dedupe != nil { if m != nil && m.Dedupe != nil {
return *m.Dedupe return *m.Dedupe
@ -529,53 +537,54 @@ func init() {
func init() { proto.RegisterFile("internal/internal.proto", fileDescriptorInternal) } func init() { proto.RegisterFile("internal/internal.proto", fileDescriptorInternal) }
var fileDescriptorInternal = []byte{ var fileDescriptorInternal = []byte{
// 757 bytes of a gzipped FileDescriptorProto // 769 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0x51, 0x6f, 0xfb, 0x34, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x55, 0xe1, 0x8e, 0xe3, 0x34,
0x10, 0x57, 0x92, 0xa6, 0x6b, 0xdc, 0x95, 0xfe, 0x31, 0x65, 0x58, 0x68, 0x42, 0x51, 0x04, 0x52, 0x10, 0x56, 0x92, 0x4d, 0xb7, 0x71, 0xb7, 0xf4, 0x30, 0x65, 0xb1, 0xd0, 0x09, 0x45, 0x11, 0x48,
0x04, 0xa8, 0x48, 0x7b, 0xe2, 0x09, 0xa9, 0x63, 0x1b, 0xaa, 0xb4, 0x75, 0x93, 0x33, 0xf6, 0x6e, 0x11, 0xa0, 0x22, 0xed, 0x2f, 0x7e, 0x21, 0xf5, 0xd8, 0x5b, 0x54, 0xe9, 0xae, 0x7b, 0x72, 0x97,
0x9a, 0x5b, 0x64, 0x29, 0x75, 0x8a, 0xe3, 0xa0, 0xf6, 0xa3, 0xf0, 0xb1, 0xf8, 0x14, 0x3c, 0xf2, 0xfd, 0x6f, 0x9a, 0xd9, 0xc8, 0x52, 0xea, 0x14, 0xc7, 0x41, 0xed, 0x03, 0xf0, 0x10, 0x3c, 0x16,
0x15, 0x90, 0xcf, 0x49, 0x9b, 0x4e, 0xa0, 0xfd, 0x9f, 0x7a, 0xbf, 0xdf, 0x5d, 0x6c, 0xdf, 0xdd, 0x4f, 0xc2, 0x2b, 0x20, 0x8f, 0x9d, 0x34, 0x5d, 0x81, 0xf6, 0x7e, 0x75, 0xbe, 0x6f, 0xa6, 0x63,
0xef, 0xae, 0xe4, 0x0b, 0xa9, 0x0c, 0x68, 0x25, 0xca, 0x1f, 0x3a, 0x63, 0xbe, 0xd5, 0x95, 0xa9, 0xcf, 0xcc, 0x37, 0x0e, 0xf9, 0x42, 0x2a, 0x03, 0x5a, 0x89, 0xea, 0x87, 0xce, 0x58, 0xec, 0x75,
0x68, 0xf8, 0x7b, 0x03, 0x7a, 0x9f, 0xfc, 0xe3, 0x93, 0xf0, 0xa9, 0x92, 0xca, 0x50, 0x4a, 0x06, 0x6d, 0x6a, 0x1a, 0xff, 0xde, 0x82, 0x3e, 0x66, 0xff, 0x84, 0x24, 0xfe, 0x50, 0x4b, 0x65, 0x28,
0x2b, 0xb1, 0x01, 0xe6, 0xc5, 0x7e, 0x1a, 0x71, 0xb4, 0x2d, 0xf7, 0x2c, 0x8a, 0x9a, 0xf9, 0x8e, 0x25, 0x17, 0x6b, 0xb1, 0x03, 0x16, 0xa4, 0x61, 0x9e, 0x70, 0xb4, 0x2d, 0xf7, 0x20, 0xca, 0x86,
0xb3, 0x36, 0x72, 0x72, 0x03, 0x2c, 0x88, 0xfd, 0x34, 0xe0, 0x68, 0xd3, 0x0f, 0x24, 0x58, 0xc9, 0x85, 0x8e, 0xb3, 0x36, 0x72, 0x72, 0x07, 0x2c, 0x4a, 0xc3, 0x3c, 0xe2, 0x68, 0xd3, 0x57, 0x24,
0x92, 0x0d, 0x62, 0x3f, 0x1d, 0x71, 0x6b, 0xd2, 0x4b, 0x12, 0x2c, 0x9a, 0x1d, 0x0b, 0xe3, 0x20, 0x5a, 0xcb, 0x8a, 0x5d, 0xa4, 0x61, 0x3e, 0xe6, 0xd6, 0xa4, 0xaf, 0x49, 0xb4, 0x6c, 0x0f, 0x2c,
0x1d, 0x5f, 0x91, 0x39, 0x5e, 0x36, 0x5f, 0x34, 0x3b, 0x6e, 0x69, 0xfa, 0x15, 0x21, 0x8b, 0xa2, 0x4e, 0xa3, 0x7c, 0x72, 0x43, 0x16, 0x78, 0xd8, 0x62, 0xd9, 0x1e, 0xb8, 0xa5, 0xe9, 0x57, 0x84,
0xd0, 0x50, 0x08, 0x03, 0x39, 0x1b, 0xc6, 0x5e, 0x3a, 0xe1, 0x3d, 0xc6, 0xfa, 0xef, 0xca, 0x4a, 0x2c, 0xcb, 0x52, 0x43, 0x29, 0x0c, 0x14, 0x6c, 0x94, 0x06, 0xf9, 0x94, 0x0f, 0x18, 0xeb, 0xbf,
0x98, 0x17, 0x51, 0x36, 0xc0, 0xce, 0x62, 0x2f, 0xf5, 0x78, 0x8f, 0xa1, 0x09, 0x39, 0x5f, 0x2a, 0xab, 0x6a, 0x61, 0x1e, 0x45, 0xd5, 0x02, 0xbb, 0x4c, 0x83, 0x3c, 0xe0, 0x03, 0x86, 0x66, 0xe4,
0x03, 0x05, 0x68, 0x17, 0x31, 0x8a, 0xbd, 0x34, 0xe0, 0x27, 0x1c, 0x8d, 0xc9, 0x38, 0x33, 0x5a, 0x6a, 0xa5, 0x0c, 0x94, 0xa0, 0x5d, 0xc4, 0x38, 0x0d, 0xf2, 0x88, 0x9f, 0x71, 0x34, 0x25, 0x93,
0xaa, 0xc2, 0x85, 0x44, 0xb1, 0x97, 0x46, 0xbc, 0x4f, 0xd9, 0x53, 0xae, 0xab, 0xaa, 0x04, 0xa1, 0x8d, 0xd1, 0x52, 0x95, 0x2e, 0x24, 0x49, 0x83, 0x3c, 0xe1, 0x43, 0xca, 0x66, 0x79, 0x53, 0xd7,
0x5c, 0x08, 0x89, 0xbd, 0x74, 0xc4, 0x4f, 0x38, 0xfa, 0x35, 0x99, 0xfc, 0xaa, 0x6a, 0x59, 0x28, 0x15, 0x08, 0xe5, 0x42, 0x48, 0x1a, 0xe4, 0x63, 0x7e, 0xc6, 0xd1, 0xaf, 0xc9, 0xf4, 0x57, 0xd5,
0xc8, 0x5d, 0xd0, 0x79, 0xec, 0xa5, 0x03, 0x7e, 0x4a, 0xd2, 0x6f, 0x49, 0x98, 0x19, 0x61, 0x6a, 0xc8, 0x52, 0x41, 0xe1, 0x82, 0xae, 0xd2, 0x20, 0xbf, 0xe0, 0xe7, 0x24, 0xfd, 0x96, 0xc4, 0x1b,
0x36, 0x8e, 0xbd, 0x74, 0x7c, 0x35, 0x6b, 0xf3, 0x5d, 0x1a, 0xd0, 0xc2, 0x54, 0x1a, 0x7d, 0xdc, 0x23, 0x4c, 0xc3, 0x26, 0x69, 0x90, 0x4f, 0x6e, 0xe6, 0xbe, 0xde, 0x95, 0x01, 0x2d, 0x4c, 0xad,
0x85, 0x24, 0x7f, 0x79, 0x58, 0x1a, 0xfa, 0x25, 0x19, 0xdd, 0x08, 0x23, 0x9e, 0xf7, 0x5b, 0x57, 0xd1, 0xc7, 0x5d, 0x48, 0xf6, 0x77, 0x80, 0xad, 0xa1, 0x5f, 0x92, 0xf1, 0xad, 0x30, 0xe2, 0xe1,
0xf3, 0x90, 0x1f, 0xf0, 0x9b, 0xfc, 0xfd, 0x77, 0xf3, 0x0f, 0xde, 0xcf, 0x7f, 0xf0, 0x7e, 0xfe, 0xb8, 0x77, 0x3d, 0x8f, 0x79, 0x8f, 0x9f, 0xd5, 0x1f, 0xbe, 0x58, 0x7f, 0xf4, 0x72, 0xfd, 0x17,
0xe1, 0xc7, 0xe4, 0x3f, 0xfc, 0x8f, 0xfc, 0x93, 0xbf, 0x07, 0x64, 0xda, 0x25, 0xfb, 0xb8, 0x35, 0x2f, 0xd7, 0x1f, 0x7f, 0x4c, 0xfd, 0xa3, 0xff, 0xa8, 0x3f, 0xfb, 0x33, 0x26, 0xb3, 0xae, 0xd8,
0xb2, 0x52, 0xa8, 0x93, 0xdb, 0xdd, 0x56, 0x33, 0x0f, 0x2f, 0x46, 0xdb, 0xea, 0xc4, 0xaa, 0xc2, 0xfb, 0xbd, 0x91, 0xb5, 0x42, 0x9d, 0xbc, 0x3d, 0xec, 0x35, 0x0b, 0xf0, 0x60, 0xb4, 0xad, 0x4e,
0x8f, 0x83, 0x34, 0x72, 0x4a, 0xf8, 0x86, 0x0c, 0xef, 0x24, 0x94, 0x79, 0xcd, 0x3e, 0x45, 0xa9, 0xac, 0x2a, 0xc2, 0x34, 0xca, 0x13, 0xa7, 0x84, 0x6f, 0xc8, 0xe8, 0x4e, 0x42, 0x55, 0x34, 0xec,
0x4c, 0xda, 0xd2, 0xbd, 0x08, 0xcd, 0xe1, 0x95, 0xb7, 0x4e, 0xfa, 0x3d, 0x39, 0xcb, 0xaa, 0x46, 0x53, 0x94, 0xca, 0xd4, 0xb7, 0xee, 0x51, 0x68, 0x0e, 0x4f, 0xdc, 0x3b, 0xe9, 0xf7, 0xe4, 0x72,
0xaf, 0xa1, 0x66, 0x01, 0xc6, 0xd1, 0x36, 0xee, 0x01, 0x44, 0xdd, 0x68, 0xd8, 0x80, 0x32, 0xbc, 0x53, 0xb7, 0x7a, 0x0b, 0x0d, 0x8b, 0x30, 0x8e, 0xfa, 0xb8, 0xf7, 0x20, 0x9a, 0x56, 0xc3, 0x0e,
0x0b, 0xa1, 0xdf, 0x91, 0x91, 0x2d, 0x85, 0xfe, 0x43, 0x94, 0x98, 0xf7, 0xf8, 0x6a, 0xda, 0x75, 0x94, 0xe1, 0x5d, 0x08, 0xfd, 0x8e, 0x8c, 0x6d, 0x2b, 0xf4, 0x1f, 0xa2, 0xc2, 0xba, 0x27, 0x37,
0xa4, 0xa5, 0xf9, 0x21, 0xc0, 0xd6, 0xfa, 0x46, 0x6e, 0x40, 0xd5, 0xf6, 0xd5, 0x28, 0xd8, 0x88, 0xb3, 0x6e, 0x22, 0x9e, 0xe6, 0x7d, 0x80, 0xed, 0xf5, 0xad, 0xdc, 0x81, 0x6a, 0xec, 0xad, 0x51,
0xf7, 0x18, 0xca, 0xc8, 0xd9, 0x2f, 0xba, 0x6a, 0xb6, 0xd7, 0x7b, 0xf6, 0x19, 0x3a, 0x3b, 0x68, 0xb0, 0x09, 0x1f, 0x30, 0x94, 0x91, 0xcb, 0x5f, 0x74, 0xdd, 0xee, 0xdf, 0x1c, 0xd9, 0x67, 0xe8,
0x33, 0xbc, 0x93, 0x65, 0x89, 0x25, 0x09, 0x39, 0xda, 0xf4, 0x92, 0x44, 0xf6, 0xb7, 0x2f, 0xdc, 0xec, 0xa0, 0xad, 0xf0, 0x4e, 0x56, 0x15, 0xb6, 0x24, 0xe6, 0x68, 0xd3, 0xd7, 0x24, 0xb1, 0xbf,
0x23, 0x61, 0xbd, 0x3f, 0x57, 0x2a, 0x97, 0xb6, 0x42, 0x28, 0xda, 0x88, 0x1f, 0x09, 0xeb, 0xcd, 0x43, 0xe1, 0x9e, 0x08, 0xeb, 0xfd, 0xb9, 0x56, 0x85, 0xb4, 0x1d, 0x42, 0xd1, 0x26, 0xfc, 0x44,
0x8c, 0xd0, 0x06, 0xc7, 0x2b, 0xc2, 0x96, 0x1e, 0x09, 0xfb, 0x8e, 0x5b, 0x95, 0xa3, 0x8f, 0xa0, 0x58, 0xef, 0xc6, 0x08, 0x6d, 0x70, 0xbd, 0x12, 0x1c, 0xe9, 0x89, 0xb0, 0xf7, 0x78, 0xab, 0x0a,
0xaf, 0x83, 0x56, 0x49, 0xf7, 0xd5, 0x5a, 0xe0, 0xa1, 0x9f, 0xe3, 0xa1, 0x07, 0x6c, 0xcf, 0x5c, 0xf4, 0x11, 0xf4, 0x75, 0xd0, 0x2a, 0xe9, 0x5d, 0xbd, 0x15, 0x98, 0xf4, 0x73, 0x4c, 0xda, 0x63,
0xd4, 0x6b, 0x50, 0xb9, 0x54, 0x05, 0xaa, 0x73, 0xc4, 0x8f, 0x04, 0x9d, 0x91, 0xf0, 0x5e, 0x6e, 0x9b, 0x73, 0xd9, 0x6c, 0x41, 0x15, 0x52, 0x95, 0xa8, 0xce, 0x31, 0x3f, 0x11, 0x74, 0x4e, 0xe2,
0xa4, 0x41, 0x55, 0x07, 0xdc, 0x01, 0x7a, 0x41, 0x86, 0x8f, 0xaf, 0xaf, 0x35, 0x18, 0x36, 0x41, 0x77, 0x72, 0x27, 0x0d, 0xaa, 0x3a, 0xe2, 0x0e, 0xd0, 0x6b, 0x32, 0xba, 0x7f, 0x7a, 0x6a, 0xc0,
0xba, 0x45, 0x96, 0xcf, 0x5c, 0xf8, 0x27, 0x8e, 0x77, 0xc8, 0xbe, 0x2c, 0x6b, 0x3f, 0x98, 0xba, 0xb0, 0x29, 0xd2, 0x1e, 0x59, 0x7e, 0xe3, 0xc2, 0x3f, 0x71, 0xbc, 0x43, 0xf6, 0x66, 0x1b, 0xff,
0x97, 0x65, 0xc7, 0x2f, 0x6e, 0x20, 0x6f, 0xb6, 0xc0, 0x3e, 0xe0, 0xd5, 0x2d, 0xb2, 0x35, 0x7f, 0x87, 0x99, 0xbb, 0x99, 0x87, 0xae, 0x22, 0x2d, 0xf7, 0xf8, 0xb0, 0x5c, 0xbb, 0xd3, 0x7b, 0xc2,
0x10, 0xbb, 0x0c, 0xb4, 0x84, 0x7a, 0xc5, 0x28, 0x7e, 0xd4, 0x63, 0xec, 0x89, 0x8f, 0x3a, 0x07, 0xe6, 0xbb, 0x85, 0xa2, 0xdd, 0x03, 0x7b, 0x85, 0x2e, 0x8f, 0xec, 0x44, 0xde, 0x8b, 0xc3, 0x06,
0x0d, 0x39, 0x9b, 0xe1, 0x87, 0x1d, 0x4c, 0x7e, 0x24, 0xe7, 0xbd, 0x96, 0xd7, 0x34, 0x25, 0xe1, 0xb4, 0x84, 0x66, 0xcd, 0x28, 0xa6, 0x1c, 0x30, 0xf6, 0xbc, 0x7b, 0x5d, 0x80, 0x86, 0x82, 0xcd,
0xd2, 0xc0, 0xa6, 0x66, 0xde, 0xff, 0xca, 0xc2, 0x05, 0x24, 0x7f, 0x7a, 0x64, 0xdc, 0xa3, 0xbb, 0xf1, 0x8f, 0x1d, 0xcc, 0x7e, 0x24, 0x57, 0x03, 0x41, 0x34, 0x34, 0x27, 0xf1, 0xca, 0xc0, 0xae,
0xf9, 0xfb, 0x4d, 0xd4, 0xd0, 0x6a, 0xf4, 0x80, 0x69, 0x4a, 0xa6, 0x1c, 0x0c, 0x28, 0x5b, 0xc2, 0x61, 0xc1, 0xff, 0x8a, 0xc6, 0x05, 0x64, 0x7f, 0x05, 0x64, 0x32, 0xa0, 0xbb, 0xed, 0xfc, 0x4d,
0xa7, 0xaa, 0x94, 0xeb, 0x3d, 0x0e, 0x61, 0xc4, 0xdf, 0xd2, 0x87, 0xad, 0x19, 0x38, 0x95, 0xe3, 0x34, 0xe0, 0x15, 0xdc, 0x63, 0x9a, 0x93, 0x19, 0x07, 0x03, 0xca, 0x36, 0xf8, 0x43, 0x5d, 0xc9,
0xd6, 0x9c, 0x91, 0x90, 0x43, 0x01, 0xbb, 0x76, 0xe6, 0x1c, 0xb0, 0xf7, 0x2d, 0xeb, 0x67, 0xa1, 0xed, 0x11, 0x57, 0x34, 0xe1, 0xcf, 0xe9, 0xfe, 0x4d, 0x8d, 0xdc, 0x0e, 0x60, 0xd5, 0x73, 0x12,
0x0b, 0x30, 0xed, 0xa4, 0x1d, 0x70, 0xf2, 0xd3, 0x51, 0xb0, 0xf8, 0xae, 0x46, 0xbb, 0x6e, 0x7a, 0x73, 0x28, 0xe1, 0xe0, 0x37, 0xd2, 0x01, 0x7b, 0xde, 0xaa, 0x79, 0x10, 0xba, 0x04, 0xe3, 0xf7,
0x58, 0x99, 0x03, 0xee, 0x75, 0xc6, 0xef, 0x77, 0x26, 0x59, 0x90, 0xc9, 0xc9, 0xae, 0xc1, 0x96, 0xb0, 0xc7, 0xd9, 0x4f, 0x27, 0x39, 0xe3, 0xbd, 0x5a, 0xed, 0x66, 0x1d, 0x60, 0x67, 0x7a, 0x3c,
0xb4, 0xd5, 0xf5, 0xda, 0x96, 0xb4, 0xa5, 0xbd, 0x20, 0x43, 0xdc, 0xf7, 0xab, 0xee, 0x08, 0x87, 0x98, 0x5b, 0x38, 0x9c, 0x5b, 0xb6, 0x24, 0xd3, 0xb3, 0x97, 0x08, 0x07, 0xe6, 0xbb, 0x1b, 0xf8,
0x92, 0x39, 0x19, 0xba, 0x99, 0xb3, 0x43, 0xfa, 0x22, 0xca, 0xf6, 0x7f, 0xc0, 0x9a, 0xb8, 0xf2, 0x81, 0xf9, 0xd6, 0x5e, 0x93, 0x11, 0x7e, 0x0d, 0xd6, 0x5d, 0x0a, 0x87, 0xb2, 0x05, 0x19, 0xb9,
0xed, 0x9a, 0xf2, 0x9d, 0xd0, 0xad, 0xfd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x75, 0x73, 0x8d, 0xb4, 0x2b, 0xfc, 0x28, 0x2a, 0xff, 0x95, 0xb0, 0x26, 0x7e, 0x10, 0xec, 0x23, 0x16, 0xba,
0x01, 0x59, 0x06, 0x00, 0x00, 0x35, 0xb0, 0xf6, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x55, 0x55, 0xec, 0xe3, 0x77, 0x06, 0x00,
0x00,
} }

View File

@ -46,6 +46,7 @@ message IteratorOptions {
optional int64 Offset = 13; optional int64 Offset = 13;
optional int64 SLimit = 14; optional int64 SLimit = 14;
optional int64 SOffset = 15; optional int64 SOffset = 15;
optional bool StripName = 22;
optional bool Dedupe = 16; optional bool Dedupe = 16;
optional int64 MaxSeriesN = 18; optional int64 MaxSeriesN = 18;
optional bool Ordered = 20; optional bool Ordered = 20;

View File

@ -666,6 +666,9 @@ type IteratorOptions struct {
// Limits the number of series. // Limits the number of series.
SLimit, SOffset int SLimit, SOffset int
// Removes the measurement name. Useful for meta queries.
StripName bool
// Removes duplicate rows from raw queries. // Removes duplicate rows from raw queries.
Dedupe bool Dedupe bool
@ -736,6 +739,7 @@ func newIteratorOptionsStmt(stmt *influxql.SelectStatement, sopt SelectOptions)
opt.Condition = condition opt.Condition = condition
opt.Ascending = stmt.TimeAscending() opt.Ascending = stmt.TimeAscending()
opt.Dedupe = stmt.Dedupe opt.Dedupe = stmt.Dedupe
opt.StripName = stmt.StripName
opt.Fill, opt.FillValue = stmt.Fill, stmt.FillValue opt.Fill, opt.FillValue = stmt.Fill, stmt.FillValue
if opt.Fill == influxql.NullFill && stmt.Target != nil { if opt.Fill == influxql.NullFill && stmt.Target != nil {
@ -986,6 +990,7 @@ func encodeIteratorOptions(opt *IteratorOptions) *internal.IteratorOptions {
Offset: proto.Int64(int64(opt.Offset)), Offset: proto.Int64(int64(opt.Offset)),
SLimit: proto.Int64(int64(opt.SLimit)), SLimit: proto.Int64(int64(opt.SLimit)),
SOffset: proto.Int64(int64(opt.SOffset)), SOffset: proto.Int64(int64(opt.SOffset)),
StripName: proto.Bool(opt.StripName),
Dedupe: proto.Bool(opt.Dedupe), Dedupe: proto.Bool(opt.Dedupe),
MaxSeriesN: proto.Int64(int64(opt.MaxSeriesN)), MaxSeriesN: proto.Int64(int64(opt.MaxSeriesN)),
Ordered: proto.Bool(opt.Ordered), Ordered: proto.Bool(opt.Ordered),
@ -1054,6 +1059,7 @@ func decodeIteratorOptions(pb *internal.IteratorOptions) (*IteratorOptions, erro
Offset: int(pb.GetOffset()), Offset: int(pb.GetOffset()),
SLimit: int(pb.GetSLimit()), SLimit: int(pb.GetSLimit()),
SOffset: int(pb.GetSOffset()), SOffset: int(pb.GetSOffset()),
StripName: pb.GetStripName(),
Dedupe: pb.GetDedupe(), Dedupe: pb.GetDedupe(),
MaxSeriesN: int(pb.GetMaxSeriesN()), MaxSeriesN: int(pb.GetMaxSeriesN()),
Ordered: pb.GetOrdered(), Ordered: pb.GetOrdered(),

View File

@ -1315,6 +1315,7 @@ func TestIteratorOptions_MarshalBinary(t *testing.T) {
Offset: 200, Offset: 200,
SLimit: 300, SLimit: 300,
SOffset: 400, SOffset: 400,
StripName: true,
Dedupe: true, Dedupe: true,
} }

View File

@ -6240,12 +6240,6 @@ func TestServer_Query_Where_With_Tags(t *testing.T) {
command: `select foo from where_events where tenant != 'paul' OR foo = 'bar'`, command: `select foo from where_events where tenant != 'paul' OR foo = 'bar'`,
exp: `{"results":[{"statement_id":0,"series":[{"name":"where_events","columns":["time","foo"],"values":[["2009-11-10T23:00:02Z","bar"],["2009-11-10T23:00:03Z","baz"],["2009-11-10T23:00:04Z","bat"],["2009-11-10T23:00:05Z","bar"],["2009-11-10T23:00:06Z","bap"]]}]}]}`, exp: `{"results":[{"statement_id":0,"series":[{"name":"where_events","columns":["time","foo"],"values":[["2009-11-10T23:00:02Z","bar"],["2009-11-10T23:00:03Z","baz"],["2009-11-10T23:00:04Z","bat"],["2009-11-10T23:00:05Z","bar"],["2009-11-10T23:00:06Z","bap"]]}]}]}`,
}, },
&Query{
name: "where on tag that should be double quoted but isn't",
params: url.Values{"db": []string{"db0"}},
command: `show series where data-center = 'foo'`,
exp: `{"results":[{"statement_id":0,"error":"invalid tag comparison operator"}]}`,
},
&Query{ &Query{
name: "where comparing tag and field", name: "where comparing tag and field",
params: url.Values{"db": []string{"db0"}}, params: url.Values{"db": []string{"db0"}},
@ -7040,18 +7034,6 @@ func TestServer_Query_ShowSeries(t *testing.T) {
exp: `{"results":[{"statement_id":0,"series":[{"columns":["key"],"values":[["cpu,host=server01,region=useast"],["cpu,host=server02,region=useast"]]}]}]}`, exp: `{"results":[{"statement_id":0,"series":[{"columns":["key"],"values":[["cpu,host=server01,region=useast"],["cpu,host=server02,region=useast"]]}]}]}`,
params: url.Values{"db": []string{"db0"}}, params: url.Values{"db": []string{"db0"}},
}, },
&Query{
name: `show series with WHERE time should fail`,
command: "SHOW SERIES WHERE time > now() - 1h",
exp: `{"results":[{"statement_id":0,"error":"SHOW SERIES doesn't support time in WHERE clause"}]}`,
params: url.Values{"db": []string{"db0"}},
},
&Query{
name: `show series with WHERE field should fail`,
command: "SHOW SERIES WHERE value > 10.0",
exp: `{"results":[{"statement_id":0,"error":"invalid tag comparison operator"}]}`,
params: url.Values{"db": []string{"db0"}},
},
}...) }...)
for i, query := range test.queries { for i, query := range test.queries {
@ -7267,13 +7249,7 @@ func TestServer_Query_ShowMeasurements(t *testing.T) {
&Query{ &Query{
name: `show measurements where tag does not match a regular expression`, name: `show measurements where tag does not match a regular expression`,
command: "SHOW MEASUREMENTS WHERE region !~ /ca.*/", command: "SHOW MEASUREMENTS WHERE region !~ /ca.*/",
exp: `{"results":[{"statement_id":0,"series":[{"name":"measurements","columns":["name"],"values":[["cpu"]]}]}]}`, exp: `{"results":[{"statement_id":0,"series":[{"name":"measurements","columns":["name"],"values":[["cpu"],["gpu"]]}]}]}`,
params: url.Values{"db": []string{"db0"}},
},
&Query{
name: `show measurements with time in WHERE clauses errors`,
command: `SHOW MEASUREMENTS WHERE time > now() - 1h`,
exp: `{"results":[{"statement_id":0,"error":"SHOW MEASUREMENTS doesn't support time in WHERE clause"}]}`,
params: url.Values{"db": []string{"db0"}}, params: url.Values{"db": []string{"db0"}},
}, },
}...) }...)
@ -7433,12 +7409,6 @@ func TestServer_Query_ShowTagKeys(t *testing.T) {
exp: `{"results":[{"statement_id":0}]}`, exp: `{"results":[{"statement_id":0}]}`,
params: url.Values{"db": []string{"db0"}}, params: url.Values{"db": []string{"db0"}},
}, },
&Query{
name: "show tag keys with time in WHERE clause errors",
command: "SHOW TAG KEYS FROM cpu WHERE time > now() - 1h",
exp: `{"results":[{"statement_id":0,"error":"SHOW TAG KEYS doesn't support time in WHERE clause"}]}`,
params: url.Values{"db": []string{"db0"}},
},
&Query{ &Query{
name: "show tag values with key", name: "show tag values with key",
command: "SHOW TAG VALUES WITH KEY = host", command: "SHOW TAG VALUES WITH KEY = host",
@ -7629,12 +7599,6 @@ func TestServer_Query_ShowTagKeyCardinality(t *testing.T) {
exp: `{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["count"],"values":[[2]]},{"name":"gpu","columns":["count"],"values":[[2]]}]}]}`, exp: `{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["count"],"values":[[2]]},{"name":"gpu","columns":["count"],"values":[[2]]}]}]}`,
params: url.Values{"db": []string{"db0"}}, params: url.Values{"db": []string{"db0"}},
}, },
&Query{
name: `show tag values cardinality with key and time in WHERE clause should error`,
command: `SHOW TAG VALUES CARDINALITY WITH KEY = host WHERE time > now() - 1h`,
exp: `{"results":[{"statement_id":0,"error":"SHOW TAG VALUES CARDINALITY doesn't support time in WHERE clause"}]}`,
params: url.Values{"db": []string{"db0"}},
},
}...) }...)
for i, query := range test.queries { for i, query := range test.queries {

View File

@ -1961,6 +1961,9 @@ func (e *Engine) createVarRefSeriesIterator(ref *influxql.VarRef, name string, s
// If it's only auxiliary fields then it doesn't matter what type of iterator we use. // If it's only auxiliary fields then it doesn't matter what type of iterator we use.
if ref == nil { if ref == nil {
if opt.StripName {
name = ""
}
return newFloatIterator(name, tags, itrOpt, nil, aux, conds, condNames), nil return newFloatIterator(name, tags, itrOpt, nil, aux, conds, condNames), nil
} }
@ -1974,8 +1977,8 @@ func (e *Engine) createVarRefSeriesIterator(ref *influxql.VarRef, name string, s
return nil, nil return nil, nil
} }
// Remove measurement name if we are selecting the name. // Remove name if requested.
if ref.Val == "_name" { if opt.StripName {
name = "" name = ""
} }