parser.go 82 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163
  1. package influxql
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "math"
  8. "regexp"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. const (
  14. // DateFormat represents the format for date literals.
  15. DateFormat = "2006-01-02"
  16. // DateTimeFormat represents the format for date time literals.
  17. DateTimeFormat = "2006-01-02 15:04:05.999999"
  18. )
  19. // Parser represents an InfluxQL parser.
  20. type Parser struct {
  21. s *bufScanner
  22. params map[string]Value
  23. }
  24. // NewParser returns a new instance of Parser.
  25. func NewParser(r io.Reader) *Parser {
  26. return &Parser{s: newBufScanner(r)}
  27. }
  28. // SetParams sets the parameters that will be used for any bound parameter substitutions.
  29. func (p *Parser) SetParams(params map[string]interface{}) {
  30. p.params = make(map[string]Value, len(params))
  31. for name, param := range params {
  32. p.params[name] = BindValue(param)
  33. }
  34. }
  35. // ParseQuery parses a query string and returns its AST representation.
  36. func ParseQuery(s string) (*Query, error) { return NewParser(strings.NewReader(s)).ParseQuery() }
  37. // ParseStatement parses a statement string and returns its AST representation.
  38. func ParseStatement(s string) (Statement, error) {
  39. return NewParser(strings.NewReader(s)).ParseStatement()
  40. }
  41. // MustParseStatement parses a statement string and returns its AST. Panic on error.
  42. func MustParseStatement(s string) Statement {
  43. stmt, err := ParseStatement(s)
  44. if err != nil {
  45. panic(err.Error())
  46. }
  47. return stmt
  48. }
  49. // ParseExpr parses an expression string and returns its AST representation.
  50. func ParseExpr(s string) (Expr, error) { return NewParser(strings.NewReader(s)).ParseExpr() }
  51. // MustParseExpr parses an expression string and returns its AST. Panic on error.
  52. func MustParseExpr(s string) Expr {
  53. expr, err := ParseExpr(s)
  54. if err != nil {
  55. panic(err.Error())
  56. }
  57. return expr
  58. }
  59. // ParseQuery parses an InfluxQL string and returns a Query AST object.
  60. func (p *Parser) ParseQuery() (*Query, error) {
  61. var statements Statements
  62. semi := true
  63. for {
  64. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok == EOF {
  65. return &Query{Statements: statements}, nil
  66. } else if tok == SEMICOLON {
  67. semi = true
  68. } else {
  69. if !semi {
  70. return nil, newParseError(tokstr(tok, lit), []string{";"}, pos)
  71. }
  72. p.Unscan()
  73. s, err := p.ParseStatement()
  74. if err != nil {
  75. return nil, err
  76. }
  77. statements = append(statements, s)
  78. semi = false
  79. }
  80. }
  81. }
  82. // ParseStatement parses an InfluxQL string and returns a Statement AST object.
  83. func (p *Parser) ParseStatement() (Statement, error) {
  84. return Language.Parse(p)
  85. }
  86. // parseSetPasswordUserStatement parses a string and returns a set statement.
  87. // This function assumes the SET token has already been consumed.
  88. func (p *Parser) parseSetPasswordUserStatement() (*SetPasswordUserStatement, error) {
  89. stmt := &SetPasswordUserStatement{}
  90. // Parse username
  91. ident, err := p.ParseIdent()
  92. if err != nil {
  93. return nil, err
  94. }
  95. stmt.Name = ident
  96. // Consume the required = token.
  97. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != EQ {
  98. return nil, newParseError(tokstr(tok, lit), []string{"="}, pos)
  99. }
  100. // Parse new user's password
  101. if ident, err = p.parseString(); err != nil {
  102. return nil, err
  103. }
  104. stmt.Password = ident
  105. return stmt, nil
  106. }
  107. // parseKillQueryStatement parses a string and returns a kill statement.
  108. // This function assumes the KILL token has already been consumed.
  109. func (p *Parser) parseKillQueryStatement() (*KillQueryStatement, error) {
  110. qid, err := p.ParseUInt64()
  111. if err != nil {
  112. return nil, err
  113. }
  114. var host string
  115. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  116. host, err = p.ParseIdent()
  117. if err != nil {
  118. return nil, err
  119. }
  120. } else {
  121. p.Unscan()
  122. }
  123. return &KillQueryStatement{QueryID: qid, Host: host}, nil
  124. }
  125. // parseCreateSubscriptionStatement parses a string and returns a CreateSubscriptionStatement.
  126. // This function assumes the "CREATE SUBSCRIPTION" tokens have already been consumed.
  127. func (p *Parser) parseCreateSubscriptionStatement() (*CreateSubscriptionStatement, error) {
  128. stmt := &CreateSubscriptionStatement{}
  129. // Read the id of the subscription to create.
  130. ident, err := p.ParseIdent()
  131. if err != nil {
  132. return nil, err
  133. }
  134. stmt.Name = ident
  135. // Expect an "ON" keyword.
  136. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != ON {
  137. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  138. }
  139. // Read the name of the database.
  140. if ident, err = p.ParseIdent(); err != nil {
  141. return nil, err
  142. }
  143. stmt.Database = ident
  144. if tok, pos, lit := p.Scan(); tok != DOT {
  145. return nil, newParseError(tokstr(tok, lit), []string{"."}, pos)
  146. }
  147. // Read the name of the retention policy.
  148. if ident, err = p.ParseIdent(); err != nil {
  149. return nil, err
  150. }
  151. stmt.RetentionPolicy = ident
  152. // Expect a "DESTINATIONS" keyword.
  153. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != DESTINATIONS {
  154. return nil, newParseError(tokstr(tok, lit), []string{"DESTINATIONS"}, pos)
  155. }
  156. // Expect one of "ANY ALL" keywords.
  157. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok == ALL || tok == ANY {
  158. stmt.Mode = tokens[tok]
  159. } else {
  160. return nil, newParseError(tokstr(tok, lit), []string{"ALL", "ANY"}, pos)
  161. }
  162. // Read list of destinations.
  163. var destinations []string
  164. if destinations, err = p.parseStringList(); err != nil {
  165. return nil, err
  166. }
  167. stmt.Destinations = destinations
  168. return stmt, nil
  169. }
  170. // parseCreateRetentionPolicyStatement parses a string and returns a create retention policy statement.
  171. // This function assumes the CREATE RETENTION POLICY tokens have already been consumed.
  172. func (p *Parser) parseCreateRetentionPolicyStatement() (*CreateRetentionPolicyStatement, error) {
  173. stmt := &CreateRetentionPolicyStatement{}
  174. // Parse the retention policy name.
  175. ident, err := p.ParseIdent()
  176. if err != nil {
  177. return nil, err
  178. }
  179. stmt.Name = ident
  180. // Consume the required ON token.
  181. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != ON {
  182. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  183. }
  184. // Parse the database name.
  185. ident, err = p.ParseIdent()
  186. if err != nil {
  187. return nil, err
  188. }
  189. stmt.Database = ident
  190. // Parse required DURATION token.
  191. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != DURATION {
  192. return nil, newParseError(tokstr(tok, lit), []string{"DURATION"}, pos)
  193. }
  194. // Parse duration value
  195. d, err := p.ParseDuration()
  196. if err != nil {
  197. return nil, err
  198. }
  199. stmt.Duration = d
  200. // Parse required REPLICATION token.
  201. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != REPLICATION {
  202. return nil, newParseError(tokstr(tok, lit), []string{"REPLICATION"}, pos)
  203. }
  204. // Parse replication value.
  205. n, err := p.ParseInt(1, math.MaxInt32)
  206. if err != nil {
  207. return nil, err
  208. }
  209. stmt.Replication = n
  210. // Parse optional SHARD token.
  211. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == SHARD {
  212. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != DURATION {
  213. return nil, newParseError(tokstr(tok, lit), []string{"DURATION"}, pos)
  214. }
  215. // Check to see if they used the INF keyword
  216. tok, pos, _ := p.ScanIgnoreWhitespace()
  217. if tok == INF {
  218. return nil, &ParseError{
  219. Message: "invalid duration INF for shard duration",
  220. Pos: pos,
  221. }
  222. }
  223. p.Unscan()
  224. d, err := p.ParseDuration()
  225. if err != nil {
  226. return nil, err
  227. }
  228. stmt.ShardGroupDuration = d
  229. } else {
  230. p.Unscan()
  231. }
  232. // Parse optional DEFAULT token.
  233. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == DEFAULT {
  234. stmt.Default = true
  235. } else {
  236. p.Unscan()
  237. }
  238. return stmt, nil
  239. }
  240. // parseAlterRetentionPolicyStatement parses a string and returns an alter retention policy statement.
  241. // This function assumes the ALTER RETENTION POLICY tokens have already been consumed.
  242. func (p *Parser) parseAlterRetentionPolicyStatement() (*AlterRetentionPolicyStatement, error) {
  243. stmt := &AlterRetentionPolicyStatement{}
  244. // Parse the retention policy name.
  245. tok, pos, lit := p.ScanIgnoreWhitespace()
  246. if tok == DEFAULT {
  247. stmt.Name = "default"
  248. } else if tok == IDENT {
  249. stmt.Name = lit
  250. } else {
  251. return nil, newParseError(tokstr(tok, lit), []string{"identifier"}, pos)
  252. }
  253. // Consume the required ON token.
  254. if tok, pos, lit = p.ScanIgnoreWhitespace(); tok != ON {
  255. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  256. }
  257. // Parse the database name.
  258. ident, err := p.ParseIdent()
  259. if err != nil {
  260. return nil, err
  261. }
  262. stmt.Database = ident
  263. // Loop through option tokens (DURATION, REPLICATION, SHARD DURATION, DEFAULT, etc.).
  264. found := make(map[Token]struct{})
  265. Loop:
  266. for {
  267. tok, pos, lit := p.ScanIgnoreWhitespace()
  268. if _, ok := found[tok]; ok {
  269. return nil, &ParseError{
  270. Message: fmt.Sprintf("found duplicate %s option", tok),
  271. Pos: pos,
  272. }
  273. }
  274. switch tok {
  275. case DURATION:
  276. d, err := p.ParseDuration()
  277. if err != nil {
  278. return nil, err
  279. }
  280. stmt.Duration = &d
  281. case REPLICATION:
  282. n, err := p.ParseInt(1, math.MaxInt32)
  283. if err != nil {
  284. return nil, err
  285. }
  286. stmt.Replication = &n
  287. case SHARD:
  288. tok, pos, lit := p.ScanIgnoreWhitespace()
  289. if tok == DURATION {
  290. // Check to see if they used the INF keyword
  291. tok, pos, _ := p.ScanIgnoreWhitespace()
  292. if tok == INF {
  293. return nil, &ParseError{
  294. Message: "invalid duration INF for shard duration",
  295. Pos: pos,
  296. }
  297. }
  298. p.Unscan()
  299. d, err := p.ParseDuration()
  300. if err != nil {
  301. return nil, err
  302. }
  303. stmt.ShardGroupDuration = &d
  304. } else {
  305. return nil, newParseError(tokstr(tok, lit), []string{"DURATION"}, pos)
  306. }
  307. case DEFAULT:
  308. stmt.Default = true
  309. default:
  310. if len(found) == 0 {
  311. return nil, newParseError(tokstr(tok, lit), []string{"DURATION", "REPLICATION", "SHARD", "DEFAULT"}, pos)
  312. }
  313. p.Unscan()
  314. break Loop
  315. }
  316. found[tok] = struct{}{}
  317. }
  318. return stmt, nil
  319. }
  320. // ParseInt parses a string representing a base 10 integer and returns the number.
  321. // It returns an error if the parsed number is outside the range [min, max].
  322. func (p *Parser) ParseInt(min, max int) (int, error) {
  323. tok, pos, lit := p.ScanIgnoreWhitespace()
  324. if tok != INTEGER {
  325. return 0, newParseError(tokstr(tok, lit), []string{"integer"}, pos)
  326. }
  327. // Convert string to int.
  328. n, err := strconv.Atoi(lit)
  329. if err != nil {
  330. return 0, &ParseError{Message: err.Error(), Pos: pos}
  331. } else if min > n || n > max {
  332. return 0, &ParseError{
  333. Message: fmt.Sprintf("invalid value %d: must be %d <= n <= %d", n, min, max),
  334. Pos: pos,
  335. }
  336. }
  337. return n, nil
  338. }
  339. // ParseUInt64 parses a string and returns a 64-bit unsigned integer literal.
  340. func (p *Parser) ParseUInt64() (uint64, error) {
  341. tok, pos, lit := p.ScanIgnoreWhitespace()
  342. if tok != INTEGER {
  343. return 0, newParseError(tokstr(tok, lit), []string{"integer"}, pos)
  344. }
  345. // Convert string to unsigned 64-bit integer
  346. n, err := strconv.ParseUint(lit, 10, 64)
  347. if err != nil {
  348. return 0, &ParseError{Message: err.Error(), Pos: pos}
  349. }
  350. return uint64(n), nil
  351. }
  352. // ParseDuration parses a string and returns a duration literal.
  353. // This function assumes the DURATION token has already been consumed.
  354. func (p *Parser) ParseDuration() (time.Duration, error) {
  355. tok, pos, lit := p.ScanIgnoreWhitespace()
  356. if tok != DURATIONVAL && tok != INF {
  357. return 0, newParseError(tokstr(tok, lit), []string{"duration"}, pos)
  358. }
  359. if tok == INF {
  360. return 0, nil
  361. }
  362. d, err := ParseDuration(lit)
  363. if err != nil {
  364. return 0, &ParseError{Message: err.Error(), Pos: pos}
  365. }
  366. return d, nil
  367. }
  368. // ParseIdent parses an identifier.
  369. func (p *Parser) ParseIdent() (string, error) {
  370. tok, pos, lit := p.ScanIgnoreWhitespace()
  371. if tok != IDENT {
  372. return "", newParseError(tokstr(tok, lit), []string{"identifier"}, pos)
  373. }
  374. return lit, nil
  375. }
  376. // ParseIdentList parses a comma delimited list of identifiers.
  377. func (p *Parser) ParseIdentList() ([]string, error) {
  378. // Parse first (required) identifier.
  379. ident, err := p.ParseIdent()
  380. if err != nil {
  381. return nil, err
  382. }
  383. idents := []string{ident}
  384. // Parse remaining (optional) identifiers.
  385. for {
  386. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != COMMA {
  387. p.Unscan()
  388. return idents, nil
  389. }
  390. if ident, err = p.ParseIdent(); err != nil {
  391. return nil, err
  392. }
  393. idents = append(idents, ident)
  394. }
  395. }
  396. // parseSegmentedIdents parses a segmented identifiers.
  397. // e.g., "db"."rp".measurement or "db"..measurement
  398. func (p *Parser) parseSegmentedIdents() ([]string, error) {
  399. ident, err := p.ParseIdent()
  400. if err != nil {
  401. return nil, err
  402. }
  403. idents := []string{ident}
  404. // Parse remaining (optional) identifiers.
  405. for {
  406. if tok, _, _ := p.Scan(); tok != DOT {
  407. // No more segments so we're done.
  408. p.Unscan()
  409. break
  410. }
  411. if ch := p.peekRune(); ch == '/' {
  412. // Next segment is a regex so we're done.
  413. break
  414. } else if ch == ':' {
  415. // Next segment is context-specific so let caller handle it.
  416. break
  417. } else if ch == '.' {
  418. // Add an empty identifier.
  419. idents = append(idents, "")
  420. continue
  421. }
  422. // Parse the next identifier.
  423. if ident, err = p.ParseIdent(); err != nil {
  424. return nil, err
  425. }
  426. idents = append(idents, ident)
  427. }
  428. if len(idents) > 3 {
  429. msg := fmt.Sprintf("too many segments in %s", QuoteIdent(idents...))
  430. return nil, &ParseError{Message: msg}
  431. }
  432. return idents, nil
  433. }
  434. // parseString parses a string.
  435. func (p *Parser) parseString() (string, error) {
  436. tok, pos, lit := p.ScanIgnoreWhitespace()
  437. if tok != STRING {
  438. return "", newParseError(tokstr(tok, lit), []string{"string"}, pos)
  439. }
  440. return lit, nil
  441. }
  442. // parseStringList parses a list of strings separated by commas.
  443. func (p *Parser) parseStringList() ([]string, error) {
  444. // Parse first (required) string.
  445. str, err := p.parseString()
  446. if err != nil {
  447. return nil, err
  448. }
  449. strs := []string{str}
  450. // Parse remaining (optional) strings.
  451. for {
  452. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != COMMA {
  453. p.Unscan()
  454. return strs, nil
  455. }
  456. if str, err = p.parseString(); err != nil {
  457. return nil, err
  458. }
  459. strs = append(strs, str)
  460. }
  461. }
  462. // parseRevokeStatement parses a string and returns a revoke statement.
  463. // This function assumes the REVOKE token has already been consumed.
  464. func (p *Parser) parseRevokeStatement() (Statement, error) {
  465. // Parse the privilege to be revoked.
  466. priv, err := p.parsePrivilege()
  467. if err != nil {
  468. return nil, err
  469. }
  470. // Check for ON or FROM clauses.
  471. tok, pos, lit := p.ScanIgnoreWhitespace()
  472. if tok == ON {
  473. stmt, err := p.parseRevokeOnStatement()
  474. if err != nil {
  475. return nil, err
  476. }
  477. stmt.Privilege = priv
  478. return stmt, nil
  479. } else if tok == FROM {
  480. // Admin privilege is only revoked on ALL PRIVILEGES.
  481. if priv != AllPrivileges {
  482. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  483. }
  484. return p.parseRevokeAdminStatement()
  485. }
  486. // Only ON or FROM clauses are allowed after privilege.
  487. if priv == AllPrivileges {
  488. return nil, newParseError(tokstr(tok, lit), []string{"ON", "FROM"}, pos)
  489. }
  490. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  491. }
  492. // parseRevokeOnStatement parses a string and returns a revoke statement.
  493. // This function assumes the [PRIVILEGE] ON tokens have already been consumed.
  494. func (p *Parser) parseRevokeOnStatement() (*RevokeStatement, error) {
  495. stmt := &RevokeStatement{}
  496. // Parse the name of the database.
  497. lit, err := p.ParseIdent()
  498. if err != nil {
  499. return nil, err
  500. }
  501. stmt.On = lit
  502. // Parse FROM clause.
  503. tok, pos, lit := p.ScanIgnoreWhitespace()
  504. // Check for required FROM token.
  505. if tok != FROM {
  506. return nil, newParseError(tokstr(tok, lit), []string{"FROM"}, pos)
  507. }
  508. // Parse the name of the user.
  509. lit, err = p.ParseIdent()
  510. if err != nil {
  511. return nil, err
  512. }
  513. stmt.User = lit
  514. return stmt, nil
  515. }
  516. // parseRevokeAdminStatement parses a string and returns a revoke admin statement.
  517. // This function assumes the ALL [PRVILEGES] FROM token has already been consumed.
  518. func (p *Parser) parseRevokeAdminStatement() (*RevokeAdminStatement, error) {
  519. // Admin privilege is always false when revoke admin clause is called.
  520. stmt := &RevokeAdminStatement{}
  521. // Parse the name of the user.
  522. lit, err := p.ParseIdent()
  523. if err != nil {
  524. return nil, err
  525. }
  526. stmt.User = lit
  527. return stmt, nil
  528. }
  529. // parseGrantStatement parses a string and returns a grant statement.
  530. // This function assumes the GRANT token has already been consumed.
  531. func (p *Parser) parseGrantStatement() (Statement, error) {
  532. // Parse the privilege to be granted.
  533. priv, err := p.parsePrivilege()
  534. if err != nil {
  535. return nil, err
  536. }
  537. // Check for ON or TO clauses.
  538. tok, pos, lit := p.ScanIgnoreWhitespace()
  539. if tok == ON {
  540. stmt, err := p.parseGrantOnStatement()
  541. if err != nil {
  542. return nil, err
  543. }
  544. stmt.Privilege = priv
  545. return stmt, nil
  546. } else if tok == TO {
  547. // Admin privilege is only granted on ALL PRIVILEGES.
  548. if priv != AllPrivileges {
  549. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  550. }
  551. return p.parseGrantAdminStatement()
  552. }
  553. // Only ON or TO clauses are allowed after privilege.
  554. if priv == AllPrivileges {
  555. return nil, newParseError(tokstr(tok, lit), []string{"ON", "TO"}, pos)
  556. }
  557. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  558. }
  559. // parseGrantOnStatement parses a string and returns a grant statement.
  560. // This function assumes the [PRIVILEGE] ON tokens have already been consumed.
  561. func (p *Parser) parseGrantOnStatement() (*GrantStatement, error) {
  562. stmt := &GrantStatement{}
  563. // Parse the name of the database.
  564. lit, err := p.ParseIdent()
  565. if err != nil {
  566. return nil, err
  567. }
  568. stmt.On = lit
  569. // Parse TO clause.
  570. tok, pos, lit := p.ScanIgnoreWhitespace()
  571. // Check for required TO token.
  572. if tok != TO {
  573. return nil, newParseError(tokstr(tok, lit), []string{"TO"}, pos)
  574. }
  575. // Parse the name of the user.
  576. lit, err = p.ParseIdent()
  577. if err != nil {
  578. return nil, err
  579. }
  580. stmt.User = lit
  581. return stmt, nil
  582. }
  583. // parseGrantAdminStatement parses a string and returns a grant admin statement.
  584. // This function assumes the ALL [PRVILEGES] TO tokens have already been consumed.
  585. func (p *Parser) parseGrantAdminStatement() (*GrantAdminStatement, error) {
  586. // Admin privilege is always true when grant admin clause is called.
  587. stmt := &GrantAdminStatement{}
  588. // Parse the name of the user.
  589. lit, err := p.ParseIdent()
  590. if err != nil {
  591. return nil, err
  592. }
  593. stmt.User = lit
  594. return stmt, nil
  595. }
  596. // parsePrivilege parses a string and returns a Privilege.
  597. func (p *Parser) parsePrivilege() (Privilege, error) {
  598. tok, pos, lit := p.ScanIgnoreWhitespace()
  599. switch tok {
  600. case READ:
  601. return ReadPrivilege, nil
  602. case WRITE:
  603. return WritePrivilege, nil
  604. case ALL:
  605. // Consume optional PRIVILEGES token
  606. tok, pos, lit = p.ScanIgnoreWhitespace()
  607. if tok != PRIVILEGES {
  608. p.Unscan()
  609. }
  610. return AllPrivileges, nil
  611. }
  612. return 0, newParseError(tokstr(tok, lit), []string{"READ", "WRITE", "ALL [PRIVILEGES]"}, pos)
  613. }
  614. // parseSelectStatement parses a select string and returns a Statement AST object.
  615. // This function assumes the SELECT token has already been consumed.
  616. func (p *Parser) parseSelectStatement(tr targetRequirement) (*SelectStatement, error) {
  617. stmt := &SelectStatement{}
  618. var err error
  619. // Parse fields: "FIELD+".
  620. if stmt.Fields, err = p.parseFields(); err != nil {
  621. return nil, err
  622. }
  623. // Parse target: "INTO"
  624. if stmt.Target, err = p.parseTarget(tr); err != nil {
  625. return nil, err
  626. }
  627. // Parse source: "FROM".
  628. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != FROM {
  629. return nil, newParseError(tokstr(tok, lit), []string{"FROM"}, pos)
  630. }
  631. if stmt.Sources, err = p.parseSources(true); err != nil {
  632. return nil, err
  633. }
  634. // Parse condition: "WHERE EXPR".
  635. if stmt.Condition, err = p.parseCondition(); err != nil {
  636. return nil, err
  637. }
  638. // Parse dimensions: "GROUP BY DIMENSION+".
  639. if stmt.Dimensions, err = p.parseDimensions(); err != nil {
  640. return nil, err
  641. }
  642. // Parse fill options: "fill(<option>)"
  643. if stmt.Fill, stmt.FillValue, err = p.parseFill(); err != nil {
  644. return nil, err
  645. }
  646. // Parse sort: "ORDER BY FIELD+".
  647. if stmt.SortFields, err = p.parseOrderBy(); err != nil {
  648. return nil, err
  649. }
  650. // Parse limit: "LIMIT <n>".
  651. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  652. return nil, err
  653. }
  654. // Parse offset: "OFFSET <n>".
  655. if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  656. return nil, err
  657. }
  658. // Parse series limit: "SLIMIT <n>".
  659. if stmt.SLimit, err = p.ParseOptionalTokenAndInt(SLIMIT); err != nil {
  660. return nil, err
  661. }
  662. // Parse series offset: "SOFFSET <n>".
  663. if stmt.SOffset, err = p.ParseOptionalTokenAndInt(SOFFSET); err != nil {
  664. return nil, err
  665. }
  666. // Parse timezone: "TZ(<timezone>)".
  667. if stmt.Location, err = p.parseLocation(); err != nil {
  668. return nil, err
  669. }
  670. // Set if the query is a raw data query or one with an aggregate
  671. stmt.IsRawQuery = true
  672. WalkFunc(stmt.Fields, func(n Node) {
  673. if _, ok := n.(*Call); ok {
  674. stmt.IsRawQuery = false
  675. }
  676. })
  677. return stmt, nil
  678. }
  679. // targetRequirement specifies whether or not a target clause is required.
  680. type targetRequirement int
  681. const (
  682. targetRequired targetRequirement = iota
  683. targetNotRequired
  684. targetSubquery
  685. )
  686. // parseTarget parses a string and returns a Target.
  687. func (p *Parser) parseTarget(tr targetRequirement) (*Target, error) {
  688. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != INTO {
  689. if tr == targetRequired {
  690. return nil, newParseError(tokstr(tok, lit), []string{"INTO"}, pos)
  691. }
  692. p.Unscan()
  693. return nil, nil
  694. }
  695. // db, rp, and / or measurement
  696. idents, err := p.parseSegmentedIdents()
  697. if err != nil {
  698. return nil, err
  699. }
  700. if len(idents) < 3 {
  701. // Check for source measurement reference.
  702. if ch := p.peekRune(); ch == ':' {
  703. if err := p.parseTokens([]Token{COLON, MEASUREMENT}); err != nil {
  704. return nil, err
  705. }
  706. // Append empty measurement name.
  707. idents = append(idents, "")
  708. }
  709. }
  710. t := &Target{Measurement: &Measurement{IsTarget: true}}
  711. switch len(idents) {
  712. case 1:
  713. t.Measurement.Name = idents[0]
  714. case 2:
  715. t.Measurement.RetentionPolicy = idents[0]
  716. t.Measurement.Name = idents[1]
  717. case 3:
  718. t.Measurement.Database = idents[0]
  719. t.Measurement.RetentionPolicy = idents[1]
  720. t.Measurement.Name = idents[2]
  721. }
  722. return t, nil
  723. }
  724. // parseDeleteStatement parses a string and returns a delete statement.
  725. // This function assumes the DELETE token has already been consumed.
  726. func (p *Parser) parseDeleteStatement() (Statement, error) {
  727. stmt := &DeleteSeriesStatement{}
  728. var err error
  729. tok, pos, lit := p.ScanIgnoreWhitespace()
  730. if tok == FROM {
  731. // Parse source.
  732. if stmt.Sources, err = p.parseSources(false); err != nil {
  733. return nil, err
  734. }
  735. var err error
  736. WalkFunc(stmt.Sources, func(n Node) {
  737. if t, ok := n.(*Measurement); ok {
  738. // Don't allow database or retention policy in from clause for delete
  739. // statement. They apply to the selected database across all retention
  740. // policies.
  741. if t.Database != "" {
  742. err = &ParseError{Message: "database not supported"}
  743. }
  744. if t.RetentionPolicy != "" {
  745. err = &ParseError{Message: "retention policy not supported"}
  746. }
  747. }
  748. })
  749. if err != nil {
  750. return nil, err
  751. }
  752. } else {
  753. p.Unscan()
  754. }
  755. // Parse condition: "WHERE EXPR".
  756. if stmt.Condition, err = p.parseCondition(); err != nil {
  757. return nil, err
  758. }
  759. // If they didn't provide a FROM or a WHERE, this query is invalid
  760. if stmt.Condition == nil && stmt.Sources == nil {
  761. return nil, newParseError(tokstr(tok, lit), []string{"FROM", "WHERE"}, pos)
  762. }
  763. return stmt, nil
  764. }
  765. // parseShowSeriesStatement parses a string and returns a Statement.
  766. // This function assumes the "SHOW SERIES" tokens have already been consumed.
  767. func (p *Parser) parseShowSeriesStatement() (Statement, error) {
  768. var exactCardinality bool
  769. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == EXACT {
  770. exactCardinality = true
  771. } else {
  772. p.Unscan()
  773. }
  774. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == CARDINALITY {
  775. return p.parseShowSeriesCardinalityStatement(exactCardinality)
  776. }
  777. p.Unscan()
  778. // Handle SHOW SERIES statments.
  779. stmt := &ShowSeriesStatement{}
  780. var err error
  781. // Parse optional ON clause.
  782. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  783. // Parse the database.
  784. stmt.Database, err = p.ParseIdent()
  785. if err != nil {
  786. return nil, err
  787. }
  788. } else {
  789. p.Unscan()
  790. }
  791. // Parse optional FROM.
  792. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  793. if stmt.Sources, err = p.parseSources(false); err != nil {
  794. return nil, err
  795. }
  796. } else {
  797. p.Unscan()
  798. }
  799. // Parse condition: "WHERE EXPR".
  800. if stmt.Condition, err = p.parseCondition(); err != nil {
  801. return nil, err
  802. }
  803. // Parse sort: "ORDER BY FIELD+".
  804. if stmt.SortFields, err = p.parseOrderBy(); err != nil {
  805. return nil, err
  806. }
  807. // Parse limit: "LIMIT <n>".
  808. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  809. return nil, err
  810. }
  811. // Parse offset: "OFFSET <n>".
  812. if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  813. return nil, err
  814. }
  815. return stmt, nil
  816. }
  817. // This function assumes the "SHOW SERIES EXACT CARDINALITY" or the
  818. // "SHOW SERIES CARDINALITY" tokens have already been consumed.
  819. func (p *Parser) parseShowSeriesCardinalityStatement(exact bool) (Statement, error) {
  820. var err error
  821. stmt := &ShowSeriesCardinalityStatement{Exact: exact}
  822. // Parse optional ON clause.
  823. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  824. if stmt.Database, err = p.ParseIdent(); err != nil {
  825. return nil, err
  826. }
  827. } else {
  828. p.Unscan()
  829. }
  830. // Parse optional FROM.
  831. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  832. if stmt.Sources, err = p.parseSources(false); err != nil {
  833. return nil, err
  834. }
  835. } else {
  836. p.Unscan()
  837. }
  838. // Parse condition: "WHERE EXPR".
  839. if stmt.Condition, err = p.parseCondition(); err != nil {
  840. return nil, err
  841. }
  842. // Parse dimensions: "GROUP BY DIMENSION+".
  843. if stmt.Dimensions, err = p.parseDimensions(); err != nil {
  844. return nil, err
  845. }
  846. // Parse limit & offset: "LIMIT <n>", "OFFSET <n>".
  847. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  848. return nil, err
  849. } else if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  850. return nil, err
  851. }
  852. return stmt, nil
  853. }
  854. // This function assumes the "SHOW MEASUREMENT" tokens have already been consumed.
  855. func (p *Parser) parseShowMeasurementCardinalityStatement(exact bool) (Statement, error) {
  856. stmt := &ShowMeasurementCardinalityStatement{Exact: exact}
  857. if stmt.Exact {
  858. // Parse remaining CARDINALITY token
  859. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != CARDINALITY {
  860. return nil, newParseError(tokstr(tok, lit), []string{"CARDINALITY"}, pos)
  861. }
  862. }
  863. // Parse optional ON clause.
  864. var err error
  865. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  866. if stmt.Database, err = p.ParseIdent(); err != nil {
  867. return nil, err
  868. }
  869. } else {
  870. p.Unscan()
  871. }
  872. // Parse optional FROM.
  873. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  874. if stmt.Sources, err = p.parseSources(false); err != nil {
  875. return nil, err
  876. }
  877. } else {
  878. p.Unscan()
  879. }
  880. // Parse condition: "WHERE EXPR".
  881. if stmt.Condition, err = p.parseCondition(); err != nil {
  882. return nil, err
  883. }
  884. // Parse dimensions: "GROUP BY DIMENSION+".
  885. if stmt.Dimensions, err = p.parseDimensions(); err != nil {
  886. return nil, err
  887. }
  888. // Parse limit & offset: "LIMIT <n>", "OFFSET <n>".
  889. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  890. return nil, err
  891. } else if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  892. return nil, err
  893. }
  894. return stmt, nil
  895. }
  896. // parseShowMeasurementsStatement parses a string and returns a Statement.
  897. // This function assumes the "SHOW MEASUREMENTS" tokens have already been consumed.
  898. func (p *Parser) parseShowMeasurementsStatement() (*ShowMeasurementsStatement, error) {
  899. stmt := &ShowMeasurementsStatement{}
  900. var err error
  901. // Parse optional ON clause.
  902. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  903. // Parse the database.
  904. stmt.Database, err = p.ParseIdent()
  905. if err != nil {
  906. return nil, err
  907. }
  908. } else {
  909. p.Unscan()
  910. }
  911. // Parse optional WITH clause.
  912. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == WITH {
  913. // Parse required MEASUREMENT token.
  914. if err := p.parseTokens([]Token{MEASUREMENT}); err != nil {
  915. return nil, err
  916. }
  917. // Parse required operator: = or =~.
  918. tok, pos, lit := p.ScanIgnoreWhitespace()
  919. switch tok {
  920. case EQ, EQREGEX:
  921. // Parse required source (measurement name or regex).
  922. if stmt.Source, err = p.parseSource(false); err != nil {
  923. return nil, err
  924. }
  925. default:
  926. return nil, newParseError(tokstr(tok, lit), []string{"=", "=~"}, pos)
  927. }
  928. } else {
  929. // Not a WITH clause so put the token back.
  930. p.Unscan()
  931. }
  932. // Parse condition: "WHERE EXPR".
  933. if stmt.Condition, err = p.parseCondition(); err != nil {
  934. return nil, err
  935. }
  936. // Parse sort: "ORDER BY FIELD+".
  937. if stmt.SortFields, err = p.parseOrderBy(); err != nil {
  938. return nil, err
  939. }
  940. // Parse limit: "LIMIT <n>".
  941. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  942. return nil, err
  943. }
  944. // Parse offset: "OFFSET <n>".
  945. if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  946. return nil, err
  947. }
  948. return stmt, nil
  949. }
  950. // parseShowQueriesStatement parses a string and returns a ShowQueriesStatement.
  951. // This function assumes the "SHOW QUERIES" tokens have been consumed.
  952. func (p *Parser) parseShowQueriesStatement() (*ShowQueriesStatement, error) {
  953. return &ShowQueriesStatement{}, nil
  954. }
  955. // parseShowRetentionPoliciesStatement parses a string and returns a ShowRetentionPoliciesStatement.
  956. // This function assumes the "SHOW RETENTION POLICIES" tokens have been consumed.
  957. func (p *Parser) parseShowRetentionPoliciesStatement() (*ShowRetentionPoliciesStatement, error) {
  958. stmt := &ShowRetentionPoliciesStatement{}
  959. // Expect an "ON" keyword.
  960. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  961. // Parse the database.
  962. ident, err := p.ParseIdent()
  963. if err != nil {
  964. return nil, err
  965. }
  966. stmt.Database = ident
  967. } else {
  968. p.Unscan()
  969. }
  970. return stmt, nil
  971. }
  972. // This function assumes the "SHOW TAG KEY" tokens have already been consumed.
  973. func (p *Parser) parseShowTagKeyCardinalityStatement() (Statement, error) {
  974. var err error
  975. var exactCardinality bool
  976. requiredTokens := []string{"EXACT", "CARDINALITY"}
  977. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == EXACT {
  978. exactCardinality = true
  979. requiredTokens = requiredTokens[1:]
  980. } else {
  981. p.Unscan()
  982. }
  983. stmt := &ShowTagKeyCardinalityStatement{Exact: exactCardinality}
  984. // Parse remaining CARDINALITY token
  985. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != CARDINALITY {
  986. return nil, newParseError(tokstr(tok, lit), requiredTokens, pos)
  987. }
  988. // Parse optional ON clause.
  989. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  990. if stmt.Database, err = p.ParseIdent(); err != nil {
  991. return nil, err
  992. }
  993. } else {
  994. p.Unscan()
  995. }
  996. // Parse optional FROM.
  997. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  998. if stmt.Sources, err = p.parseSources(false); err != nil {
  999. return nil, err
  1000. }
  1001. } else {
  1002. p.Unscan()
  1003. }
  1004. // Parse condition: "WHERE EXPR".
  1005. if stmt.Condition, err = p.parseCondition(); err != nil {
  1006. return nil, err
  1007. }
  1008. // Parse dimensions: "GROUP BY DIMENSION+".
  1009. if stmt.Dimensions, err = p.parseDimensions(); err != nil {
  1010. return nil, err
  1011. }
  1012. // Parse limit & offset: "LIMIT <n>", "OFFSET <n>".
  1013. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  1014. return nil, err
  1015. } else if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  1016. return nil, err
  1017. }
  1018. return stmt, nil
  1019. }
  1020. // parseShowTagKeysStatement parses a string and returns a Statement.
  1021. // This function assumes the "SHOW TAG KEYS" tokens have already been consumed.
  1022. func (p *Parser) parseShowTagKeysStatement() (*ShowTagKeysStatement, error) {
  1023. stmt := &ShowTagKeysStatement{}
  1024. var err error
  1025. // Parse optional ON clause.
  1026. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  1027. // Parse the database.
  1028. stmt.Database, err = p.ParseIdent()
  1029. if err != nil {
  1030. return nil, err
  1031. }
  1032. } else {
  1033. p.Unscan()
  1034. }
  1035. // Parse optional source.
  1036. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  1037. if stmt.Sources, err = p.parseSources(false); err != nil {
  1038. return nil, err
  1039. }
  1040. } else {
  1041. p.Unscan()
  1042. }
  1043. // Parse condition: "WHERE EXPR".
  1044. if stmt.Condition, err = p.parseCondition(); err != nil {
  1045. return nil, err
  1046. }
  1047. // Parse sort: "ORDER BY FIELD+".
  1048. if stmt.SortFields, err = p.parseOrderBy(); err != nil {
  1049. return nil, err
  1050. }
  1051. // Parse limit: "LIMIT <n>".
  1052. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  1053. return nil, err
  1054. }
  1055. // Parse offset: "OFFSET <n>".
  1056. if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  1057. return nil, err
  1058. }
  1059. // Parse series limit: "SLIMIT <n>".
  1060. if stmt.SLimit, err = p.ParseOptionalTokenAndInt(SLIMIT); err != nil {
  1061. return nil, err
  1062. }
  1063. // Parse series offset: "SOFFSET <n>".
  1064. if stmt.SOffset, err = p.ParseOptionalTokenAndInt(SOFFSET); err != nil {
  1065. return nil, err
  1066. }
  1067. return stmt, nil
  1068. }
  1069. // parseShowTagValuesStatement parses a string and returns a Statement.
  1070. // This function assumes the "SHOW TAG VALUES" tokens have already been consumed.
  1071. func (p *Parser) parseShowTagValuesStatement() (Statement, error) {
  1072. stmt := &ShowTagValuesStatement{}
  1073. var err error
  1074. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == EXACT {
  1075. return p.parseShowTagValuesCardinalityStatement(true)
  1076. } else if tok == CARDINALITY {
  1077. return p.parseShowTagValuesCardinalityStatement(false)
  1078. }
  1079. p.Unscan()
  1080. // Parse optional ON clause.
  1081. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  1082. // Parse the database.
  1083. stmt.Database, err = p.ParseIdent()
  1084. if err != nil {
  1085. return nil, err
  1086. }
  1087. } else {
  1088. p.Unscan()
  1089. }
  1090. // Parse optional source.
  1091. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  1092. if stmt.Sources, err = p.parseSources(false); err != nil {
  1093. return nil, err
  1094. }
  1095. } else {
  1096. p.Unscan()
  1097. }
  1098. // Parse required WITH KEY.
  1099. if stmt.Op, stmt.TagKeyExpr, err = p.parseTagKeyExpr(); err != nil {
  1100. return nil, err
  1101. }
  1102. // Parse condition: "WHERE EXPR".
  1103. if stmt.Condition, err = p.parseCondition(); err != nil {
  1104. return nil, err
  1105. }
  1106. // Parse sort: "ORDER BY FIELD+".
  1107. if stmt.SortFields, err = p.parseOrderBy(); err != nil {
  1108. return nil, err
  1109. }
  1110. // Parse limit: "LIMIT <n>".
  1111. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  1112. return nil, err
  1113. }
  1114. // Parse offset: "OFFSET <n>".
  1115. if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  1116. return nil, err
  1117. }
  1118. return stmt, nil
  1119. }
  1120. // This function assumes the "SHOW TAG VALUES" tokens have already been consumed.
  1121. func (p *Parser) parseShowTagValuesCardinalityStatement(exact bool) (Statement, error) {
  1122. var err error
  1123. stmt := &ShowTagValuesCardinalityStatement{Exact: exact}
  1124. if stmt.Exact {
  1125. // Parse remaining CARDINALITY token
  1126. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != CARDINALITY {
  1127. return nil, newParseError(tokstr(tok, lit), []string{"CARDINALITY"}, pos)
  1128. }
  1129. }
  1130. // Parse optional ON clause.
  1131. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  1132. if stmt.Database, err = p.ParseIdent(); err != nil {
  1133. return nil, err
  1134. }
  1135. } else {
  1136. p.Unscan()
  1137. }
  1138. // Parse optional FROM.
  1139. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  1140. if stmt.Sources, err = p.parseSources(false); err != nil {
  1141. return nil, err
  1142. }
  1143. } else {
  1144. p.Unscan()
  1145. }
  1146. // Parse required WITH KEY.
  1147. if stmt.Op, stmt.TagKeyExpr, err = p.parseTagKeyExpr(); err != nil {
  1148. return nil, err
  1149. }
  1150. // Parse condition: "WHERE EXPR".
  1151. if stmt.Condition, err = p.parseCondition(); err != nil {
  1152. return nil, err
  1153. }
  1154. // Parse dimensions: "GROUP BY DIMENSION+".
  1155. if stmt.Dimensions, err = p.parseDimensions(); err != nil {
  1156. return nil, err
  1157. }
  1158. // Parse limit & offset: "LIMIT <n>", "OFFSET <n>".
  1159. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  1160. return nil, err
  1161. } else if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  1162. return nil, err
  1163. }
  1164. return stmt, nil
  1165. }
  1166. // parseTagKeys parses a string and returns a list of tag keys.
  1167. func (p *Parser) parseTagKeyExpr() (Token, Literal, error) {
  1168. var err error
  1169. // Parse required WITH KEY tokens.
  1170. if err := p.parseTokens([]Token{WITH, KEY}); err != nil {
  1171. return 0, nil, err
  1172. }
  1173. // Parse required IN, EQ, or EQREGEX token.
  1174. tok, pos, lit := p.ScanIgnoreWhitespace()
  1175. if tok == IN {
  1176. // Parse required ( token.
  1177. if tok, pos, lit = p.ScanIgnoreWhitespace(); tok != LPAREN {
  1178. return 0, nil, newParseError(tokstr(tok, lit), []string{"("}, pos)
  1179. }
  1180. // Parse tag key list.
  1181. var tagKeys []string
  1182. if tagKeys, err = p.ParseIdentList(); err != nil {
  1183. return 0, nil, err
  1184. }
  1185. // Parse required ) token.
  1186. if tok, pos, lit = p.ScanIgnoreWhitespace(); tok != RPAREN {
  1187. return 0, nil, newParseError(tokstr(tok, lit), []string{")"}, pos)
  1188. }
  1189. return IN, &ListLiteral{Vals: tagKeys}, nil
  1190. } else if tok == EQ || tok == NEQ {
  1191. // Parse required tag key.
  1192. ident, err := p.ParseIdent()
  1193. if err != nil {
  1194. return 0, nil, err
  1195. }
  1196. return tok, &StringLiteral{Val: ident}, nil
  1197. } else if tok == EQREGEX || tok == NEQREGEX {
  1198. re, err := p.parseRegex()
  1199. if err != nil {
  1200. return 0, nil, err
  1201. } else if re == nil {
  1202. // parseRegex can return an empty type, but we need it to be present
  1203. tok, pos, lit := p.ScanIgnoreWhitespace()
  1204. return 0, nil, newParseError(tokstr(tok, lit), []string{"regex"}, pos)
  1205. }
  1206. return tok, re, nil
  1207. }
  1208. return 0, nil, newParseError(tokstr(tok, lit), []string{"IN", "=", "=~"}, pos)
  1209. }
  1210. // parseShowUsersStatement parses a string and returns a ShowUsersStatement.
  1211. // This function assumes the "SHOW USERS" tokens have been consumed.
  1212. func (p *Parser) parseShowUsersStatement() (*ShowUsersStatement, error) {
  1213. return &ShowUsersStatement{}, nil
  1214. }
  1215. // parseShowSubscriptionsStatement parses a string and returns a ShowSubscriptionsStatement
  1216. // This function assumes the "SHOW SUBSCRIPTIONS" tokens have been consumed.
  1217. func (p *Parser) parseShowSubscriptionsStatement() (*ShowSubscriptionsStatement, error) {
  1218. stmt := &ShowSubscriptionsStatement{}
  1219. return stmt, nil
  1220. }
  1221. // This function assumes the "SHOW FIELD KEY" tokens have already been consumed.
  1222. func (p *Parser) parseShowFieldKeyCardinalityStatement() (Statement, error) {
  1223. var err error
  1224. var exactCardinality bool
  1225. requiredTokens := []string{"EXACT", "CARDINALITY"}
  1226. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == EXACT {
  1227. exactCardinality = true
  1228. requiredTokens = requiredTokens[1:]
  1229. } else {
  1230. p.Unscan()
  1231. }
  1232. stmt := &ShowFieldKeyCardinalityStatement{Exact: exactCardinality}
  1233. // Parse remaining CARDINALITY token
  1234. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != CARDINALITY {
  1235. return nil, newParseError(tokstr(tok, lit), requiredTokens, pos)
  1236. }
  1237. // Parse optional ON clause.
  1238. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  1239. if stmt.Database, err = p.ParseIdent(); err != nil {
  1240. return nil, err
  1241. }
  1242. } else {
  1243. p.Unscan()
  1244. }
  1245. // Parse optional FROM.
  1246. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  1247. if stmt.Sources, err = p.parseSources(false); err != nil {
  1248. return nil, err
  1249. }
  1250. } else {
  1251. p.Unscan()
  1252. }
  1253. // Parse condition: "WHERE EXPR".
  1254. if stmt.Condition, err = p.parseCondition(); err != nil {
  1255. return nil, err
  1256. }
  1257. // Parse dimensions: "GROUP BY DIMENSION+".
  1258. if stmt.Dimensions, err = p.parseDimensions(); err != nil {
  1259. return nil, err
  1260. }
  1261. // Parse limit & offset: "LIMIT <n>", "OFFSET <n>".
  1262. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  1263. return nil, err
  1264. } else if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  1265. return nil, err
  1266. }
  1267. return stmt, nil
  1268. }
  1269. // parseShowFieldKeysStatement parses a string and returns a Statement.
  1270. // This function assumes the "SHOW FIELD KEYS" tokens have already been consumed.
  1271. func (p *Parser) parseShowFieldKeysStatement() (*ShowFieldKeysStatement, error) {
  1272. stmt := &ShowFieldKeysStatement{}
  1273. var err error
  1274. // Parse optional ON clause.
  1275. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ON {
  1276. // Parse the database.
  1277. stmt.Database, err = p.ParseIdent()
  1278. if err != nil {
  1279. return nil, err
  1280. }
  1281. } else {
  1282. p.Unscan()
  1283. }
  1284. // Parse optional source.
  1285. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FROM {
  1286. if stmt.Sources, err = p.parseSources(false); err != nil {
  1287. return nil, err
  1288. }
  1289. } else {
  1290. p.Unscan()
  1291. }
  1292. // Parse sort: "ORDER BY FIELD+".
  1293. if stmt.SortFields, err = p.parseOrderBy(); err != nil {
  1294. return nil, err
  1295. }
  1296. // Parse limit: "LIMIT <n>".
  1297. if stmt.Limit, err = p.ParseOptionalTokenAndInt(LIMIT); err != nil {
  1298. return nil, err
  1299. }
  1300. // Parse offset: "OFFSET <n>".
  1301. if stmt.Offset, err = p.ParseOptionalTokenAndInt(OFFSET); err != nil {
  1302. return nil, err
  1303. }
  1304. return stmt, nil
  1305. }
  1306. // parseDropMeasurementStatement parses a string and returns a DropMeasurementStatement.
  1307. // This function assumes the "DROP MEASUREMENT" tokens have already been consumed.
  1308. func (p *Parser) parseDropMeasurementStatement() (*DropMeasurementStatement, error) {
  1309. stmt := &DropMeasurementStatement{}
  1310. // Parse the name of the measurement to be dropped.
  1311. lit, err := p.ParseIdent()
  1312. if err != nil {
  1313. return nil, err
  1314. }
  1315. stmt.Name = lit
  1316. return stmt, nil
  1317. }
  1318. // parseDropSeriesStatement parses a string and returns a DropSeriesStatement.
  1319. // This function assumes the "DROP SERIES" tokens have already been consumed.
  1320. func (p *Parser) parseDropSeriesStatement() (*DropSeriesStatement, error) {
  1321. stmt := &DropSeriesStatement{}
  1322. var err error
  1323. tok, pos, lit := p.ScanIgnoreWhitespace()
  1324. if tok == FROM {
  1325. // Parse source.
  1326. if stmt.Sources, err = p.parseSources(false); err != nil {
  1327. return nil, err
  1328. }
  1329. var err error
  1330. WalkFunc(stmt.Sources, func(n Node) {
  1331. if t, ok := n.(*Measurement); ok {
  1332. // Don't allow database or retention policy in from clause for delete
  1333. // statement. They apply to the selected database across all retention
  1334. // policies.
  1335. if t.Database != "" {
  1336. err = &ParseError{Message: "database not supported"}
  1337. }
  1338. if t.RetentionPolicy != "" {
  1339. err = &ParseError{Message: "retention policy not supported"}
  1340. }
  1341. }
  1342. })
  1343. if err != nil {
  1344. return nil, err
  1345. }
  1346. } else {
  1347. p.Unscan()
  1348. }
  1349. // Parse condition: "WHERE EXPR".
  1350. if stmt.Condition, err = p.parseCondition(); err != nil {
  1351. return nil, err
  1352. }
  1353. // If they didn't provide a FROM or a WHERE, this query is invalid
  1354. if stmt.Condition == nil && stmt.Sources == nil {
  1355. return nil, newParseError(tokstr(tok, lit), []string{"FROM", "WHERE"}, pos)
  1356. }
  1357. return stmt, nil
  1358. }
  1359. // parseDropShardStatement parses a string and returns a
  1360. // DropShardStatement. This function assumes the "DROP SHARD" tokens
  1361. // have already been consumed.
  1362. func (p *Parser) parseDropShardStatement() (*DropShardStatement, error) {
  1363. var err error
  1364. stmt := &DropShardStatement{}
  1365. // Parse the ID of the shard to be dropped.
  1366. if stmt.ID, err = p.ParseUInt64(); err != nil {
  1367. return nil, err
  1368. }
  1369. return stmt, nil
  1370. }
  1371. // parseShowContinuousQueriesStatement parses a string and returns a ShowContinuousQueriesStatement.
  1372. // This function assumes the "SHOW CONTINUOUS" tokens have already been consumed.
  1373. func (p *Parser) parseShowContinuousQueriesStatement() (*ShowContinuousQueriesStatement, error) {
  1374. return &ShowContinuousQueriesStatement{}, nil
  1375. }
  1376. // parseGrantsForUserStatement parses a string and returns a ShowGrantsForUserStatement.
  1377. // This function assumes the "SHOW GRANTS" tokens have already been consumed.
  1378. func (p *Parser) parseGrantsForUserStatement() (*ShowGrantsForUserStatement, error) {
  1379. stmt := &ShowGrantsForUserStatement{}
  1380. // Parse the name of the user to be displayed.
  1381. lit, err := p.ParseIdent()
  1382. if err != nil {
  1383. return nil, err
  1384. }
  1385. stmt.Name = lit
  1386. return stmt, nil
  1387. }
  1388. // parseShowDatabasesStatement parses a string and returns a ShowDatabasesStatement.
  1389. // This function assumes the "SHOW DATABASE" tokens have already been consumed.
  1390. func (p *Parser) parseShowDatabasesStatement() (*ShowDatabasesStatement, error) {
  1391. return &ShowDatabasesStatement{}, nil
  1392. }
  1393. // parseCreateContinuousQueriesStatement parses a string and returns a CreateContinuousQueryStatement.
  1394. // This function assumes the "CREATE CONTINUOUS" tokens have already been consumed.
  1395. func (p *Parser) parseCreateContinuousQueryStatement() (*CreateContinuousQueryStatement, error) {
  1396. stmt := &CreateContinuousQueryStatement{}
  1397. // Read the id of the query to create.
  1398. ident, err := p.ParseIdent()
  1399. if err != nil {
  1400. return nil, err
  1401. }
  1402. stmt.Name = ident
  1403. // Expect an "ON" keyword.
  1404. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != ON {
  1405. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  1406. }
  1407. // Read the name of the database to create the query on.
  1408. if ident, err = p.ParseIdent(); err != nil {
  1409. return nil, err
  1410. }
  1411. stmt.Database = ident
  1412. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == RESAMPLE {
  1413. stmt.ResampleEvery, stmt.ResampleFor, err = p.parseResample()
  1414. if err != nil {
  1415. return nil, err
  1416. }
  1417. } else {
  1418. p.Unscan()
  1419. }
  1420. // Expect a "BEGIN SELECT" tokens.
  1421. if err := p.parseTokens([]Token{BEGIN, SELECT}); err != nil {
  1422. return nil, err
  1423. }
  1424. // Read the select statement to be used as the source.
  1425. source, err := p.parseSelectStatement(targetRequired)
  1426. if err != nil {
  1427. return nil, err
  1428. }
  1429. stmt.Source = source
  1430. // validate that the statement has a non-zero group by interval if it is aggregated
  1431. if !source.IsRawQuery {
  1432. d, err := source.GroupByInterval()
  1433. if d == 0 || err != nil {
  1434. // rewind so we can output an error with some info
  1435. p.Unscan() // Unscan the whitespace
  1436. p.Unscan() // Unscan the last token
  1437. tok, pos, lit := p.ScanIgnoreWhitespace()
  1438. expected := []string{"GROUP BY time(...)"}
  1439. if err != nil {
  1440. expected = append(expected, err.Error())
  1441. }
  1442. return nil, newParseError(tokstr(tok, lit), expected, pos)
  1443. }
  1444. }
  1445. // Expect a "END" keyword.
  1446. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != END {
  1447. return nil, newParseError(tokstr(tok, lit), []string{"END"}, pos)
  1448. }
  1449. if err := stmt.validate(); err != nil {
  1450. return nil, err
  1451. }
  1452. return stmt, nil
  1453. }
  1454. // parseCreateDatabaseStatement parses a string and returns a CreateDatabaseStatement.
  1455. // This function assumes the "CREATE DATABASE" tokens have already been consumed.
  1456. func (p *Parser) parseCreateDatabaseStatement() (*CreateDatabaseStatement, error) {
  1457. stmt := &CreateDatabaseStatement{}
  1458. // Parse the name of the database to be created.
  1459. lit, err := p.ParseIdent()
  1460. if err != nil {
  1461. return nil, err
  1462. }
  1463. stmt.Name = lit
  1464. // Look for "WITH"
  1465. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == WITH {
  1466. // validate that at least one of DURATION, NAME, REPLICATION or SHARD is provided
  1467. tok, pos, lit := p.ScanIgnoreWhitespace()
  1468. if tok != DURATION && tok != NAME && tok != REPLICATION && tok != SHARD {
  1469. return nil, newParseError(tokstr(tok, lit), []string{"DURATION", "NAME", "REPLICATION", "SHARD"}, pos)
  1470. }
  1471. // rewind
  1472. p.Unscan()
  1473. // mark statement as having a RetentionPolicyInfo defined
  1474. stmt.RetentionPolicyCreate = true
  1475. // Look for "DURATION"
  1476. if err := p.parseTokens([]Token{DURATION}); err != nil {
  1477. p.Unscan()
  1478. } else {
  1479. rpDuration, err := p.ParseDuration()
  1480. if err != nil {
  1481. return nil, err
  1482. }
  1483. stmt.RetentionPolicyDuration = &rpDuration
  1484. }
  1485. // Look for "REPLICATION"
  1486. if err := p.parseTokens([]Token{REPLICATION}); err != nil {
  1487. p.Unscan()
  1488. } else {
  1489. rpReplication, err := p.ParseInt(1, math.MaxInt32)
  1490. if err != nil {
  1491. return nil, err
  1492. }
  1493. stmt.RetentionPolicyReplication = &rpReplication
  1494. }
  1495. // Look for "SHARD"
  1496. if err := p.parseTokens([]Token{SHARD}); err != nil {
  1497. p.Unscan()
  1498. } else {
  1499. // Look for "DURATION"
  1500. tok, pos, lit := p.ScanIgnoreWhitespace()
  1501. if tok != DURATION {
  1502. return nil, newParseError(tokstr(tok, lit), []string{"DURATION"}, pos)
  1503. }
  1504. stmt.RetentionPolicyShardGroupDuration, err = p.ParseDuration()
  1505. if err != nil {
  1506. return nil, err
  1507. }
  1508. }
  1509. // Look for "NAME"
  1510. if err := p.parseTokens([]Token{NAME}); err != nil {
  1511. p.Unscan()
  1512. } else {
  1513. stmt.RetentionPolicyName, err = p.ParseIdent()
  1514. if err != nil {
  1515. return nil, err
  1516. }
  1517. }
  1518. } else {
  1519. p.Unscan()
  1520. }
  1521. return stmt, nil
  1522. }
  1523. // parseDropDatabaseStatement parses a string and returns a DropDatabaseStatement.
  1524. // This function assumes the DROP DATABASE tokens have already been consumed.
  1525. func (p *Parser) parseDropDatabaseStatement() (*DropDatabaseStatement, error) {
  1526. stmt := &DropDatabaseStatement{}
  1527. // Parse the name of the database to be dropped.
  1528. lit, err := p.ParseIdent()
  1529. if err != nil {
  1530. return nil, err
  1531. }
  1532. stmt.Name = lit
  1533. return stmt, nil
  1534. }
  1535. // parseDropSubscriptionStatement parses a string and returns a DropSubscriptionStatement.
  1536. // This function assumes the "DROP SUBSCRIPTION" tokens have already been consumed.
  1537. func (p *Parser) parseDropSubscriptionStatement() (*DropSubscriptionStatement, error) {
  1538. stmt := &DropSubscriptionStatement{}
  1539. // Read the id of the subscription to drop.
  1540. ident, err := p.ParseIdent()
  1541. if err != nil {
  1542. return nil, err
  1543. }
  1544. stmt.Name = ident
  1545. // Expect an "ON" keyword.
  1546. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != ON {
  1547. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  1548. }
  1549. // Read the name of the database.
  1550. if ident, err = p.ParseIdent(); err != nil {
  1551. return nil, err
  1552. }
  1553. stmt.Database = ident
  1554. if tok, pos, lit := p.Scan(); tok != DOT {
  1555. return nil, newParseError(tokstr(tok, lit), []string{"."}, pos)
  1556. }
  1557. // Read the name of the retention policy.
  1558. if ident, err = p.ParseIdent(); err != nil {
  1559. return nil, err
  1560. }
  1561. stmt.RetentionPolicy = ident
  1562. return stmt, nil
  1563. }
  1564. // parseDropRetentionPolicyStatement parses a string and returns a DropRetentionPolicyStatement.
  1565. // This function assumes the DROP RETENTION POLICY tokens have been consumed.
  1566. func (p *Parser) parseDropRetentionPolicyStatement() (*DropRetentionPolicyStatement, error) {
  1567. stmt := &DropRetentionPolicyStatement{}
  1568. // Parse the policy name.
  1569. ident, err := p.ParseIdent()
  1570. if err != nil {
  1571. return nil, err
  1572. }
  1573. stmt.Name = ident
  1574. // Consume the required ON token.
  1575. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != ON {
  1576. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  1577. }
  1578. // Parse the database name.
  1579. if stmt.Database, err = p.ParseIdent(); err != nil {
  1580. return nil, err
  1581. }
  1582. return stmt, nil
  1583. }
  1584. // parseCreateUserStatement parses a string and returns a CreateUserStatement.
  1585. // This function assumes the "CREATE USER" tokens have already been consumed.
  1586. func (p *Parser) parseCreateUserStatement() (*CreateUserStatement, error) {
  1587. stmt := &CreateUserStatement{}
  1588. // Parse name of the user to be created.
  1589. ident, err := p.ParseIdent()
  1590. if err != nil {
  1591. return nil, err
  1592. }
  1593. stmt.Name = ident
  1594. // Consume "WITH PASSWORD" tokens
  1595. if err := p.parseTokens([]Token{WITH, PASSWORD}); err != nil {
  1596. return nil, err
  1597. }
  1598. // Parse new user's password
  1599. if ident, err = p.parseString(); err != nil {
  1600. return nil, err
  1601. }
  1602. stmt.Password = ident
  1603. // Check for option WITH clause.
  1604. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != WITH {
  1605. p.Unscan()
  1606. return stmt, nil
  1607. }
  1608. // "WITH ALL PRIVILEGES" grants the new user admin privilege.
  1609. // Only admin privilege can be set on user creation.
  1610. if err := p.parseTokens([]Token{ALL, PRIVILEGES}); err != nil {
  1611. return nil, err
  1612. }
  1613. stmt.Admin = true
  1614. return stmt, nil
  1615. }
  1616. // parseDropUserStatement parses a string and returns a DropUserStatement.
  1617. // This function assumes the DROP USER tokens have already been consumed.
  1618. func (p *Parser) parseDropUserStatement() (*DropUserStatement, error) {
  1619. stmt := &DropUserStatement{}
  1620. // Parse the name of the user to be dropped.
  1621. lit, err := p.ParseIdent()
  1622. if err != nil {
  1623. return nil, err
  1624. }
  1625. stmt.Name = lit
  1626. return stmt, nil
  1627. }
  1628. // parseExplainStatement parses a string and return an ExplainStatement.
  1629. // This function assumes the EXPLAIN token has already been consumed.
  1630. func (p *Parser) parseExplainStatement() (*ExplainStatement, error) {
  1631. stmt := &ExplainStatement{}
  1632. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == ANALYZE {
  1633. stmt.Analyze = true
  1634. } else {
  1635. p.Unscan()
  1636. }
  1637. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != SELECT {
  1638. return nil, newParseError(tokstr(tok, lit), []string{"SELECT"}, pos)
  1639. }
  1640. s, err := p.parseSelectStatement(targetNotRequired)
  1641. if err != nil {
  1642. return nil, err
  1643. }
  1644. stmt.Statement = s
  1645. return stmt, nil
  1646. }
  1647. // parseShowShardGroupsStatement parses a string for "SHOW SHARD GROUPS" statement.
  1648. // This function assumes the "SHOW SHARD GROUPS" tokens have already been consumed.
  1649. func (p *Parser) parseShowShardGroupsStatement() (*ShowShardGroupsStatement, error) {
  1650. return &ShowShardGroupsStatement{}, nil
  1651. }
  1652. // parseShowShardsStatement parses a string for "SHOW SHARDS" statement.
  1653. // This function assumes the "SHOW SHARDS" tokens have already been consumed.
  1654. func (p *Parser) parseShowShardsStatement() (*ShowShardsStatement, error) {
  1655. return &ShowShardsStatement{}, nil
  1656. }
  1657. // parseShowStatsStatement parses a string and returns a ShowStatsStatement.
  1658. // This function assumes the "SHOW STATS" tokens have already been consumed.
  1659. func (p *Parser) parseShowStatsStatement() (*ShowStatsStatement, error) {
  1660. stmt := &ShowStatsStatement{}
  1661. var err error
  1662. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FOR {
  1663. stmt.Module, err = p.parseString()
  1664. } else {
  1665. p.Unscan()
  1666. }
  1667. return stmt, err
  1668. }
  1669. // parseShowDiagnostics parses a string and returns a ShowDiagnosticsStatement.
  1670. func (p *Parser) parseShowDiagnosticsStatement() (*ShowDiagnosticsStatement, error) {
  1671. stmt := &ShowDiagnosticsStatement{}
  1672. var err error
  1673. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FOR {
  1674. stmt.Module, err = p.parseString()
  1675. } else {
  1676. p.Unscan()
  1677. }
  1678. return stmt, err
  1679. }
  1680. // parseDropContinuousQueriesStatement parses a string and returns a DropContinuousQueryStatement.
  1681. // This function assumes the "DROP CONTINUOUS" tokens have already been consumed.
  1682. func (p *Parser) parseDropContinuousQueryStatement() (*DropContinuousQueryStatement, error) {
  1683. stmt := &DropContinuousQueryStatement{}
  1684. // Read the id of the query to drop.
  1685. ident, err := p.ParseIdent()
  1686. if err != nil {
  1687. return nil, err
  1688. }
  1689. stmt.Name = ident
  1690. // Expect an "ON" keyword.
  1691. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != ON {
  1692. return nil, newParseError(tokstr(tok, lit), []string{"ON"}, pos)
  1693. }
  1694. // Read the name of the database to remove the query from.
  1695. if ident, err = p.ParseIdent(); err != nil {
  1696. return nil, err
  1697. }
  1698. stmt.Database = ident
  1699. return stmt, nil
  1700. }
  1701. // parseFields parses a list of one or more fields.
  1702. func (p *Parser) parseFields() (Fields, error) {
  1703. var fields Fields
  1704. for {
  1705. // Parse the field.
  1706. f, err := p.parseField()
  1707. if err != nil {
  1708. return nil, err
  1709. }
  1710. // Add new field.
  1711. fields = append(fields, f)
  1712. // If there's not a comma next then stop parsing fields.
  1713. if tok, _, _ := p.Scan(); tok != COMMA {
  1714. p.Unscan()
  1715. break
  1716. }
  1717. }
  1718. return fields, nil
  1719. }
  1720. // parseField parses a single field.
  1721. func (p *Parser) parseField() (*Field, error) {
  1722. f := &Field{}
  1723. // Attempt to parse a regex.
  1724. re, err := p.parseRegex()
  1725. if err != nil {
  1726. return nil, err
  1727. } else if re != nil {
  1728. f.Expr = re
  1729. } else {
  1730. _, pos, _ := p.ScanIgnoreWhitespace()
  1731. p.Unscan()
  1732. // Parse the expression first.
  1733. expr, err := p.ParseExpr()
  1734. if err != nil {
  1735. return nil, err
  1736. }
  1737. var c validateField
  1738. Walk(&c, expr)
  1739. if c.foundInvalid {
  1740. return nil, fmt.Errorf("invalid operator %s in SELECT clause at line %d, char %d; operator is intended for WHERE clause", c.badToken, pos.Line+1, pos.Char+1)
  1741. }
  1742. f.Expr = expr
  1743. }
  1744. // Parse the alias if the current and next tokens are "WS AS".
  1745. alias, err := p.parseAlias()
  1746. if err != nil {
  1747. return nil, err
  1748. }
  1749. f.Alias = alias
  1750. // Consume all trailing whitespace.
  1751. p.consumeWhitespace()
  1752. return f, nil
  1753. }
  1754. // validateField checks if the Expr is a valid field. We disallow all binary expression
  1755. // that return a boolean.
  1756. type validateField struct {
  1757. foundInvalid bool
  1758. badToken Token
  1759. }
  1760. func (c *validateField) Visit(n Node) Visitor {
  1761. e, ok := n.(*BinaryExpr)
  1762. if !ok {
  1763. return c
  1764. }
  1765. switch e.Op {
  1766. case EQ, NEQ, EQREGEX,
  1767. NEQREGEX, LT, LTE, GT, GTE,
  1768. AND, OR:
  1769. c.foundInvalid = true
  1770. c.badToken = e.Op
  1771. return nil
  1772. }
  1773. return c
  1774. }
  1775. // parseAlias parses the "AS IDENT" alias for fields and dimensions.
  1776. func (p *Parser) parseAlias() (string, error) {
  1777. // Check if the next token is "AS". If not, then Unscan and exit.
  1778. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != AS {
  1779. p.Unscan()
  1780. return "", nil
  1781. }
  1782. // Then we should have the alias identifier.
  1783. lit, err := p.ParseIdent()
  1784. if err != nil {
  1785. return "", err
  1786. }
  1787. return lit, nil
  1788. }
  1789. // parseSources parses a comma delimited list of sources.
  1790. func (p *Parser) parseSources(subqueries bool) (Sources, error) {
  1791. var sources Sources
  1792. for {
  1793. s, err := p.parseSource(subqueries)
  1794. if err != nil {
  1795. return nil, err
  1796. }
  1797. sources = append(sources, s)
  1798. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != COMMA {
  1799. p.Unscan()
  1800. break
  1801. }
  1802. }
  1803. return sources, nil
  1804. }
  1805. // peekRune returns the next rune that would be read by the scanner.
  1806. func (p *Parser) peekRune() rune {
  1807. r, _, _ := p.s.s.r.ReadRune()
  1808. if r != eof {
  1809. _ = p.s.s.r.UnreadRune()
  1810. }
  1811. return r
  1812. }
  1813. func (p *Parser) parseSource(subqueries bool) (Source, error) {
  1814. m := &Measurement{}
  1815. // Attempt to parse a regex.
  1816. re, err := p.parseRegex()
  1817. if err != nil {
  1818. return nil, err
  1819. } else if re != nil {
  1820. m.Regex = re
  1821. // Regex is always last so we're done.
  1822. return m, nil
  1823. }
  1824. // If there is no regular expression, this might be a subquery.
  1825. // Parse the subquery if we are in a query that allows them as a source.
  1826. if m.Regex == nil && subqueries {
  1827. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == LPAREN {
  1828. if err := p.parseTokens([]Token{SELECT}); err != nil {
  1829. return nil, err
  1830. }
  1831. stmt, err := p.parseSelectStatement(targetSubquery)
  1832. if err != nil {
  1833. return nil, err
  1834. }
  1835. if err := p.parseTokens([]Token{RPAREN}); err != nil {
  1836. return nil, err
  1837. }
  1838. return &SubQuery{Statement: stmt}, nil
  1839. } else {
  1840. p.Unscan()
  1841. }
  1842. }
  1843. // Didn't find a regex so parse segmented identifiers.
  1844. idents, err := p.parseSegmentedIdents()
  1845. if err != nil {
  1846. return nil, err
  1847. }
  1848. // If we already have the max allowed idents, we're done.
  1849. if len(idents) == 3 {
  1850. m.Database, m.RetentionPolicy, m.Name = idents[0], idents[1], idents[2]
  1851. return m, nil
  1852. }
  1853. // Check again for regex.
  1854. re, err = p.parseRegex()
  1855. if err != nil {
  1856. return nil, err
  1857. } else if re != nil {
  1858. m.Regex = re
  1859. }
  1860. // Assign identifiers to their proper locations.
  1861. switch len(idents) {
  1862. case 1:
  1863. if re != nil {
  1864. m.RetentionPolicy = idents[0]
  1865. } else {
  1866. m.Name = idents[0]
  1867. }
  1868. case 2:
  1869. if re != nil {
  1870. m.Database, m.RetentionPolicy = idents[0], idents[1]
  1871. } else {
  1872. m.RetentionPolicy, m.Name = idents[0], idents[1]
  1873. }
  1874. }
  1875. return m, nil
  1876. }
  1877. // parseCondition parses the "WHERE" clause of the query, if it exists.
  1878. func (p *Parser) parseCondition() (Expr, error) {
  1879. // Check if the WHERE token exists.
  1880. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != WHERE {
  1881. p.Unscan()
  1882. return nil, nil
  1883. }
  1884. // Scan the identifier for the source.
  1885. expr, err := p.ParseExpr()
  1886. if err != nil {
  1887. return nil, err
  1888. }
  1889. return expr, nil
  1890. }
  1891. // parseDimensions parses the "GROUP BY" clause of the query, if it exists.
  1892. func (p *Parser) parseDimensions() (Dimensions, error) {
  1893. // If the next token is not GROUP then exit.
  1894. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != GROUP {
  1895. p.Unscan()
  1896. return nil, nil
  1897. }
  1898. // Now the next token should be "BY".
  1899. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != BY {
  1900. return nil, newParseError(tokstr(tok, lit), []string{"BY"}, pos)
  1901. }
  1902. var dimensions Dimensions
  1903. for {
  1904. // Parse the dimension.
  1905. d, err := p.parseDimension()
  1906. if err != nil {
  1907. return nil, err
  1908. }
  1909. // Add new dimension.
  1910. dimensions = append(dimensions, d)
  1911. // If there's not a comma next then stop parsing dimensions.
  1912. if tok, _, _ := p.Scan(); tok != COMMA {
  1913. p.Unscan()
  1914. break
  1915. }
  1916. }
  1917. return dimensions, nil
  1918. }
  1919. // parseDimension parses a single dimension.
  1920. func (p *Parser) parseDimension() (*Dimension, error) {
  1921. re, err := p.parseRegex()
  1922. if err != nil {
  1923. return nil, err
  1924. } else if re != nil {
  1925. return &Dimension{Expr: re}, nil
  1926. }
  1927. // Parse the expression first.
  1928. expr, err := p.ParseExpr()
  1929. if err != nil {
  1930. return nil, err
  1931. }
  1932. // Consume all trailing whitespace.
  1933. p.consumeWhitespace()
  1934. return &Dimension{Expr: expr}, nil
  1935. }
  1936. // parseFill parses the fill call and its options.
  1937. func (p *Parser) parseFill() (FillOption, interface{}, error) {
  1938. // Parse the expression first.
  1939. tok, _, lit := p.ScanIgnoreWhitespace()
  1940. p.Unscan()
  1941. if tok != IDENT || strings.ToLower(lit) != "fill" {
  1942. return NullFill, nil, nil
  1943. }
  1944. expr, err := p.ParseExpr()
  1945. if err != nil {
  1946. return NullFill, nil, err
  1947. }
  1948. fill, ok := expr.(*Call)
  1949. if !ok {
  1950. return NullFill, nil, errors.New("fill must be a function call")
  1951. } else if len(fill.Args) != 1 {
  1952. return NullFill, nil, errors.New("fill requires an argument, e.g.: 0, null, none, previous, linear")
  1953. }
  1954. switch fill.Args[0].String() {
  1955. case "null":
  1956. return NullFill, nil, nil
  1957. case "none":
  1958. return NoFill, nil, nil
  1959. case "previous":
  1960. return PreviousFill, nil, nil
  1961. case "linear":
  1962. return LinearFill, nil, nil
  1963. default:
  1964. switch num := fill.Args[0].(type) {
  1965. case *IntegerLiteral:
  1966. return NumberFill, num.Val, nil
  1967. case *NumberLiteral:
  1968. return NumberFill, num.Val, nil
  1969. default:
  1970. return NullFill, nil, fmt.Errorf("expected number argument in fill()")
  1971. }
  1972. }
  1973. }
  1974. // parseLocation parses the timezone call and its arguments.
  1975. func (p *Parser) parseLocation() (*time.Location, error) {
  1976. // Parse the expression first.
  1977. tok, _, lit := p.ScanIgnoreWhitespace()
  1978. p.Unscan()
  1979. if tok != IDENT || strings.ToLower(lit) != "tz" {
  1980. return nil, nil
  1981. }
  1982. expr, err := p.ParseExpr()
  1983. if err != nil {
  1984. return nil, err
  1985. }
  1986. tz, ok := expr.(*Call)
  1987. if !ok {
  1988. return nil, errors.New("tz must be a function call")
  1989. } else if len(tz.Args) != 1 {
  1990. return nil, errors.New("tz requires exactly one argument")
  1991. }
  1992. tzname, ok := tz.Args[0].(*StringLiteral)
  1993. if !ok {
  1994. return nil, errors.New("expected string argument in tz()")
  1995. }
  1996. loc, err := time.LoadLocation(tzname.Val)
  1997. if err != nil {
  1998. // Do not pass the same error message as the error may contain sensitive pathnames.
  1999. return nil, fmt.Errorf("unable to find time zone %s", tzname.Val)
  2000. }
  2001. return loc, nil
  2002. }
  2003. // ParseOptionalTokenAndInt parses the specified token followed
  2004. // by an int, if it exists.
  2005. func (p *Parser) ParseOptionalTokenAndInt(t Token) (int, error) {
  2006. // Check if the token exists.
  2007. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != t {
  2008. p.Unscan()
  2009. return 0, nil
  2010. }
  2011. // Scan the number.
  2012. tok, pos, lit := p.ScanIgnoreWhitespace()
  2013. if tok != INTEGER {
  2014. return 0, newParseError(tokstr(tok, lit), []string{"integer"}, pos)
  2015. }
  2016. // Parse number.
  2017. n, _ := strconv.ParseInt(lit, 10, 64)
  2018. if n < 0 {
  2019. msg := fmt.Sprintf("%s must be >= 0", t.String())
  2020. return 0, &ParseError{Message: msg, Pos: pos}
  2021. }
  2022. return int(n), nil
  2023. }
  2024. // parseOrderBy parses the "ORDER BY" clause of a query, if it exists.
  2025. func (p *Parser) parseOrderBy() (SortFields, error) {
  2026. // Return nil result and nil error if no ORDER token at this position.
  2027. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != ORDER {
  2028. p.Unscan()
  2029. return nil, nil
  2030. }
  2031. // Parse the required BY token.
  2032. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != BY {
  2033. return nil, newParseError(tokstr(tok, lit), []string{"BY"}, pos)
  2034. }
  2035. // Parse the ORDER BY fields.
  2036. fields, err := p.parseSortFields()
  2037. if err != nil {
  2038. return nil, err
  2039. }
  2040. return fields, nil
  2041. }
  2042. // parseSortFields parses the sort fields for an ORDER BY clause.
  2043. func (p *Parser) parseSortFields() (SortFields, error) {
  2044. var fields SortFields
  2045. tok, pos, lit := p.ScanIgnoreWhitespace()
  2046. switch tok {
  2047. // The first field after an order by may not have a field name (e.g. ORDER BY ASC)
  2048. case ASC, DESC:
  2049. fields = append(fields, &SortField{Ascending: (tok == ASC)})
  2050. // If it's a token, parse it as a sort field. At least one is required.
  2051. case IDENT:
  2052. p.Unscan()
  2053. field, err := p.parseSortField()
  2054. if err != nil {
  2055. return nil, err
  2056. }
  2057. if lit != "time" {
  2058. return nil, errors.New("only ORDER BY time supported at this time")
  2059. }
  2060. fields = append(fields, field)
  2061. // Parse error...
  2062. default:
  2063. return nil, newParseError(tokstr(tok, lit), []string{"identifier", "ASC", "DESC"}, pos)
  2064. }
  2065. // Parse additional fields.
  2066. for {
  2067. tok, _, _ := p.ScanIgnoreWhitespace()
  2068. if tok != COMMA {
  2069. p.Unscan()
  2070. break
  2071. }
  2072. field, err := p.parseSortField()
  2073. if err != nil {
  2074. return nil, err
  2075. }
  2076. fields = append(fields, field)
  2077. }
  2078. if len(fields) > 1 {
  2079. return nil, errors.New("only ORDER BY time supported at this time")
  2080. }
  2081. return fields, nil
  2082. }
  2083. // parseSortField parses one field of an ORDER BY clause.
  2084. func (p *Parser) parseSortField() (*SortField, error) {
  2085. field := &SortField{}
  2086. // Parse sort field name.
  2087. ident, err := p.ParseIdent()
  2088. if err != nil {
  2089. return nil, err
  2090. }
  2091. field.Name = ident
  2092. // Check for optional ASC or DESC clause. Default is ASC.
  2093. tok, _, _ := p.ScanIgnoreWhitespace()
  2094. if tok != ASC && tok != DESC {
  2095. p.Unscan()
  2096. tok = ASC
  2097. }
  2098. field.Ascending = (tok == ASC)
  2099. return field, nil
  2100. }
  2101. // ParseVarRef parses a reference to a measurement or field.
  2102. func (p *Parser) ParseVarRef() (*VarRef, error) {
  2103. // Parse the segments of the variable ref.
  2104. segments, err := p.parseSegmentedIdents()
  2105. if err != nil {
  2106. return nil, err
  2107. }
  2108. var dtype DataType
  2109. if tok, _, _ := p.Scan(); tok == DOUBLECOLON {
  2110. tok, pos, lit := p.Scan()
  2111. switch tok {
  2112. case IDENT:
  2113. switch strings.ToLower(lit) {
  2114. case "float":
  2115. dtype = Float
  2116. case "integer":
  2117. dtype = Integer
  2118. case "unsigned":
  2119. dtype = Unsigned
  2120. case "string":
  2121. dtype = String
  2122. case "boolean":
  2123. dtype = Boolean
  2124. default:
  2125. return nil, newParseError(tokstr(tok, lit), []string{"float", "integer", "unsigned", "string", "boolean", "field", "tag"}, pos)
  2126. }
  2127. case FIELD:
  2128. dtype = AnyField
  2129. case TAG:
  2130. dtype = Tag
  2131. default:
  2132. return nil, newParseError(tokstr(tok, lit), []string{"float", "integer", "string", "boolean", "field", "tag"}, pos)
  2133. }
  2134. } else {
  2135. p.Unscan()
  2136. }
  2137. vr := &VarRef{Val: strings.Join(segments, "."), Type: dtype}
  2138. return vr, nil
  2139. }
  2140. // ParseExpr parses an expression.
  2141. func (p *Parser) ParseExpr() (Expr, error) {
  2142. var err error
  2143. // Dummy root node.
  2144. root := &BinaryExpr{}
  2145. // Parse a non-binary expression type to start.
  2146. // This variable will always be the root of the expression tree.
  2147. root.RHS, err = p.parseUnaryExpr()
  2148. if err != nil {
  2149. return nil, err
  2150. }
  2151. // Loop over operations and unary exprs and build a tree based on precendence.
  2152. for {
  2153. // If the next token is NOT an operator then return the expression.
  2154. op, _, _ := p.ScanIgnoreWhitespace()
  2155. if !op.isOperator() {
  2156. p.Unscan()
  2157. return root.RHS, nil
  2158. }
  2159. // Otherwise parse the next expression.
  2160. var rhs Expr
  2161. if IsRegexOp(op) {
  2162. // RHS of a regex operator must be a regular expression.
  2163. if rhs, err = p.parseRegex(); err != nil {
  2164. return nil, err
  2165. }
  2166. // parseRegex can return an empty type, but we need it to be present
  2167. if rhs.(*RegexLiteral) == nil {
  2168. tok, pos, lit := p.ScanIgnoreWhitespace()
  2169. return nil, newParseError(tokstr(tok, lit), []string{"regex"}, pos)
  2170. }
  2171. } else {
  2172. if rhs, err = p.parseUnaryExpr(); err != nil {
  2173. return nil, err
  2174. }
  2175. }
  2176. // Find the right spot in the tree to add the new expression by
  2177. // descending the RHS of the expression tree until we reach the last
  2178. // BinaryExpr or a BinaryExpr whose RHS has an operator with
  2179. // precedence >= the operator being added.
  2180. for node := root; ; {
  2181. r, ok := node.RHS.(*BinaryExpr)
  2182. if !ok || r.Op.Precedence() >= op.Precedence() {
  2183. // Add the new expression here and break.
  2184. node.RHS = &BinaryExpr{LHS: node.RHS, RHS: rhs, Op: op}
  2185. break
  2186. }
  2187. node = r
  2188. }
  2189. }
  2190. }
  2191. // parseUnaryExpr parses an non-binary expression.
  2192. func (p *Parser) parseUnaryExpr() (Expr, error) {
  2193. // If the first token is a LPAREN then parse it as its own grouped expression.
  2194. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == LPAREN {
  2195. expr, err := p.ParseExpr()
  2196. if err != nil {
  2197. return nil, err
  2198. }
  2199. // Expect an RPAREN at the end.
  2200. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != RPAREN {
  2201. return nil, newParseError(tokstr(tok, lit), []string{")"}, pos)
  2202. }
  2203. return &ParenExpr{Expr: expr}, nil
  2204. }
  2205. p.Unscan()
  2206. // Read next token.
  2207. tok, pos, lit := p.ScanIgnoreWhitespace()
  2208. switch tok {
  2209. case IDENT:
  2210. // If the next immediate token is a left parentheses, parse as function call.
  2211. // Otherwise parse as a variable reference.
  2212. if tok0, _, _ := p.Scan(); tok0 == LPAREN {
  2213. return p.parseCall(lit)
  2214. }
  2215. p.Unscan() // Unscan the last token (wasn't an LPAREN)
  2216. p.Unscan() // Unscan the IDENT token
  2217. // Parse it as a VarRef.
  2218. return p.ParseVarRef()
  2219. case DISTINCT:
  2220. // If the next immediate token is a left parentheses, parse as function call.
  2221. // Otherwise parse as a Distinct expression.
  2222. tok0, pos, lit := p.Scan()
  2223. if tok0 == LPAREN {
  2224. return p.parseCall("distinct")
  2225. } else if tok0 == WS {
  2226. tok1, pos, lit := p.ScanIgnoreWhitespace()
  2227. if tok1 != IDENT {
  2228. return nil, newParseError(tokstr(tok1, lit), []string{"identifier"}, pos)
  2229. }
  2230. return &Distinct{Val: lit}, nil
  2231. }
  2232. return nil, newParseError(tokstr(tok0, lit), []string{"(", "identifier"}, pos)
  2233. case STRING:
  2234. return &StringLiteral{Val: lit}, nil
  2235. case NUMBER:
  2236. v, err := strconv.ParseFloat(lit, 64)
  2237. if err != nil {
  2238. return nil, &ParseError{Message: "unable to parse number", Pos: pos}
  2239. }
  2240. return &NumberLiteral{Val: v}, nil
  2241. case INTEGER:
  2242. v, err := strconv.ParseInt(lit, 10, 64)
  2243. if err != nil {
  2244. // The literal may be too large to fit into an int64. If it is, use an unsigned integer.
  2245. // The check for negative numbers is handled somewhere else so this should always be a positive number.
  2246. if v, err := strconv.ParseUint(lit, 10, 64); err == nil {
  2247. return &UnsignedLiteral{Val: v}, nil
  2248. }
  2249. return nil, &ParseError{Message: "unable to parse integer", Pos: pos}
  2250. }
  2251. return &IntegerLiteral{Val: v}, nil
  2252. case TRUE, FALSE:
  2253. return &BooleanLiteral{Val: tok == TRUE}, nil
  2254. case DURATIONVAL:
  2255. v, err := ParseDuration(lit)
  2256. if err != nil {
  2257. return nil, err
  2258. }
  2259. return &DurationLiteral{Val: v}, nil
  2260. case MUL:
  2261. wc := &Wildcard{}
  2262. if tok, _, _ := p.Scan(); tok == DOUBLECOLON {
  2263. tok, pos, lit := p.Scan()
  2264. switch tok {
  2265. case FIELD, TAG:
  2266. wc.Type = tok
  2267. default:
  2268. return nil, newParseError(tokstr(tok, lit), []string{"field", "tag"}, pos)
  2269. }
  2270. } else {
  2271. p.Unscan()
  2272. }
  2273. return wc, nil
  2274. case REGEX:
  2275. re, err := regexp.Compile(lit)
  2276. if err != nil {
  2277. return nil, &ParseError{Message: err.Error(), Pos: pos}
  2278. }
  2279. return &RegexLiteral{Val: re}, nil
  2280. case BOUNDPARAM:
  2281. // If we have a BOUNDPARAM in the token stream,
  2282. // it wasn't resolved by the parser to another
  2283. // token type which means it is invalid.
  2284. // Figure out what is wrong with it.
  2285. k := strings.TrimPrefix(lit, "$")
  2286. if len(k) == 0 {
  2287. return nil, errors.New("empty bound parameter")
  2288. }
  2289. v, ok := p.params[k]
  2290. if !ok {
  2291. return nil, fmt.Errorf("missing parameter: %s", k)
  2292. }
  2293. // The value must be an ErrorValue.
  2294. // Return the value as an error. A non-error value
  2295. // would have been substituted as something else.
  2296. return nil, errors.New(v.Value())
  2297. case ADD, SUB:
  2298. mul := 1
  2299. if tok == SUB {
  2300. mul = -1
  2301. }
  2302. tok0, pos0, lit0 := p.ScanIgnoreWhitespace()
  2303. switch tok0 {
  2304. case NUMBER, INTEGER, DURATIONVAL, LPAREN, IDENT:
  2305. // Unscan the token and use parseUnaryExpr.
  2306. p.Unscan()
  2307. lit, err := p.parseUnaryExpr()
  2308. if err != nil {
  2309. return nil, err
  2310. }
  2311. switch lit := lit.(type) {
  2312. case *NumberLiteral:
  2313. lit.Val *= float64(mul)
  2314. case *IntegerLiteral:
  2315. lit.Val *= int64(mul)
  2316. case *UnsignedLiteral:
  2317. if tok == SUB {
  2318. // Because of twos-complement integers and the method we parse, math.MinInt64 will be parsed
  2319. // as an UnsignedLiteral because it overflows an int64, but it fits into int64 if it were parsed
  2320. // as a negative number instead.
  2321. if lit.Val == uint64(math.MaxInt64+1) {
  2322. return &IntegerLiteral{Val: int64(-lit.Val)}, nil
  2323. }
  2324. return nil, fmt.Errorf("constant -%d underflows int64", lit.Val)
  2325. }
  2326. case *DurationLiteral:
  2327. lit.Val *= time.Duration(mul)
  2328. case *VarRef, *Call, *ParenExpr:
  2329. // Multiply the variable.
  2330. return &BinaryExpr{
  2331. Op: MUL,
  2332. LHS: &IntegerLiteral{Val: int64(mul)},
  2333. RHS: lit,
  2334. }, nil
  2335. default:
  2336. panic(fmt.Sprintf("unexpected literal: %T", lit))
  2337. }
  2338. return lit, nil
  2339. default:
  2340. return nil, newParseError(tokstr(tok0, lit0), []string{"identifier", "number", "duration", "("}, pos0)
  2341. }
  2342. default:
  2343. return nil, newParseError(tokstr(tok, lit), []string{"identifier", "string", "number", "bool"}, pos)
  2344. }
  2345. }
  2346. // parseRegex parses a regular expression.
  2347. func (p *Parser) parseRegex() (*RegexLiteral, error) {
  2348. nextRune := p.peekRune()
  2349. if isWhitespace(nextRune) {
  2350. p.consumeWhitespace()
  2351. }
  2352. // If the next character is not a '/', then return nils.
  2353. nextRune = p.peekRune()
  2354. if nextRune == '$' {
  2355. // This might be a bound parameter and it might
  2356. // resolve to a regex.
  2357. tok, _, _ := p.Scan()
  2358. p.Unscan()
  2359. if tok != REGEX {
  2360. // It was not a regular expression so return.
  2361. return nil, nil
  2362. }
  2363. } else if nextRune != '/' {
  2364. return nil, nil
  2365. }
  2366. tok, pos, lit := p.ScanRegex()
  2367. if tok == BADESCAPE {
  2368. msg := fmt.Sprintf("bad escape: %s", lit)
  2369. return nil, &ParseError{Message: msg, Pos: pos}
  2370. } else if tok == BADREGEX {
  2371. msg := fmt.Sprintf("bad regex: %s", lit)
  2372. return nil, &ParseError{Message: msg, Pos: pos}
  2373. } else if tok != REGEX {
  2374. return nil, newParseError(tokstr(tok, lit), []string{"regex"}, pos)
  2375. }
  2376. re, err := regexp.Compile(lit)
  2377. if err != nil {
  2378. return nil, &ParseError{Message: err.Error(), Pos: pos}
  2379. }
  2380. return &RegexLiteral{Val: re}, nil
  2381. }
  2382. // parseCall parses a function call.
  2383. // This function assumes the function name and LPAREN have been consumed.
  2384. func (p *Parser) parseCall(name string) (*Call, error) {
  2385. name = strings.ToLower(name)
  2386. // Parse first function argument if one exists.
  2387. var args []Expr
  2388. re, err := p.parseRegex()
  2389. if err != nil {
  2390. return nil, err
  2391. } else if re != nil {
  2392. args = append(args, re)
  2393. } else {
  2394. // If there's a right paren then just return immediately.
  2395. if tok, _, _ := p.Scan(); tok == RPAREN {
  2396. return &Call{Name: name}, nil
  2397. }
  2398. p.Unscan()
  2399. arg, err := p.ParseExpr()
  2400. if err != nil {
  2401. return nil, err
  2402. }
  2403. args = append(args, arg)
  2404. }
  2405. // Parse additional function arguments if there is a comma.
  2406. for {
  2407. // If there's not a comma, stop parsing arguments.
  2408. if tok, _, _ := p.ScanIgnoreWhitespace(); tok != COMMA {
  2409. p.Unscan()
  2410. break
  2411. }
  2412. re, err := p.parseRegex()
  2413. if err != nil {
  2414. return nil, err
  2415. } else if re != nil {
  2416. args = append(args, re)
  2417. continue
  2418. }
  2419. // Parse an expression argument.
  2420. arg, err := p.ParseExpr()
  2421. if err != nil {
  2422. return nil, err
  2423. }
  2424. args = append(args, arg)
  2425. }
  2426. // There should be a right parentheses at the end.
  2427. if tok, pos, lit := p.Scan(); tok != RPAREN {
  2428. return nil, newParseError(tokstr(tok, lit), []string{")"}, pos)
  2429. }
  2430. return &Call{Name: name, Args: args}, nil
  2431. }
  2432. // parseResample parses a RESAMPLE [EVERY <duration>] [FOR <duration>].
  2433. // This function assumes RESAMPLE has already been consumed.
  2434. // EVERY and FOR are optional, but at least one of the two has to be used.
  2435. func (p *Parser) parseResample() (time.Duration, time.Duration, error) {
  2436. var interval time.Duration
  2437. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == EVERY {
  2438. tok, pos, lit := p.ScanIgnoreWhitespace()
  2439. if tok != DURATIONVAL {
  2440. return 0, 0, newParseError(tokstr(tok, lit), []string{"duration"}, pos)
  2441. }
  2442. d, err := ParseDuration(lit)
  2443. if err != nil {
  2444. return 0, 0, &ParseError{Message: err.Error(), Pos: pos}
  2445. }
  2446. interval = d
  2447. } else {
  2448. p.Unscan()
  2449. }
  2450. var maxDuration time.Duration
  2451. if tok, _, _ := p.ScanIgnoreWhitespace(); tok == FOR {
  2452. tok, pos, lit := p.ScanIgnoreWhitespace()
  2453. if tok != DURATIONVAL {
  2454. return 0, 0, newParseError(tokstr(tok, lit), []string{"duration"}, pos)
  2455. }
  2456. d, err := ParseDuration(lit)
  2457. if err != nil {
  2458. return 0, 0, &ParseError{Message: err.Error(), Pos: pos}
  2459. }
  2460. maxDuration = d
  2461. } else {
  2462. p.Unscan()
  2463. }
  2464. // Neither EVERY or FOR were read, so read the next token again
  2465. // so we can return a suitable error message.
  2466. if interval == 0 && maxDuration == 0 {
  2467. tok, pos, lit := p.ScanIgnoreWhitespace()
  2468. return 0, 0, newParseError(tokstr(tok, lit), []string{"EVERY", "FOR"}, pos)
  2469. }
  2470. return interval, maxDuration, nil
  2471. }
  2472. // Scan returns the next token from the underlying scanner.
  2473. func (p *Parser) Scan() (tok Token, pos Pos, lit string) {
  2474. return p.scan(p.s.Scan)
  2475. }
  2476. // ScanRegex returns the next token from the underlying scanner
  2477. // using the regex scanner.
  2478. func (p *Parser) ScanRegex() (tok Token, pos Pos, lit string) {
  2479. return p.scan(p.s.ScanRegex)
  2480. }
  2481. type scanFunc func() (tok Token, pos Pos, lit string)
  2482. func (p *Parser) scan(fn scanFunc) (tok Token, pos Pos, lit string) {
  2483. tok, pos, lit = fn()
  2484. if tok == BOUNDPARAM {
  2485. // If we have a bound parameter, attempt to
  2486. // replace it in the scanner. If the bound parameter
  2487. // isn't valid, do not perform the replacement.
  2488. k := strings.TrimPrefix(lit, "$")
  2489. if len(k) != 0 {
  2490. if v, ok := p.params[k]; ok {
  2491. tok, lit = v.TokenType(), v.Value()
  2492. }
  2493. }
  2494. }
  2495. return tok, pos, lit
  2496. }
  2497. // ScanIgnoreWhitespace scans the next non-whitespace and non-comment token.
  2498. func (p *Parser) ScanIgnoreWhitespace() (tok Token, pos Pos, lit string) {
  2499. for {
  2500. tok, pos, lit = p.Scan()
  2501. if tok == WS || tok == COMMENT {
  2502. continue
  2503. }
  2504. return
  2505. }
  2506. }
  2507. // consumeWhitespace scans the next token if it's whitespace.
  2508. func (p *Parser) consumeWhitespace() {
  2509. if tok, _, _ := p.Scan(); tok != WS {
  2510. p.Unscan()
  2511. }
  2512. }
  2513. // Unscan pushes the previously read token back onto the buffer.
  2514. func (p *Parser) Unscan() { p.s.Unscan() }
  2515. // ParseDuration parses a time duration from a string.
  2516. // This is needed instead of time.ParseDuration because this will support
  2517. // the full syntax that InfluxQL supports for specifying durations
  2518. // including weeks and days.
  2519. func ParseDuration(s string) (time.Duration, error) {
  2520. // Return an error if the string is blank or one character
  2521. if len(s) < 2 {
  2522. return 0, ErrInvalidDuration
  2523. }
  2524. // Split string into individual runes.
  2525. a := []rune(s)
  2526. // Start with a zero duration.
  2527. var d time.Duration
  2528. i := 0
  2529. // Check for a negative.
  2530. isNegative := false
  2531. if a[i] == '-' {
  2532. isNegative = true
  2533. i++
  2534. }
  2535. var measure int64
  2536. var unit string
  2537. // Parsing loop.
  2538. for i < len(a) {
  2539. // Find the number portion.
  2540. start := i
  2541. for ; i < len(a) && isDigit(a[i]); i++ {
  2542. // Scan for the digits.
  2543. }
  2544. // Check if we reached the end of the string prematurely.
  2545. if i >= len(a) || i == start {
  2546. return 0, ErrInvalidDuration
  2547. }
  2548. // Parse the numeric part.
  2549. n, err := strconv.ParseInt(string(a[start:i]), 10, 64)
  2550. if err != nil {
  2551. return 0, ErrInvalidDuration
  2552. }
  2553. measure = n
  2554. // Extract the unit of measure.
  2555. // If the last two characters are "ms" then parse as milliseconds.
  2556. // Otherwise just use the last character as the unit of measure.
  2557. unit = string(a[i])
  2558. switch a[i] {
  2559. case 'n':
  2560. if i+1 < len(a) && a[i+1] == 's' {
  2561. unit = string(a[i : i+2])
  2562. d += time.Duration(n)
  2563. i += 2
  2564. continue
  2565. }
  2566. return 0, ErrInvalidDuration
  2567. case 'u', 'µ':
  2568. d += time.Duration(n) * time.Microsecond
  2569. case 'm':
  2570. if i+1 < len(a) && a[i+1] == 's' {
  2571. unit = string(a[i : i+2])
  2572. d += time.Duration(n) * time.Millisecond
  2573. i += 2
  2574. continue
  2575. }
  2576. d += time.Duration(n) * time.Minute
  2577. case 's':
  2578. d += time.Duration(n) * time.Second
  2579. case 'h':
  2580. d += time.Duration(n) * time.Hour
  2581. case 'd':
  2582. d += time.Duration(n) * 24 * time.Hour
  2583. case 'w':
  2584. d += time.Duration(n) * 7 * 24 * time.Hour
  2585. default:
  2586. return 0, ErrInvalidDuration
  2587. }
  2588. i++
  2589. }
  2590. // Check to see if we overflowed a duration
  2591. if d < 0 && !isNegative {
  2592. return 0, fmt.Errorf("overflowed duration %d%s: choose a smaller duration or INF", measure, unit)
  2593. }
  2594. if isNegative {
  2595. d = -d
  2596. }
  2597. return d, nil
  2598. }
  2599. // FormatDuration formats a duration to a string.
  2600. func FormatDuration(d time.Duration) string {
  2601. if d == 0 {
  2602. return "0s"
  2603. } else if d%(7*24*time.Hour) == 0 {
  2604. return fmt.Sprintf("%dw", d/(7*24*time.Hour))
  2605. } else if d%(24*time.Hour) == 0 {
  2606. return fmt.Sprintf("%dd", d/(24*time.Hour))
  2607. } else if d%time.Hour == 0 {
  2608. return fmt.Sprintf("%dh", d/time.Hour)
  2609. } else if d%time.Minute == 0 {
  2610. return fmt.Sprintf("%dm", d/time.Minute)
  2611. } else if d%time.Second == 0 {
  2612. return fmt.Sprintf("%ds", d/time.Second)
  2613. } else if d%time.Millisecond == 0 {
  2614. return fmt.Sprintf("%dms", d/time.Millisecond)
  2615. } else if d%time.Microsecond == 0 {
  2616. // Although we accept both "u" and "µ" when reading microsecond durations,
  2617. // we output with "u", which can be represented in 1 byte,
  2618. // instead of "µ", which requires 2 bytes.
  2619. return fmt.Sprintf("%du", d/time.Microsecond)
  2620. }
  2621. return fmt.Sprintf("%dns", d)
  2622. }
  2623. // parseTokens consumes an expected sequence of tokens.
  2624. func (p *Parser) parseTokens(toks []Token) error {
  2625. for _, expected := range toks {
  2626. if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != expected {
  2627. return newParseError(tokstr(tok, lit), []string{tokens[expected]}, pos)
  2628. }
  2629. }
  2630. return nil
  2631. }
  2632. var (
  2633. // Quote String replacer.
  2634. qsReplacer = strings.NewReplacer("\n", `\n`, `\`, `\\`, `'`, `\'`)
  2635. // Quote Ident replacer.
  2636. qiReplacer = strings.NewReplacer("\n", `\n`, `\`, `\\`, `"`, `\"`)
  2637. )
  2638. // QuoteString returns a quoted string.
  2639. func QuoteString(s string) string {
  2640. return `'` + qsReplacer.Replace(s) + `'`
  2641. }
  2642. // QuoteIdent returns a quoted identifier from multiple bare identifiers.
  2643. func QuoteIdent(segments ...string) string {
  2644. var buf bytes.Buffer
  2645. for i, segment := range segments {
  2646. needQuote := IdentNeedsQuotes(segment) ||
  2647. ((i < len(segments)-1) && segment != "") || // not last segment && not ""
  2648. ((i == 0 || i == len(segments)-1) && segment == "") // the first or last segment and an empty string
  2649. if needQuote {
  2650. _ = buf.WriteByte('"')
  2651. }
  2652. _, _ = buf.WriteString(qiReplacer.Replace(segment))
  2653. if needQuote {
  2654. _ = buf.WriteByte('"')
  2655. }
  2656. if i < len(segments)-1 {
  2657. _ = buf.WriteByte('.')
  2658. }
  2659. }
  2660. return buf.String()
  2661. }
  2662. // IdentNeedsQuotes returns true if the ident string given would require quotes.
  2663. func IdentNeedsQuotes(ident string) bool {
  2664. // check if this identifier is a keyword
  2665. tok := Lookup(ident)
  2666. if tok != IDENT {
  2667. return true
  2668. }
  2669. for i, r := range ident {
  2670. if i == 0 && !isIdentFirstChar(r) {
  2671. return true
  2672. } else if i > 0 && !isIdentChar(r) {
  2673. return true
  2674. }
  2675. }
  2676. return false
  2677. }
  2678. // isDateString returns true if the string looks like a date-only time literal.
  2679. func isDateString(s string) bool { return dateStringRegexp.MatchString(s) }
  2680. // isDateTimeString returns true if the string looks like a date+time time literal.
  2681. func isDateTimeString(s string) bool { return dateTimeStringRegexp.MatchString(s) }
  2682. var dateStringRegexp = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}$`)
  2683. var dateTimeStringRegexp = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}.+`)
  2684. // ErrInvalidDuration is returned when parsing a malformed duration.
  2685. var ErrInvalidDuration = errors.New("invalid duration")
  2686. // ParseError represents an error that occurred during parsing.
  2687. type ParseError struct {
  2688. Message string
  2689. Found string
  2690. Expected []string
  2691. Pos Pos
  2692. }
  2693. // newParseError returns a new instance of ParseError.
  2694. func newParseError(found string, expected []string, pos Pos) *ParseError {
  2695. return &ParseError{Found: found, Expected: expected, Pos: pos}
  2696. }
  2697. // Error returns the string representation of the error.
  2698. func (e *ParseError) Error() string {
  2699. if e.Message != "" {
  2700. return fmt.Sprintf("%s at line %d, char %d", e.Message, e.Pos.Line+1, e.Pos.Char+1)
  2701. }
  2702. return fmt.Sprintf("found %s, expected %s at line %d, char %d", e.Found, strings.Join(e.Expected, ", "), e.Pos.Line+1, e.Pos.Char+1)
  2703. }