@@ -8,13 +8,14 @@ import (
88 "strconv"
99 "strings"
1010
11+ "github.com/sqlc-dev/sqlc/internal/goldeneye/analysis"
1112 "github.com/sqlc-dev/sqlc/internal/goldeneye/endtoend"
1213)
1314
1415// analyze runs every query against the schema and fixture and records what
1516// ClickHouse reports about each.
16- func analyze (ctx context.Context , l local , schema , fixture string , queries []endtoend.Query ) ([]endtoend. AnalyzedQuery , error ) {
17- out := make ([]endtoend. AnalyzedQuery , 0 , len (queries ))
17+ func analyze (ctx context.Context , l local , schema , fixture string , queries []endtoend.Query ) ([]analysis. Query , error ) {
18+ out := make ([]analysis. Query , 0 , len (queries ))
1819 for _ , q := range queries {
1920 aq , err := analyzeQuery (ctx , l , schema , fixture , q )
2021 if err != nil {
@@ -25,7 +26,7 @@ func analyze(ctx context.Context, l local, schema, fixture string, queries []end
2526 return out , nil
2627}
2728
28- func analyzeQuery (ctx context.Context , l local , schema , fixture string , q endtoend.Query ) (endtoend. AnalyzedQuery , error ) {
29+ func analyzeQuery (ctx context.Context , l local , schema , fixture string , q endtoend.Query ) (analysis. Query , error ) {
2930 sql , phs := bindPlaceholders (q .SQL )
3031 explain := returnsRows (sql )
3132
@@ -43,33 +44,33 @@ func analyzeQuery(ctx context.Context, l local, schema, fixture string, q endtoe
4344
4445 results , err := l .run (ctx , script .String ())
4546 if err != nil {
46- return endtoend. AnalyzedQuery {}, err
47+ return analysis. Query {}, err
4748 }
4849
49- aq := endtoend. AnalyzedQuery {
50+ aq := analysis. Query {
5051 Name : q .Name ,
5152 Cmd : q .Cmd ,
52- Columns : []endtoend. AnalyzedColumn {},
53- Params : []endtoend. AnalyzedParam {},
53+ Columns : []analysis. Column {},
54+ Params : []analysis. Param {},
5455 }
5556 if ! explain {
5657 return analyzeExec (ctx , l , script .String (), sql , phs , aq )
5758 }
5859 if len (results ) != 2 {
59- return endtoend. AnalyzedQuery {}, fmt .Errorf ("expected the query tree and one result set, got %d results" , len (results ))
60+ return analysis. Query {}, fmt .Errorf ("expected the query tree and one result set, got %d results" , len (results ))
6061 }
6162
6263 var lines []string
6364 for _ , row := range results [0 ].Data {
6465 var line string
6566 if err := json .Unmarshal (row ["explain" ], & line ); err != nil {
66- return endtoend. AnalyzedQuery {}, fmt .Errorf ("reading query tree: %w" , err )
67+ return analysis. Query {}, fmt .Errorf ("reading query tree: %w" , err )
6768 }
6869 lines = append (lines , line )
6970 }
7071 tree , err := parseQueryTree (lines )
7172 if err != nil {
72- return endtoend. AnalyzedQuery {}, err
73+ return analysis. Query {}, err
7374 }
7475
7576 // Names and types come from the block header of the executed query, the
@@ -85,23 +86,23 @@ func analyzeQuery(ctx context.Context, l local, schema, fixture string, q endtoe
8586
8687 sentinels := tree .sentinels ()
8788 for i , ph := range phs {
88- ac := endtoend. AnalyzedColumn {}
89+ ac := analysis. Column {}
8990 if sentinel := sentinels [i + 1 ]; sentinel != nil {
9091 ac = tree .paramColumn (sentinel )
9192 }
9293 if ph .Name != "" {
9394 ac .Name = ph .Name
9495 }
95- aq .Params = append (aq .Params , endtoend. AnalyzedParam {Number : ph .Number , Column : ac })
96+ aq .Params = append (aq .Params , analysis. Param {Number : ph .Number , Column : ac })
9697 }
9798 return aq , nil
9899}
99100
100- func column (name , typ string ) endtoend. AnalyzedColumn {
101+ func column (name , typ string ) analysis. Column {
101102 if typ == "" {
102- return endtoend. AnalyzedColumn {Name : name }
103+ return analysis. Column {Name : name }
103104 }
104- return endtoend. AnalyzedColumn {Name : name , Type : parseType (typ )}
105+ return analysis. Column {Name : name , Type : parseType (typ )}
105106}
106107
107108// returnsRows reports whether a statement produces a result set and so can
@@ -166,7 +167,7 @@ func sentinelOrdinal(c *treeNode) (int, bool) {
166167// paramColumn describes what a placeholder is compared with or assigned to:
167168// the other operand of the function it is an argument of, preferring a
168169// column over an expression, or the projected column it stands for.
169- func (t * queryTree ) paramColumn (sentinel * treeNode ) endtoend. AnalyzedColumn {
170+ func (t * queryTree ) paramColumn (sentinel * treeNode ) analysis. Column {
170171 list := sentinel .parent
171172 if list != nil && list .kind == "LIST" && list .parent != nil {
172173 switch owner := list .parent ; {
@@ -199,7 +200,7 @@ func (t *queryTree) paramColumn(sentinel *treeNode) endtoend.AnalyzedColumn {
199200}
200201
201202// describe turns a tree expression into a column description.
202- func (t * queryTree ) describe (n * treeNode ) endtoend. AnalyzedColumn {
203+ func (t * queryTree ) describe (n * treeNode ) analysis. Column {
203204 switch n .kind {
204205 case "COLUMN" :
205206 ac := column (n .attrs ["column_name" ], n .attrs ["result_type" ])
@@ -217,28 +218,28 @@ func (t *queryTree) describe(n *treeNode) endtoend.AnalyzedColumn {
217218 }
218219 return column (name , n .attrs ["constant_value_type" ])
219220 }
220- return endtoend. AnalyzedColumn {}
221+ return analysis. Column {}
221222}
222223
223224var insertValuesRe = regexp .MustCompile (`(?is)^insert\s+into\s+(?:table\s+)?([\w.` + "`" + `"]+)\s*(?:\(([^)]*)\))?\s*(?:format\s+)?values\b` )
224225
225226// analyzeExec runs a statement that returns no rows. The only parameters it
226227// can describe are those of an INSERT ... VALUES, which map positionally
227228// onto the target columns reported by DESCRIBE TABLE.
228- func analyzeExec (ctx context.Context , l local , script , sql string , phs []placeholder , aq endtoend. AnalyzedQuery ) (endtoend. AnalyzedQuery , error ) {
229+ func analyzeExec (ctx context.Context , l local , script , sql string , phs []placeholder , aq analysis. Query ) (analysis. Query , error ) {
229230 m := insertValuesRe .FindStringSubmatch (sql )
230231 if m != nil {
231232 script += "DESCRIBE TABLE " + m [1 ] + ";\n "
232233 }
233234 results , err := l .run (ctx , script )
234235 if err != nil {
235- return endtoend. AnalyzedQuery {}, err
236+ return analysis. Query {}, err
236237 }
237238
238- var targets []endtoend. AnalyzedColumn
239+ var targets []analysis. Column
239240 if m != nil && len (results ) == 1 {
240- byName := map [string ]endtoend. AnalyzedColumn {}
241- var all []endtoend. AnalyzedColumn
241+ byName := map [string ]analysis. Column {}
242+ var all []analysis. Column
242243 table := strings .Trim (m [1 ][strings .LastIndexByte (m [1 ], '.' )+ 1 :], "`\" " )
243244 for _ , row := range results [0 ].Data {
244245 var name , typ string
@@ -258,14 +259,14 @@ func analyzeExec(ctx context.Context, l local, script, sql string, phs []placeho
258259 }
259260 }
260261 for i , ph := range phs {
261- ac := endtoend. AnalyzedColumn {}
262+ ac := analysis. Column {}
262263 if len (targets ) > 0 {
263264 ac = targets [i % len (targets )]
264265 }
265266 if ph .Name != "" {
266267 ac .Name = ph .Name
267268 }
268- aq .Params = append (aq .Params , endtoend. AnalyzedParam {Number : ph .Number , Column : ac })
269+ aq .Params = append (aq .Params , analysis. Param {Number : ph .Number , Column : ac })
269270 }
270271 return aq , nil
271272}
0 commit comments