Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2708d10

Browse files
committed
Merge branch 'explain-triggers' into 'master'
feat: render triggers in the explain plain text output See merge request postgres-ai/joe!188
2 parents e186591 + 830e888 commit 2708d10

File tree

2 files changed

+62
-6
lines changed

2 files changed

+62
-6
lines changed

‎pkg/pgexplain/pgexplain.go

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ const (
4949
)
5050

5151
type Explain struct {
52-
Plan Plan `json:"Plan"`
53-
Triggers []interface{} `json:"Triggers"`
52+
Plan Plan `json:"Plan"`
53+
Triggers []Trigger `json:"Triggers"`
5454

5555
Settings map[string]string `json:"Settings"`
5656
PlanningTime float64 `json:"Planning Time"`
@@ -82,6 +82,15 @@ type Explain struct {
8282
ContainsSeqScan bool
8383
}
8484

85+
// Trigger describes triggers in the explain output.
86+
type Trigger struct {
87+
Name string `json:"Trigger Name"`
88+
ConstraintName string `json:"Constraint Name"`
89+
Relation string `json:"Relation"`
90+
Time float64 `json:"Time"`
91+
Calls uint64 `json:"Calls"`
92+
}
93+
8594
type Plan struct {
8695
Plans []Plan `json:"Plans"`
8796

@@ -312,10 +321,26 @@ func (ex *Explain) calculateOutlierNodes(plan *Plan) {
312321

313322
func (ex *Explain) writeExplainText(writer io.Writer) {
314323
ex.writePlanText(writer, &ex.Plan, " ", 0, true)
324+
325+
if len(ex.Triggers) > 0 {
326+
_, _ = fmt.Fprint(writer, printTriggers(ex.Triggers))
327+
}
328+
329+
if len(ex.Settings) > 0 {
330+
_, _ = fmt.Fprintf(writer, "Settings: %s\n", printMap(ex.Settings))
331+
}
315332
}
316333

317334
func (ex *Explain) writeExplainTextWithoutCosts(writer io.Writer) {
318335
ex.writePlanText(writer, &ex.Plan, " ", 0, false)
336+
337+
if len(ex.Triggers) > 0 {
338+
_, _ = fmt.Fprint(writer, printTriggers(ex.Triggers))
339+
}
340+
341+
if len(ex.Settings) > 0 {
342+
_, _ = fmt.Fprintf(writer, "Settings: %s\n", printMap(ex.Settings))
343+
}
319344
}
320345

321346
func (ex *Explain) writeStatsText(writer io.Writer) {
@@ -410,10 +435,6 @@ func (ex *Explain) writePlanText(writer io.Writer, plan *Plan, prefix string, de
410435
currentPrefix = prefix + subplanPrefix + " "
411436
}
412437

413-
if len(ex.Settings) > 0 {
414-
_, _ = outputFn("Settings: %s", printMap(ex.Settings))
415-
}
416-
417438
writePlanTextNodeDetails(outputFn, plan)
418439

419440
for index := range plan.Plans {
@@ -652,3 +673,14 @@ func printMap(items map[string]string) string {
652673

653674
return strings.Join(list, ", ")
654675
}
676+
677+
func printTriggers(triggers []Trigger) string {
678+
sb := strings.Builder{}
679+
680+
for _, trigger := range triggers {
681+
sb.WriteString(fmt.Sprintf("Trigger %s for constraint %s: time=%.3f calls=%d\n",
682+
trigger.Name, trigger.ConstraintName, trigger.Time, trigger.Calls))
683+
}
684+
685+
return sb.String()
686+
}

‎pkg/pgexplain/pgexplain_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,27 @@ const InputJSON2 = `[
11431143
},
11441144
"Planning Time": 0.110,
11451145
"Triggers": [
1146+
{
1147+
"Trigger Name": "ConstraintTrigger_a_1645468",
1148+
"Constraint Name": "fk_636678b3bd",
1149+
"Relation": "users",
1150+
"Time": 12.443,
1151+
"Calls": 100
1152+
},
1153+
{
1154+
"Trigger Name": "ConstraintTrigger_a_12751",
1155+
"Constraint Name": "fk_0c0f730375",
1156+
"Relation": "users",
1157+
"Time": 0.990,
1158+
"Calls": 100
1159+
},
1160+
{
1161+
"Trigger Name": "ConstraintTrigger_a_21567",
1162+
"Constraint Name": "fk_1fa7a5f4da",
1163+
"Relation": "users",
1164+
"Time": 131.407,
1165+
"Calls": 100
1166+
}
11461167
],
11471168
"Execution Time": 0.199
11481169
}
@@ -1154,6 +1175,9 @@ const ExpectedText2 = ` Limit (cost=0.43..8.45 rows=1 width=22) (actual time=0.
11541175
Index Cond: (col = 'xxxx'::text)
11551176
Heap Fetches: 0
11561177
Buffers: shared hit=4
1178+
Trigger ConstraintTrigger_a_1645468 for constraint fk_636678b3bd: time=12.443 calls=100
1179+
Trigger ConstraintTrigger_a_12751 for constraint fk_0c0f730375: time=0.990 calls=100
1180+
Trigger ConstraintTrigger_a_21567 for constraint fk_1fa7a5f4da: time=131.407 calls=100
11571181
`
11581182

11591183
const InputJSON3 = `[

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /