diff --git a/core/view.go b/core/view.go index 3567eef6..855e955c 100644 --- a/core/view.go +++ b/core/view.go @@ -437,9 +437,11 @@ func getQueryTableInfo(app App, selectQuery string) ([]*TableInfoRow, error) { // Raw query identifiers parser // ------------------------------------------------------------------- -var joinReplaceRegex = regexp.MustCompile(`(?im)\s+(full\s+outer\s+join|left\s+outer\s+join|right\s+outer\s+join|full\s+join|cross\s+join|inner\s+join|outer\s+join|left\s+join|right\s+join|join)\s+?`) -var discardReplaceRegex = regexp.MustCompile(`(?im)\s+(where|group\s+by|having|order|limit|with)\s+?`) -var commentsReplaceRegex = regexp.MustCompile(`(?m)(\/\*[\s\S]+\*\/)|(--.+$)`) +var ( + joinReplaceRegex = regexp.MustCompile(`(?im)\s+(full\s+outer\s+join|left\s+outer\s+join|right\s+outer\s+join|full\s+join|cross\s+join|inner\s+join|outer\s+join|left\s+join|right\s+join|join)\s+?`) + discardReplaceRegex = regexp.MustCompile(`(?im)\s+(where|group\s+by|having|order|limit|with)\s+?`) + commentsReplaceRegex = regexp.MustCompile(`(?m)(\/\*[\s\S]+\*\/)|(--.+$)`) +) type identifier struct { original string @@ -453,9 +455,9 @@ type identifiersParser struct { func (p *identifiersParser) parse(selectQuery string) error { str := strings.Trim(strings.TrimSpace(selectQuery), ";") - str = joinReplaceRegex.ReplaceAllString(str, " _join_ ") - str = discardReplaceRegex.ReplaceAllString(str, " _discard_ ") str = commentsReplaceRegex.ReplaceAllString(str, "") + str = joinReplaceRegex.ReplaceAllString(str, " __pb_join__ ") + str = discardReplaceRegex.ReplaceAllString(str, " __pb_discard__ ") tk := tokenizer.NewFromString(str) tk.Separators(',', ' ', '\n', '\t') @@ -490,7 +492,7 @@ func (p *identifiersParser) parse(selectQuery string) error { skip = false partType = "from" activeBuilder = &fromParts - case "_join_": + case "__pb_join__": skip = false // the previous part was also a join @@ -500,7 +502,7 @@ func (p *identifiersParser) parse(selectQuery string) error { partType = "join" activeBuilder = &joinParts - case "_discard_": + case "__pb_discard__": // skip following tokens skip = true default: diff --git a/core/view_test.go b/core/view_test.go index bd4ec3d6..801ca852 100644 --- a/core/view_test.go +++ b/core/view_test.go @@ -246,11 +246,21 @@ func TestCreateViewFields(t *testing.T) { ` select -- test single line - id, - text, + demo1.id, + demo1.text, /* multi line comment */ - url, created, updated from demo1 + demo1.url, demo1.created, demo2.updated from demo1 + -- comment before join + join demo2 ON ( + -- comment inside join + demo2.id = demo1.id + ) + -- comment before where + where ( + -- comment inside where + demo2.id = demo1.id + ) `, false, map[string]string{