Skip to content

Commit 474ea15

Browse files
committed
feat(print-statements): intercept explain query plan statements
1 parent 06ca553 commit 474ea15

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

Diff for: internal/db/output.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ type TablePrinter struct {
2121
func (t TablePrinter) print(statementResult StatementResult, outF io.Writer) error {
2222
data := [][]string{}
2323
table := createTable(outF)
24-
if !t.withoutHeader {
24+
showTableHeader := !t.withoutHeader &&
25+
!IsResultComingFromExplainQueryPlan(statementResult)
26+
if showTableHeader {
2527
table.SetHeader(statementResult.ColumnNames)
2628
}
2729

@@ -98,7 +100,11 @@ func appendData(statementResult StatementResult, data [][]string, mode FormatTyp
98100
if err != nil {
99101
return [][]string{}, err
100102
}
101-
data = append(data, formattedRow)
103+
if !IsResultComingFromExplainQueryPlan(statementResult) {
104+
data = append(data, formattedRow)
105+
} else {
106+
data = append(data, []string{"Tree goes here!"})
107+
}
102108
}
103109
return data, nil
104110
}

Diff for: internal/db/utils.go

+29
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"net/url"
55
"strings"
66
"unicode"
7+
8+
"golang.org/x/exp/slices"
79
)
810

911
func IsUrl(uri string) bool {
@@ -45,3 +47,30 @@ func NeedsEscaping(name string) bool {
4547
}
4648
return false
4749
}
50+
51+
var explainQueryPlanStatement = "EXPLAIN QUERY PLAN"
52+
var explainQueryPlanColumnNames = []string{"id", "parent", "notused", "detail"}
53+
54+
func queryContainsExplainQueryPlanStatement(query string) bool {
55+
return strings.Contains(query, explainQueryPlanStatement)
56+
}
57+
58+
func columnNamesMatchExplainQueryPlan(colNames []string) bool {
59+
if len(colNames) != len(explainQueryPlanColumnNames) {
60+
return false
61+
}
62+
for _, colName := range explainQueryPlanColumnNames {
63+
if !slices.Contains(colNames, colName) {
64+
return false
65+
}
66+
}
67+
return true
68+
}
69+
70+
// "query" can be a string containing multiple queries separated by ";" or a single query
71+
func IsResultComingFromExplainQueryPlan(statementResult StatementResult) bool {
72+
query := statementResult.Query
73+
columnNames := statementResult.ColumnNames
74+
return queryContainsExplainQueryPlanStatement(query) &&
75+
columnNamesMatchExplainQueryPlan(columnNames)
76+
}

0 commit comments

Comments
 (0)