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 }