github.com/influxdata/influxdb/v2@v2.7.6/influxql/query/statement_rewriter_test.go (about)

     1  package query_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/influxdata/influxdb/v2/influxql/query"
     7  	"github.com/influxdata/influxql"
     8  )
     9  
    10  func TestRewriteStatement(t *testing.T) {
    11  	tests := []struct {
    12  		stmt string
    13  		s    string
    14  	}{
    15  		{
    16  			stmt: `SHOW FIELD KEYS`,
    17  			s:    `SELECT fieldKey, fieldType FROM _fieldKeys`,
    18  		},
    19  		{
    20  			stmt: `SHOW FIELD KEYS ON db0`,
    21  			s:    `SELECT fieldKey, fieldType FROM db0.._fieldKeys`,
    22  		},
    23  		{
    24  			stmt: `SHOW FIELD KEYS FROM cpu`,
    25  			s:    `SELECT fieldKey, fieldType FROM _fieldKeys WHERE _name = 'cpu'`,
    26  		},
    27  		{
    28  			stmt: `SHOW FIELD KEYS ON db0 FROM cpu`,
    29  			s:    `SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name = 'cpu'`,
    30  		},
    31  		{
    32  			stmt: `SHOW FIELD KEYS FROM /c.*/`,
    33  			s:    `SELECT fieldKey, fieldType FROM _fieldKeys WHERE _name =~ /c.*/`,
    34  		},
    35  		{
    36  			stmt: `SHOW FIELD KEYS ON db0 FROM /c.*/`,
    37  			s:    `SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name =~ /c.*/`,
    38  		},
    39  		{
    40  			stmt: `SHOW FIELD KEYS FROM mydb.myrp2.cpu`,
    41  			s:    `SELECT fieldKey, fieldType FROM mydb.myrp2._fieldKeys WHERE _name = 'cpu'`,
    42  		},
    43  		{
    44  			stmt: `SHOW FIELD KEYS ON db0 FROM mydb.myrp2.cpu`,
    45  			s:    `SELECT fieldKey, fieldType FROM mydb.myrp2._fieldKeys WHERE _name = 'cpu'`,
    46  		},
    47  		{
    48  			stmt: `SHOW FIELD KEYS FROM mydb.myrp2./c.*/`,
    49  			s:    `SELECT fieldKey, fieldType FROM mydb.myrp2._fieldKeys WHERE _name =~ /c.*/`,
    50  		},
    51  		{
    52  			stmt: `SHOW FIELD KEYS ON db0 FROM mydb.myrp2./c.*/`,
    53  			s:    `SELECT fieldKey, fieldType FROM mydb.myrp2._fieldKeys WHERE _name =~ /c.*/`,
    54  		},
    55  		{
    56  			stmt: "SHOW FIELD KEY CARDINALITY",
    57  			s:    "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM _fieldKeys WHERE _name =~ /.+/)",
    58  		},
    59  		{
    60  			stmt: "SHOW FIELD KEY CARDINALITY ON db0",
    61  			s:    "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name =~ /.+/)",
    62  		},
    63  		{
    64  			stmt: "SHOW FIELD KEY CARDINALITY ON db0 FROM /tsm1.*/",
    65  			s:    "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name =~ /tsm1.*/)",
    66  		},
    67  		{
    68  			stmt: "SHOW FIELD KEY CARDINALITY ON db0 FROM /tsm1.*/ WHERE 1 = 1",
    69  			s:    "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name =~ /tsm1.*/) WHERE 1 = 1",
    70  		},
    71  		{
    72  			stmt: `SHOW SERIES`,
    73  			s:    `SELECT "key" FROM _series`,
    74  		},
    75  		{
    76  			stmt: `SHOW SERIES ON db0`,
    77  			s:    `SELECT "key" FROM db0.._series`,
    78  		},
    79  		{
    80  			stmt: `SHOW SERIES FROM cpu`,
    81  			s:    `SELECT "key" FROM _series WHERE _name = 'cpu'`,
    82  		},
    83  		{
    84  			stmt: `SHOW SERIES ON db0 FROM cpu`,
    85  			s:    `SELECT "key" FROM db0.._series WHERE _name = 'cpu'`,
    86  		},
    87  		{
    88  			stmt: `SHOW SERIES FROM mydb.myrp1.cpu`,
    89  			s:    `SELECT "key" FROM mydb.myrp1._series WHERE _name = 'cpu'`,
    90  		},
    91  		{
    92  			stmt: `SHOW SERIES ON db0 FROM mydb.myrp1.cpu`,
    93  			s:    `SELECT "key" FROM mydb.myrp1._series WHERE _name = 'cpu'`,
    94  		},
    95  		{
    96  			stmt: `SHOW SERIES FROM mydb.myrp1./c.*/`,
    97  			s:    `SELECT "key" FROM mydb.myrp1._series WHERE _name =~ /c.*/`,
    98  		},
    99  		{
   100  			stmt: `SHOW SERIES FROM mydb.myrp1./c.*/ WHERE region = 'uswest'`,
   101  			s:    `SELECT "key" FROM mydb.myrp1._series WHERE (_name =~ /c.*/) AND (region = 'uswest')`,
   102  		},
   103  		{
   104  			stmt: `SHOW SERIES ON db0 FROM mydb.myrp1./c.*/`,
   105  			s:    `SELECT "key" FROM mydb.myrp1._series WHERE _name =~ /c.*/`,
   106  		},
   107  		{
   108  			stmt: `SHOW SERIES WHERE time > 0`,
   109  			s:    `SELECT _seriesKey AS "key" FROM /.+/ WHERE time > 0`,
   110  		},
   111  		{
   112  			stmt: `SHOW SERIES ON db0 WHERE time > 0`,
   113  			s:    `SELECT _seriesKey AS "key" FROM db0../.+/ WHERE time > 0`,
   114  		},
   115  		{
   116  			stmt: `SHOW SERIES FROM cpu WHERE time > 0`,
   117  			s:    `SELECT _seriesKey AS "key" FROM cpu WHERE time > 0`,
   118  		},
   119  		{
   120  			stmt: `SHOW SERIES ON db0 FROM cpu WHERE time > 0`,
   121  			s:    `SELECT _seriesKey AS "key" FROM db0..cpu WHERE time > 0`,
   122  		},
   123  		{
   124  			stmt: `SHOW SERIES FROM mydb.myrp1.cpu WHERE time > 0`,
   125  			s:    `SELECT _seriesKey AS "key" FROM mydb.myrp1.cpu WHERE time > 0`,
   126  		},
   127  		{
   128  			stmt: `SHOW SERIES ON db0 FROM mydb.myrp1.cpu WHERE time > 0`,
   129  			s:    `SELECT _seriesKey AS "key" FROM mydb.myrp1.cpu WHERE time > 0`,
   130  		},
   131  		{
   132  			stmt: `SHOW SERIES FROM mydb.myrp1./c.*/ WHERE time > 0`,
   133  			s:    `SELECT _seriesKey AS "key" FROM mydb.myrp1./c.*/ WHERE time > 0`,
   134  		},
   135  		{
   136  			stmt: `SHOW SERIES FROM mydb.myrp1./c.*/ WHERE region = 'uswest' AND time > 0`,
   137  			s:    `SELECT _seriesKey AS "key" FROM mydb.myrp1./c.*/ WHERE region = 'uswest' AND time > 0`,
   138  		},
   139  		{
   140  			stmt: `SHOW SERIES ON db0 FROM mydb.myrp1./c.*/ WHERE time > 0`,
   141  			s:    `SELECT _seriesKey AS "key" FROM mydb.myrp1./c.*/ WHERE time > 0`,
   142  		},
   143  		{
   144  			stmt: `SHOW SERIES CARDINALITY FROM m`,
   145  			s:    `SELECT count(distinct(_seriesKey)) AS count FROM m`,
   146  		},
   147  		{
   148  			stmt: `SHOW SERIES EXACT CARDINALITY`,
   149  			s:    `SELECT count(distinct(_seriesKey)) AS count FROM /.+/`,
   150  		},
   151  		{
   152  			stmt: `SHOW SERIES EXACT CARDINALITY FROM m`,
   153  			s:    `SELECT count(distinct(_seriesKey)) AS count FROM m`,
   154  		},
   155  		{
   156  			stmt: `SHOW TAG KEYS`,
   157  			s:    `SHOW TAG KEYS`,
   158  		},
   159  		{
   160  			stmt: `SHOW TAG KEYS ON db0`,
   161  			s:    `SHOW TAG KEYS ON db0`,
   162  		},
   163  		{
   164  			stmt: `SHOW TAG KEYS FROM cpu`,
   165  			s:    `SHOW TAG KEYS WHERE _name = 'cpu'`,
   166  		},
   167  		{
   168  			stmt: `SHOW TAG KEYS ON db0 FROM cpu`,
   169  			s:    `SHOW TAG KEYS ON db0 WHERE _name = 'cpu'`,
   170  		},
   171  		{
   172  			stmt: `SHOW TAG KEYS FROM /c.*/`,
   173  			s:    `SHOW TAG KEYS WHERE _name =~ /c.*/`,
   174  		},
   175  		{
   176  			stmt: `SHOW TAG KEYS ON db0 FROM /c.*/`,
   177  			s:    `SHOW TAG KEYS ON db0 WHERE _name =~ /c.*/`,
   178  		},
   179  		{
   180  			stmt: `SHOW TAG KEYS FROM cpu WHERE region = 'uswest'`,
   181  			s:    `SHOW TAG KEYS WHERE (_name = 'cpu') AND (region = 'uswest')`,
   182  		},
   183  		{
   184  			stmt: `SHOW TAG KEYS ON db0 FROM cpu WHERE region = 'uswest'`,
   185  			s:    `SHOW TAG KEYS ON db0 WHERE (_name = 'cpu') AND (region = 'uswest')`,
   186  		},
   187  		{
   188  			stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu`,
   189  			s:    `SHOW TAG KEYS WHERE _name = 'cpu'`,
   190  		},
   191  		{
   192  			stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu`,
   193  			s:    `SHOW TAG KEYS ON db0 WHERE _name = 'cpu'`,
   194  		},
   195  		{
   196  			stmt: `SHOW TAG KEYS FROM mydb.myrp1./c.*/`,
   197  			s:    `SHOW TAG KEYS WHERE _name =~ /c.*/`,
   198  		},
   199  		{
   200  			stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1./c.*/`,
   201  			s:    `SHOW TAG KEYS ON db0 WHERE _name =~ /c.*/`,
   202  		},
   203  		{
   204  			stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu WHERE region = 'uswest'`,
   205  			s:    `SHOW TAG KEYS WHERE (_name = 'cpu') AND (region = 'uswest')`,
   206  		},
   207  		{
   208  			stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu WHERE region = 'uswest'`,
   209  			s:    `SHOW TAG KEYS ON db0 WHERE (_name = 'cpu') AND (region = 'uswest')`,
   210  		},
   211  		{
   212  			stmt: `SHOW TAG KEYS WHERE time > 0`,
   213  			s:    `SHOW TAG KEYS WHERE time > 0`,
   214  		},
   215  		{
   216  			stmt: `SHOW TAG KEYS ON db0 WHERE time > 0`,
   217  			s:    `SHOW TAG KEYS ON db0 WHERE time > 0`,
   218  		},
   219  		{
   220  			stmt: `SHOW TAG KEYS FROM cpu WHERE time > 0`,
   221  			s:    `SHOW TAG KEYS WHERE (_name = 'cpu') AND (time > 0)`,
   222  		},
   223  		{
   224  			stmt: `SHOW TAG KEYS ON db0 FROM cpu WHERE time > 0`,
   225  			s:    `SHOW TAG KEYS ON db0 WHERE (_name = 'cpu') AND (time > 0)`,
   226  		},
   227  		{
   228  			stmt: `SHOW TAG KEYS FROM /c.*/ WHERE time > 0`,
   229  			s:    `SHOW TAG KEYS WHERE (_name =~ /c.*/) AND (time > 0)`,
   230  		},
   231  		{
   232  			stmt: `SHOW TAG KEYS ON db0 FROM /c.*/ WHERE time > 0`,
   233  			s:    `SHOW TAG KEYS ON db0 WHERE (_name =~ /c.*/) AND (time > 0)`,
   234  		},
   235  		{
   236  			stmt: `SHOW TAG KEYS FROM cpu WHERE region = 'uswest' AND time > 0`,
   237  			s:    `SHOW TAG KEYS WHERE (_name = 'cpu') AND (region = 'uswest' AND time > 0)`,
   238  		},
   239  		{
   240  			stmt: `SHOW TAG KEYS ON db0 FROM cpu WHERE region = 'uswest' AND time > 0`,
   241  			s:    `SHOW TAG KEYS ON db0 WHERE (_name = 'cpu') AND (region = 'uswest' AND time > 0)`,
   242  		},
   243  		{
   244  			stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu WHERE time > 0`,
   245  			s:    `SHOW TAG KEYS WHERE (_name = 'cpu') AND (time > 0)`,
   246  		},
   247  		{
   248  			stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu WHERE time > 0`,
   249  			s:    `SHOW TAG KEYS ON db0 WHERE (_name = 'cpu') AND (time > 0)`,
   250  		},
   251  		{
   252  			stmt: `SHOW TAG KEYS FROM mydb.myrp1./c.*/ WHERE time > 0`,
   253  			s:    `SHOW TAG KEYS WHERE (_name =~ /c.*/) AND (time > 0)`,
   254  		},
   255  		{
   256  			stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1./c.*/ WHERE time > 0`,
   257  			s:    `SHOW TAG KEYS ON db0 WHERE (_name =~ /c.*/) AND (time > 0)`,
   258  		},
   259  		{
   260  			stmt: `SHOW TAG KEYS FROM mydb.myrp1.cpu WHERE region = 'uswest' AND time > 0`,
   261  			s:    `SHOW TAG KEYS WHERE (_name = 'cpu') AND (region = 'uswest' AND time > 0)`,
   262  		},
   263  		{
   264  			stmt: `SHOW TAG KEYS ON db0 FROM mydb.myrp1.cpu WHERE region = 'uswest' AND time > 0`,
   265  			s:    `SHOW TAG KEYS ON db0 WHERE (_name = 'cpu') AND (region = 'uswest' AND time > 0)`,
   266  		},
   267  		{
   268  			stmt: `SHOW TAG VALUES WITH KEY = "region"`,
   269  			s:    `SHOW TAG VALUES WITH KEY = region WHERE _tagKey = 'region'`,
   270  		},
   271  		{
   272  			stmt: `SHOW TAG VALUES WITH KEY = "region" WHERE "region" = 'uswest'`,
   273  			s:    `SHOW TAG VALUES WITH KEY = region WHERE (region = 'uswest') AND (_tagKey = 'region')`,
   274  		},
   275  		{
   276  			stmt: `SHOW TAG VALUES WITH KEY IN ("region", "server") WHERE "platform" = 'cloud'`,
   277  			s:    `SHOW TAG VALUES WITH KEY IN (region, server) WHERE (platform = 'cloud') AND (_tagKey = 'region' OR _tagKey = 'server')`,
   278  		},
   279  		{
   280  			stmt: `SHOW TAG VALUES WITH KEY = "region" WHERE "region" = 'uswest' AND time > 0`,
   281  			s:    `SHOW TAG VALUES WITH KEY = region WHERE (region = 'uswest' AND time > 0) AND (_tagKey = 'region')`,
   282  		},
   283  		{
   284  			stmt: `SHOW TAG VALUES WITH KEY = "region" ON db0`,
   285  			s:    `SHOW TAG VALUES WITH KEY = region WHERE _tagKey = 'region'`,
   286  		},
   287  		{
   288  			stmt: `SHOW TAG VALUES FROM cpu WITH KEY = "region"`,
   289  			s:    `SHOW TAG VALUES WITH KEY = region WHERE (_name = 'cpu') AND (_tagKey = 'region')`,
   290  		},
   291  		{
   292  			stmt: `SHOW TAG VALUES WITH KEY != "region"`,
   293  			s:    `SHOW TAG VALUES WITH KEY != region WHERE _tagKey != 'region'`,
   294  		},
   295  		{
   296  			stmt: `SHOW TAG VALUES WITH KEY =~ /re.*/`,
   297  			s:    `SHOW TAG VALUES WITH KEY =~ /re.*/ WHERE _tagKey =~ /re.*/`,
   298  		},
   299  		{
   300  			stmt: `SHOW TAG VALUES WITH KEY =~ /re.*/ WHERE time > 0`,
   301  			s:    `SHOW TAG VALUES WITH KEY =~ /re.*/ WHERE (time > 0) AND (_tagKey =~ /re.*/)`,
   302  		},
   303  		{
   304  			stmt: `SHOW TAG VALUES WITH KEY !~ /re.*/`,
   305  			s:    `SHOW TAG VALUES WITH KEY !~ /re.*/ WHERE _tagKey !~ /re.*/`,
   306  		},
   307  		{
   308  			stmt: `SHOW TAG VALUES WITH KEY !~ /re.*/ LIMIT 1`,
   309  			s:    `SHOW TAG VALUES WITH KEY !~ /re.*/ WHERE _tagKey !~ /re.*/ LIMIT 1`,
   310  		},
   311  		{
   312  			stmt: `SHOW TAG VALUES WITH KEY !~ /re.*/ OFFSET 2`,
   313  			s:    `SHOW TAG VALUES WITH KEY !~ /re.*/ WHERE _tagKey !~ /re.*/ OFFSET 2`,
   314  		},
   315  		{
   316  			stmt: `SELECT value FROM cpu`,
   317  			s:    `SELECT value FROM cpu`,
   318  		},
   319  	}
   320  
   321  	for _, test := range tests {
   322  		t.Run(test.stmt, func(t *testing.T) {
   323  			stmt, err := influxql.ParseStatement(test.stmt)
   324  			if err != nil {
   325  				t.Errorf("error parsing statement: %s", err)
   326  			} else {
   327  				stmt, err = query.RewriteStatement(stmt)
   328  				if err != nil {
   329  					t.Errorf("error rewriting statement: %s", err)
   330  				} else if s := stmt.String(); s != test.s {
   331  					t.Errorf("error rendering string. expected %s, actual: %s", test.s, s)
   332  				}
   333  			}
   334  		})
   335  	}
   336  }