...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package query
16
17 import (
18 "strings"
19 )
20
21 type qnode struct {
22 query string
23 children []*qnode
24 }
25
26
27
28
29
30 func HasOrderedResults(sql string) bool {
31 cleanedQuery := strings.TrimSpace(sql)
32 if !strings.HasPrefix(cleanedQuery, "(") {
33 cleanedQuery = "(" + cleanedQuery + ")"
34 }
35 root := &qnode{query: cleanedQuery, children: []*qnode{}}
36 curNode := root
37 indexStack := []int{}
38 nodeStack := []*qnode{}
39 for i, c := range cleanedQuery {
40 if c == '(' {
41 indexStack = append(indexStack, i)
42 nextNode := &qnode{children: []*qnode{}}
43 curNode.children = append(curNode.children, nextNode)
44 nodeStack = append(nodeStack, curNode)
45 curNode = nextNode
46 }
47 if c == ')' {
48 if len(indexStack) == 0 {
49
50 return false
51 }
52 start := indexStack[len(indexStack)-1]
53 indexStack = indexStack[:len(indexStack)-1]
54
55 curNode.query = cleanedQuery[start+1 : i]
56
57 curNode = nodeStack[len(nodeStack)-1]
58 nodeStack = nodeStack[:len(nodeStack)-1]
59 }
60 }
61 curNode = root.children[0]
62 q := curNode.query
63 for _, c := range curNode.children {
64 q = strings.Replace(q, c.query, "", 1)
65 }
66 return strings.Contains(strings.ToUpper(q), "ORDER BY")
67 }
68
View as plain text