@query-doctor/core 0.4.2 → 0.5.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -604,7 +604,7 @@ declare const PROCEED: unique symbol;
604
604
  declare const SKIP: unique symbol;
605
605
  //#endregion
606
606
  //#region src/sql/nudges.d.ts
607
- type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN";
607
+ type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN" | "AVOID_ORDER_BY_RANDOM" | "PREFER_FILTER_OVER_CASE_IN_AGGREGATE" | "PREFER_UNION_ALL_OVER_UNION" | "NULLS_FIRST_IN_DESC_ORDER" | "AVOID_SCALAR_SUBQUERY_IN_SELECT" | "USE_EXISTS_NOT_COUNT_FOR_EXISTENCE_CHECK" | "PREFER_COUNT_STAR_OVER_COUNT_COLUMN" | "PREFER_WHERE_OVER_HAVING_FOR_NON_AGGREGATES";
608
608
  type Nudge = {
609
609
  kind: NudgeKind;
610
610
  severity: "CRITICAL" | "WARNING" | "INFO";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":";;;;;;;;;;;cAKa,YAAA;EAAA,iBAEQ,KAAA;EAAA,iBACA,MAAA;EAAA,QAFZ,WAAA,CAAA;EA+BoC;;;;EAAA,OAtBpC,UAAA,CAAW,UAAA,WAAqB,YAAA;EAPpB;;;;;;EAAA,OA6BZ,SAAA,CAAA,GAAa,WAAA,YAAuB,YAAA,MAAkB,YAAA;EAe7D,QAAA,CAAA;EAOA,MAAA,CAAA;EAAA,wBAMwB,gBAAA;AAAA;;;KC/Dd,2BAAA;AAAA,cAKC,oBAAA;EAAA,QASS,KAAA;EAAA,iBARH,QAAA;EAAA,QACT,eAAA;EAAA,QACA,YAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QAEA,iBAAA;cAEY,KAAA;EAAA,IAEhB,QAAA,CAAA;EAAA,OAIG,WAAA,CAAY,UAAA,UAAoB,IAAA,GAAO,YAAA,GAAY,oBAAA;EAS1D,MAAA,CAAO,OAAA,EAAS,2BAAA,EAA6B,KAAA;EAU7C,SAAA,CAAU,KAAA;EAKV,UAAA,CAAA;EAKA,OAAA,CAAQ,KAAA;EAKR,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,SAAA;EAKhC,YAAA,CAAa,KAAA;EAKb,KAAA,CAAA;ED7BoB;ECuCpB,UAAA,CAAA;;;;UAUQ,mBAAA;EAAA,QASA,eAAA;EAAA,QAaA,eAAA;AAAA;AAAA,KAeE,SAAA;;;cCxHC,eAAA,EAAe,CAAA,CAAA,IAAA,CAAA,WAAA,CAAA,CAAA,CAAA,SAAA;AAAA,KAChB,eAAA,GAAkB,CAAA,CAAE,KAAA,QAAa,eAAA;AAAA,UAE5B,mBAAA;EFDJ;;;EEKX,IAAA,IAAQ,KAAA,UAAe,MAAA,eAAqB,OAAA,CAAQ,CAAA;AAAA;;;;;UAOrC,QAAA,SAAiB,mBAAA;EAChC,WAAA,IAAe,QAAA,GAAW,EAAA,EAAI,mBAAA,KAAwB,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;EAC3E,MAAA,KACE,KAAA,UACA,MAAA,cACA,OAAA;IAAY,IAAA;EAAA,IACX,cAAA,CAAe,CAAA;EAElB,SAAA,IAAa,OAAA,CAAQ,eAAA;AAAA;AAAA,KAGX,uBAAA;EACV,GAAA;AAAA;AAAA,KAGU,eAAA,IAAmB,KAAA,EAAO,uBAAA,KAA4B,QAAA;AAAA,cAGpD,OAAA;AAAA,KACF,eAAA;EAAA,CAA8B,OAAA;AAAA;AAAA,KAE9B,aAAA;AAAA,KASA,0BAAA;EACV,WAAA,EAAa,aAAA;EAGb,SAAA,EAAW,eAAA;EACX,KAAA,GAAQ,oBAAA;EACR,YAAA;EACA,YAAA;AAAA;AAAA,KAGU,oBAAA,IACP,0BAAA;EACC,WAAA;EACA,YAAA;EACA,eAAA;EACA,KAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,eAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,eAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,YAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,YAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;AAAA,KAEF,0BAAA;AAAA,KAEQ,qBAAA;EACV,YAAA;IACE,IAAA,EAAM,oBAAA;EAAA;AAAA;;;;;iBAQY,SAAA,CACpB,EAAA,EAAI,mBAAA,EACJ,KAAA,EAAO,YAAA,GACN,OAAA;;;KCrGS,IAAA;AAAA,cAEC,gBAAA,EAAgB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;cAUhB,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoCvB,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKpB,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;;cAWlB,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAcf,aAAA,EAAa,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEd,aAAA,GAAgB,CAAA,CAAE,KAAA,QAAa,aAAA;AAAA,cAE9B,cAAA,EAAc,CAAA,CAAA,qBAAA,EAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAaf,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,cAI/B,UAAA;EAAA,iBAUQ,EAAA;EAAA,SACD,eAAA,EAAiB,eAAA;EAAA,SACjB,WAAA,EAAa,aAAA;EAAA,SAXtB,IAAA,EAAM,cAAA;EAAA,iBACE,gBAAA;EAAA,gBAED,gBAAA,EAAkB,cAAA;cAMf,EAAA,EAAI,QAAA,EACL,eAAA,EAAiB,eAAA,EACjB,WAAA,EAAa,aAAA,IAC7B,SAAA,EAAW,cAAA;EAAA,OAYN,uBAAA,CAAA;IACL,SAAA;IACA;EAAA;IAEA,SAAA;IACA,QAAA;EAAA,IACE,cAAA;ED5CF;;;EAAA,OCuDK,mBAAA,CAAoB,KAAA,EAAO,aAAA,KAAkB,cAAA;EAAA,OAQvC,YAAA,CACX,EAAA,EAAI,QAAA,EACJ,SAAA,EAAW,cAAA,GACV,OAAA,CAAQ,UAAA;EAMX,YAAA,CAAa,EAAA,EAAI,mBAAA,GAAmB,OAAA;;;;;MA2D9B,SAAA;MACA,KAAA;MACA,MAAA;MACA,MAAA;IAAA;EAAA;EAvDN,oBAAA,CAAA;EDhEC;;;;EAAA,QC+EO,YAAA;EDhFD;;;;;;;EAAA,eCsGQ,aAAA;EAAA,QASD,cAAA;EAAA,OAodD,SAAA,CACX,EAAA,EAAI,mBAAA,EACJ,eAAA,EAAiB,eAAA,EACjB,IAAA,yBACC,OAAA,CAAQ,aAAA;;;;AAzqBb;EA6wBQ,kBAAA,CAAA,GAAsB,OAAA,CAAQ,YAAA;AAAA;AAAA,KA2D1B,cAAA;EACV,UAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA,EAAO,WAAA;AAAA;AAAA,KAGJ,WAAA;EACH,UAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,WAAA;EACA,WAAA;EACA,WAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,KAGU,aAAA;EACV,SAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,aAAA;EACA,YAAA;EACA,OAAA,EAAS,cAAA;AAAA;AAAA,KAGN,SAAA;AAAA,KACO,UAAA;EACV,aAAA;EACA,SAAA;AAAA;AAAA,KAGU,eAAA;EACV,MAAA,EAAQ,aAAA;EACR,UAAA;EACA,cAAA,EAAgB,MAAA,CAAO,SAAA;AAAA;AAAA,KAGb,UAAA;AAAA,KAEA,YAAA;EACV,aAAA,EAAe,KAAA;IAAQ,IAAA;IAAc,KAAA,EAAO,UAAA;IAAY,OAAA;EAAA;EACxD,UAAA;EACA,SAAA;EACA,UAAA;EAEA,UAAA;EAEA,WAAA;EACA,UAAA;AAAA;;;KCv4BU,eAAA;AAAA,KAEA,mBAAA,GAAsB,sBAAA;EAChC,UAAA,EAAY,eAAA;AAAA;AAAA,cAUD,cAAA;EAAA,iBAIQ,EAAA;EAAA,iBACA,UAAA;EAAA,QACT,eAAA;EAAA,iBACS,MAAA;EAAA,OANZ,MAAA;cAGY,EAAA,EAAI,QAAA,EACJ,UAAA,EAAY,UAAA,EACrB,eAAA,EAAiB,YAAA,IACR,MAAA;IACf,KAAA;IACA,KAAA;EAAA;EAIE,GAAA,CACJ,OAAA,EAAS,oBAAA,EACT,OAAA,EAAS,kBAAA,IACT,WAAA,IAAe,EAAA,EAAI,mBAAA,KAAwB,OAAA,SAC1C,OAAA,CAAQ,cAAA;EAkEL,iBAAA,CAAkB,OAAA,EAAS,oBAAA,GAAoB,OAAA;UAkVlC,oBAAA;EAAA;EJxYnB;;;;;;;ACzDF;;;;;AAKA;EG6HE,gBAAA,CAAiB,CAAA,GAAI,OAAA,EAAS,YAAA,OAAmB,YAAA;;;;;;UAWzC,SAAA;EAAA,QAOA,kBAAA;EH9FuB;;;EAAA,QG0IvB,eAAA;EAAA,QAoFA,YAAA;EAAA,QA6CA,eAAA;EAAA,QAqBA,0BAAA;EAAA,QA8BA,qBAAA;;;;UAeM,mBAAA;EAAA,QAaN,WAAA;EAAA,QAaA,UAAA;EAAA,QAeA,aAAA;EAiBF,kBAAA,CACJ,OAAA,EAAS,oBAAA,EACT,CAAA,IAAK,EAAA,EAAI,mBAAA,KAAwB,OAAA,QACjC,OAAA;IAAY,MAAA;IAAoB,WAAA;EAAA,IAC/B,OAAA;IAAU,IAAA,EAAM,oBAAA;EAAA;EAAA,QAmCX,iCAAA;EAAA,QAoBA,eAAA;EAAA,QAyBA,gCAAA;AAAA;AAAA,KA4BE,cAAA;EAEN,IAAA;EACA,eAAA,EAAiB,oBAAA;EACjB,QAAA;EACA,SAAA;EACA,UAAA,EAAY,GAAA;EACZ,eAAA,EAAiB,GAAA;EACjB,YAAA,EAAc,GAAA,SAAY,mBAAA;EAC1B,WAAA,EAAa,oBAAA;AAAA;EAGb,IAAA;EACA,WAAA,EAAa,oBAAA;AAAA;AAAA,KAOP,kBAAA;EACV,MAAA;EACA,KAAA;EACA,MAAA;EACA,IAAA,GAAO,WAAA;EACP,KAAA;IAAU,QAAA,GAAW,YAAA;EAAA;EACrB,aAAA,GAAgB,aAAA;AAAA;AAAA,KAGN,sBAAA;EACV,MAAA;EACA,KAAA;EACA,OAAA,EAAS,kBAAA;EAET,KAAA;EACA,WAAA;EACA,OAAA;AAAA;AAAA,cAGW,OAAA;AAAA,cACA,IAAA;;;KCplBR,SAAA;AAAA,KAeO,KAAA;EACV,IAAA,EAAM,SAAA;EACN,QAAA;EACA,OAAA;EACA,QAAA;AAAA;AAAA,KAGG,WAAA,MAAiB,CAAA,SAAU,CAAA,SAAU,CAAA;;;;;iBAsC1B,WAAA,CACd,IAAA,EAAM,IAAA,EACN,KAAA,GAAQ,WAAA,CAAY,IAAA,gBACnB,KAAA;;;KCgWS,mBAAA;EACV,MAAA,WL3ZiB;EK6ZjB,IAAA;EACA,KAAA;EACA,MAAA;EACA,KAAA;AAAA;;;UCtZe,cAAA;EACf,KAAA,CAAM,KAAA,UAAe,MAAA,cAAoB,OAAA;AAAA;AAAA,cAG9B,iBAAA;AAAA,UAEI,eAAA;EACf,GAAA;EACA,KAAA;AAAA;AAAA,KAGU,WAAA;EACV,GAAA,EAAK,SAAA;EACL,KAAA,EAAO,WAAA;AAAA;AAAA,KAGG,yBAAA;EPnB6B,2DOqBvC,SAAA;EPCoB;;;;EOIpB,cAAA;EPwBwB;;;;;;AC/D1B;;;;;AAKA;;;EMiDE,KAAA,EAAO,mBAAA;ENlCmD;;;EMsC1D,OAAA,WNJ+B;EMM/B,QAAA;IACE,KAAA;IACA,GAAA;EAAA;ENtDM;;;;EM4DR,IAAA,GAAO,WAAA;EACP,KAAA;IAAU,QAAA,GAAW,YAAA;EAAA;EACrB,aAAA,GAAgB,aAAA;AAAA;AAAA,KAGN,aAAA;;KAGA,MAAA,IAAU,KAAA,aAAkB,OAAA;AAAA,KAE5B,cAAA;EACV,MAAA;EACA,KAAA;AAAA;AAAA,KAGU,cAAA;EACV,cAAA,EAAgB,yBAAA;EAChB,oBAAA;EACA,gBAAA,EAAkB,cAAA;EAClB,eAAA,EAAiB,mBAAA;EACjB,IAAA,EAAM,eAAA;EACN,gBAAA;EACA,yBAAA;EACA,MAAA,EAAQ,KAAA;AAAA;AAAA,KAGE,sBAAA;EACV,IAAA,EAAM,eAAA;EACN,gBAAA;AAAA;;;;;;ANyBF;cMhBa,QAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAC/B,OAAA,CACJ,KAAA,UACA,cAAA,YACC,OAAA,CAAQ,cAAA;EAgGX,aAAA,CACE,MAAA,EAAQ,aAAA,IACR,UAAA,EAAY,yBAAA,IACZ,gBAAA,EAAkB,cAAA,KACjB,kBAAA;EAAA,QA2GK,gBAAA;EAAA,QAmBA,SAAA;EAAA,QAMA,gBAAA;ELrVwD;;;;;;EAAA,QK2WxD,mBAAA;EAAA,QAkBA,SAAA;EAAA,QAOA,mBAAA;AAAA;;;iBCrYM,gBAAA,CAAiB,KAAA,EAAO,YAAA;;;;ARGxC;iBQKgB,wBAAA,CAAyB,KAAA,EAAO,YAAA;;;;;;;;cCLnC,WAAA;EACX,OAAA,CAAQ,KAAA;EAAA,QAIA,2BAAA;EAAA,QAaA,mBAAA;AAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -604,7 +604,7 @@ declare const PROCEED: unique symbol;
604
604
  declare const SKIP: unique symbol;
605
605
  //#endregion
606
606
  //#region src/sql/nudges.d.ts
607
- type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN";
607
+ type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN" | "AVOID_ORDER_BY_RANDOM" | "PREFER_FILTER_OVER_CASE_IN_AGGREGATE" | "PREFER_UNION_ALL_OVER_UNION" | "NULLS_FIRST_IN_DESC_ORDER" | "AVOID_SCALAR_SUBQUERY_IN_SELECT" | "USE_EXISTS_NOT_COUNT_FOR_EXISTENCE_CHECK" | "PREFER_COUNT_STAR_OVER_COUNT_COLUMN" | "PREFER_WHERE_OVER_HAVING_FOR_NON_AGGREGATES";
608
608
  type Nudge = {
609
609
  kind: NudgeKind;
610
610
  severity: "CRITICAL" | "WARNING" | "INFO";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -23,6 +23,14 @@ const findFuncCallsOnColumns = (whereClause) => {
23
23
  location: node.FuncCall.location
24
24
  });
25
25
  });
26
+ Walker.shallowMatch(whereClause, "CoalesceExpr", (node) => {
27
+ if (node.CoalesceExpr.args && containsColumnRef(node.CoalesceExpr.args)) nudges.push({
28
+ kind: "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE",
29
+ severity: "WARNING",
30
+ message: "Avoid using functions on columns in WHERE clause",
31
+ location: node.CoalesceExpr.location
32
+ });
33
+ });
26
34
  return nudges;
27
35
  };
28
36
  /**
@@ -49,6 +57,12 @@ function parseNudges(node, stack) {
49
57
  location: star.ResTarget.location
50
58
  });
51
59
  }
60
+ for (const target of node.SelectStmt.targetList ?? []) if (is$1(target, "ResTarget") && target.ResTarget.val && is$1(target.ResTarget.val, "SubLink") && target.ResTarget.val.SubLink.subLinkType === "EXPR_SUBLINK") nudges.push({
61
+ kind: "AVOID_SCALAR_SUBQUERY_IN_SELECT",
62
+ severity: "WARNING",
63
+ message: "Avoid correlated scalar subqueries in SELECT; consider rewriting as a JOIN",
64
+ location: target.ResTarget.val.SubLink.location
65
+ });
52
66
  }
53
67
  if (is$1(node, "SelectStmt")) {
54
68
  if (!stack.some((item) => item === "RangeSubselect" || item === "SubLink" || item === "CommonTableExpr")) {
@@ -73,6 +87,22 @@ function parseNudges(node, stack) {
73
87
  }
74
88
  }
75
89
  }
90
+ if (is$1(node, "SelectStmt") && node.SelectStmt.sortClause) for (const sortItem of node.SelectStmt.sortClause) {
91
+ if (!is$1(sortItem, "SortBy")) continue;
92
+ const sortDir = sortItem.SortBy.sortby_dir ?? "SORTBY_DEFAULT";
93
+ const sortNulls = sortItem.SortBy.sortby_nulls ?? "SORTBY_NULLS_DEFAULT";
94
+ if (sortDir === "SORTBY_DESC" && sortNulls === "SORTBY_NULLS_DEFAULT") {
95
+ if (sortItem.SortBy.node && is$1(sortItem.SortBy.node, "ColumnRef")) {
96
+ const sortColumnName = getLastColumnRefField(sortItem.SortBy.node);
97
+ if (!(sortColumnName !== null && whereHasIsNotNull(node.SelectStmt.whereClause, sortColumnName))) nudges.push({
98
+ kind: "NULLS_FIRST_IN_DESC_ORDER",
99
+ severity: "INFO",
100
+ message: "ORDER BY … DESC sorts NULLs first — add NULLS LAST to push them to the end",
101
+ location: sortItem.SortBy.node.ColumnRef.location
102
+ });
103
+ }
104
+ }
105
+ }
76
106
  if (is$1(node, "A_Expr")) {
77
107
  if (node.A_Expr.kind === "AEXPR_OP" && node.A_Expr.name && node.A_Expr.name.length > 0 && is$1(node.A_Expr.name[0], "String") && (node.A_Expr.name[0].String.sval === "=" || node.A_Expr.name[0].String.sval === "!=" || node.A_Expr.name[0].String.sval === "<>")) {
78
108
  const leftIsNull = isNullConstant(node.A_Expr.lexpr);
@@ -92,12 +122,20 @@ function parseNudges(node, stack) {
92
122
  nudges.push({
93
123
  kind: "AVOID_LEADING_WILDCARD_LIKE",
94
124
  severity: "WARNING",
95
- message: "Avoid using LIKE with leading wildcards",
125
+ message: "Leading wildcard in LIKE/ILIKE prevents index usage — consider a GIN trigram index (pg_trgm) or full-text search",
96
126
  location: stringNode?.location
97
127
  });
98
128
  }
99
129
  }
100
130
  }
131
+ if (is$1(node, "SelectStmt") && node.SelectStmt.sortClause) {
132
+ for (const sortItem of node.SelectStmt.sortClause) if (is$1(sortItem, "SortBy") && sortItem.SortBy.node && is$1(sortItem.SortBy.node, "FuncCall") && sortItem.SortBy.node.FuncCall.funcname?.some((name) => is$1(name, "String") && name.String.sval === "random")) nudges.push({
133
+ kind: "AVOID_ORDER_BY_RANDOM",
134
+ severity: "WARNING",
135
+ message: "Avoid using ORDER BY random()",
136
+ location: sortItem.SortBy.node.FuncCall.location
137
+ });
138
+ }
101
139
  if (is$1(node, "SelectStmt") && node.SelectStmt.distinctClause) nudges.push({
102
140
  kind: "AVOID_DISTINCT_WITHOUT_REASON",
103
141
  severity: "WARNING",
@@ -139,6 +177,29 @@ function parseNudges(node, stack) {
139
177
  });
140
178
  }
141
179
  }
180
+ if (is$1(node, "FuncCall")) {
181
+ const funcName = node.FuncCall.funcname;
182
+ if (funcName && funcName.length === 1 && is$1(funcName[0], "String") && funcName[0].String.sval === "count" && node.FuncCall.args && !node.FuncCall.agg_star && !node.FuncCall.agg_distinct) nudges.push({
183
+ kind: "PREFER_COUNT_STAR_OVER_COUNT_COLUMN",
184
+ severity: "INFO",
185
+ message: "Prefer COUNT(*) over COUNT(column) or COUNT(1) — COUNT(*) counts rows without checking for NULLs. If you need to count non-NULL values, COUNT(column) is correct.",
186
+ location: node.FuncCall.location
187
+ });
188
+ }
189
+ if (is$1(node, "SelectStmt") && node.SelectStmt.havingClause) {
190
+ if (!containsAggregate(node.SelectStmt.havingClause)) {
191
+ const having = node.SelectStmt.havingClause;
192
+ let location;
193
+ if (is$1(having, "A_Expr")) location = having.A_Expr.location;
194
+ else if (is$1(having, "BoolExpr")) location = having.BoolExpr.location;
195
+ nudges.push({
196
+ kind: "PREFER_WHERE_OVER_HAVING_FOR_NON_AGGREGATES",
197
+ severity: "INFO",
198
+ message: "Non-aggregate condition in HAVING should be in WHERE",
199
+ location
200
+ });
201
+ }
202
+ }
142
203
  if (is$1(node, "A_Expr")) {
143
204
  if (node.A_Expr.kind === "AEXPR_IN") {
144
205
  let list;
@@ -152,6 +213,45 @@ function parseNudges(node, stack) {
152
213
  });
153
214
  }
154
215
  }
216
+ if (is$1(node, "FuncCall")) {
217
+ const funcname = node.FuncCall.funcname?.[0] && is$1(node.FuncCall.funcname[0], "String") && node.FuncCall.funcname[0].String.sval;
218
+ if (funcname && [
219
+ "sum",
220
+ "count",
221
+ "avg",
222
+ "min",
223
+ "max"
224
+ ].includes(funcname.toLowerCase())) {
225
+ const firstArg = node.FuncCall.args?.[0];
226
+ if (firstArg && isANode$1(firstArg) && is$1(firstArg, "CaseExpr")) {
227
+ const caseExpr = firstArg.CaseExpr;
228
+ if (caseExpr.args && caseExpr.args.length === 1) {
229
+ const defresult = caseExpr.defresult;
230
+ if (!defresult || isANode$1(defresult) && is$1(defresult, "A_Const") && (defresult.A_Const.isnull !== void 0 || defresult.A_Const.ival !== void 0 && (defresult.A_Const.ival.ival === 0 || defresult.A_Const.ival.ival === void 0))) nudges.push({
231
+ kind: "PREFER_FILTER_OVER_CASE_IN_AGGREGATE",
232
+ severity: "INFO",
233
+ message: "Use FILTER (WHERE ...) instead of CASE inside aggregate functions",
234
+ location: node.FuncCall.location
235
+ });
236
+ }
237
+ }
238
+ }
239
+ }
240
+ if (is$1(node, "SelectStmt") && node.SelectStmt.op === "SETOP_UNION" && !node.SelectStmt.all) nudges.push({
241
+ kind: "PREFER_UNION_ALL_OVER_UNION",
242
+ severity: "INFO",
243
+ message: "UNION removes duplicates with an implicit sort — use UNION ALL if deduplication is not needed"
244
+ });
245
+ if (is$1(node, "A_Expr") && node.A_Expr.kind === "AEXPR_OP" && node.A_Expr.name && node.A_Expr.name.length > 0) {
246
+ const opNode = node.A_Expr.name[0];
247
+ const op = is$1(opNode, "String") ? opNode.String.sval : null;
248
+ if (op && isExistenceCheckPattern(node.A_Expr.lexpr, node.A_Expr.rexpr, op)) nudges.push({
249
+ kind: "USE_EXISTS_NOT_COUNT_FOR_EXISTENCE_CHECK",
250
+ severity: "INFO",
251
+ message: "Use EXISTS instead of COUNT for existence checks",
252
+ location: node.A_Expr.location
253
+ });
254
+ }
155
255
  return nudges;
156
256
  }
157
257
  function containsColumnRef(args) {
@@ -187,6 +287,48 @@ function getStringConstantValue(node) {
187
287
  if (isANode$1(node) && is$1(node, "A_Const") && node.A_Const.sval) return node.A_Const.sval.sval || null;
188
288
  return null;
189
289
  }
290
+ function getLastColumnRefField(columnRef) {
291
+ const fields = columnRef.ColumnRef.fields;
292
+ if (!fields || fields.length === 0) return null;
293
+ const lastField = fields[fields.length - 1];
294
+ if (isANode$1(lastField) && is$1(lastField, "String")) return lastField.String.sval || null;
295
+ return null;
296
+ }
297
+ function whereHasIsNotNull(whereClause, columnName) {
298
+ if (!whereClause) return false;
299
+ let found = false;
300
+ Walker.shallowMatch(whereClause, "NullTest", (node) => {
301
+ if (node.NullTest.nulltesttype === "IS_NOT_NULL" && node.NullTest.arg && is$1(node.NullTest.arg, "ColumnRef")) {
302
+ if (getLastColumnRefField(node.NullTest.arg) === columnName) found = true;
303
+ }
304
+ });
305
+ return found;
306
+ }
307
+ const AGGREGATE_FUNCTIONS = new Set([
308
+ "count",
309
+ "sum",
310
+ "avg",
311
+ "min",
312
+ "max",
313
+ "array_agg",
314
+ "string_agg",
315
+ "bool_and",
316
+ "bool_or",
317
+ "every"
318
+ ]);
319
+ function containsAggregate(node) {
320
+ if (!node || typeof node !== "object") return false;
321
+ if (Array.isArray(node)) return node.some(containsAggregate);
322
+ if (isANode$1(node) && is$1(node, "FuncCall")) {
323
+ const funcname = node.FuncCall.funcname;
324
+ if (funcname) {
325
+ for (const f of funcname) if (isANode$1(f) && is$1(f, "String") && AGGREGATE_FUNCTIONS.has(f.String.sval?.toLowerCase() ?? "")) return true;
326
+ }
327
+ }
328
+ if (isANode$1(node)) return containsAggregate(node[Object.keys(node)[0]]);
329
+ for (const child of Object.values(node)) if (containsAggregate(child)) return true;
330
+ return false;
331
+ }
190
332
  function countBoolOrConditions(node) {
191
333
  if (node.BoolExpr.boolop !== "OR_EXPR" || !node.BoolExpr.args) return 1;
192
334
  let count = 0;
@@ -194,6 +336,54 @@ function countBoolOrConditions(node) {
194
336
  else count += 1;
195
337
  return count;
196
338
  }
339
+ function isCountFuncCall(node) {
340
+ if (!node || typeof node !== "object") return false;
341
+ if (!isANode$1(node) || !is$1(node, "FuncCall")) return false;
342
+ const fc = node.FuncCall;
343
+ if (!(fc.funcname?.some((n) => is$1(n, "String") && n.String.sval === "count") ?? false)) return false;
344
+ if (fc.agg_star) return true;
345
+ if (fc.args && fc.args.length === 1 && isANode$1(fc.args[0]) && is$1(fc.args[0], "A_Const")) return true;
346
+ return false;
347
+ }
348
+ function isSubLinkWithCount(node) {
349
+ if (!node || typeof node !== "object") return false;
350
+ if (!isANode$1(node) || !is$1(node, "SubLink")) return false;
351
+ const subselect = node.SubLink.subselect;
352
+ if (!subselect || !isANode$1(subselect) || !is$1(subselect, "SelectStmt")) return false;
353
+ const targets = subselect.SelectStmt.targetList;
354
+ if (!targets || targets.length !== 1) return false;
355
+ const target = targets[0];
356
+ if (!isANode$1(target) || !is$1(target, "ResTarget") || !target.ResTarget.val) return false;
357
+ return isCountFuncCall(target.ResTarget.val);
358
+ }
359
+ function isCountExpression(node) {
360
+ return isCountFuncCall(node) || isSubLinkWithCount(node);
361
+ }
362
+ function getIntegerConstantValue(node) {
363
+ if (!node || typeof node !== "object") return null;
364
+ if (!isANode$1(node) || !is$1(node, "A_Const")) return null;
365
+ if (node.A_Const.ival === void 0) return null;
366
+ return node.A_Const.ival.ival ?? 0;
367
+ }
368
+ function isExistenceCheckPattern(lexpr, rexpr, op) {
369
+ if (isCountExpression(lexpr)) {
370
+ const val = getIntegerConstantValue(rexpr);
371
+ if (val !== null) {
372
+ if (op === ">" && val === 0) return true;
373
+ if (op === ">=" && val === 1) return true;
374
+ if ((op === "!=" || op === "<>") && val === 0) return true;
375
+ }
376
+ }
377
+ if (isCountExpression(rexpr)) {
378
+ const val = getIntegerConstantValue(lexpr);
379
+ if (val !== null) {
380
+ if (op === "<" && val === 0) return true;
381
+ if (op === "<=" && val === 1) return true;
382
+ if ((op === "!=" || op === "<>") && val === 0) return true;
383
+ }
384
+ }
385
+ return false;
386
+ }
197
387
 
198
388
  //#endregion
199
389
  //#region \0@oxc-project+runtime@0.112.0/helpers/typeof.js
@@ -657,6 +847,11 @@ var Analyzer = class {
657
847
  tags: [],
658
848
  queryWithoutTags: trimmedQuery
659
849
  };
850
+ const afterComment = trimmedQuery.slice(endPosition + 2).trim();
851
+ if (afterComment && afterComment !== ";") return {
852
+ tags: [],
853
+ queryWithoutTags: trimmedQuery
854
+ };
660
855
  const queryWithoutTags = trimmedQuery.slice(0, startPosition);
661
856
  const tagString = trimmedQuery.slice(startPosition + 2, endPosition).trim();
662
857
  if (!tagString || typeof tagString !== "string") return {
@@ -1557,6 +1752,9 @@ var Statistics = class Statistics {
1557
1752
  });
1558
1753
  }
1559
1754
  }
1755
+ const sample = columnStatsValues.find((v) => v.table_name === "users" && v.stakind3 !== 0);
1756
+ if (sample) console.log("[stats debug] sample stakind3:", sample.stakind3, "stanumbers3:", sample.stanumbers3);
1757
+ else console.log("[stats debug] no users column found with non-zero stakind3");
1560
1758
  /**
1561
1759
  * Postgres has 5 different slots for storing statistics per column and a potentially unlimited
1562
1760
  * number of statistic types to choose from. Each code in `stakindN` can mean different things.
@@ -1765,7 +1963,9 @@ var Statistics = class Statistics {
1765
1963
  returning starelid, staattnum, stainherit, stakind1, stakind2, stakind3, stakind4, stakind5
1766
1964
  )
1767
1965
  select * from updated union all (select * from inserted); -- @qd_introspection`;
1768
- columnStatsUpdatePromise = tx.exec(sql, [columnStatsValues]).catch((err) => {
1966
+ columnStatsUpdatePromise = tx.exec(sql, [columnStatsValues]).then((rows) => {
1967
+ console.log("[stats debug] restore result rows:", JSON.stringify(rows));
1968
+ }).catch((err) => {
1769
1969
  console.error("Something wrong wrong updating column stats");
1770
1970
  console.error(err);
1771
1971
  throw err;
@@ -1860,24 +2060,27 @@ var Statistics = class Statistics {
1860
2060
  'columnName', c.column_name,
1861
2061
  'stats', (
1862
2062
  SELECT json_build_object(
1863
- 'starelid', s.starelid,
1864
- 'staattnum', s.staattnum,
1865
- 'stanullfrac', s.stanullfrac,
1866
- 'stawidth', s.stawidth,
1867
- 'stadistinct', s.stadistinct,
1868
- 'stakind1', s.stakind1, 'staop1', s.staop1, 'stacoll1', s.stacoll1, 'stanumbers1', s.stanumbers1,
1869
- 'stakind2', s.stakind2, 'staop2', s.staop2, 'stacoll2', s.stacoll2, 'stanumbers2', s.stanumbers2,
1870
- 'stakind3', s.stakind3, 'staop3', s.staop3, 'stacoll3', s.stacoll3, 'stanumbers3', s.stanumbers3,
1871
- 'stakind4', s.stakind4, 'staop4', s.staop4, 'stacoll4', s.stacoll4, 'stanumbers4', s.stanumbers4,
1872
- 'stakind5', s.stakind5, 'staop5', s.staop5, 'stacoll5', s.stacoll5, 'stanumbers5', s.stanumbers5,
1873
- 'stavalues1', CASE WHEN $1 THEN s.stavalues1 ELSE NULL END,
1874
- 'stavalues2', CASE WHEN $1 THEN s.stavalues2 ELSE NULL END,
1875
- 'stavalues3', CASE WHEN $1 THEN s.stavalues3 ELSE NULL END,
1876
- 'stavalues4', CASE WHEN $1 THEN s.stavalues4 ELSE NULL END,
1877
- 'stavalues5', CASE WHEN $1 THEN s.stavalues5 ELSE NULL END
2063
+ 'starelid', cl.oid,
2064
+ 'staattnum', a.attnum,
2065
+ 'stanullfrac', ps.null_frac,
2066
+ 'stawidth', ps.avg_width,
2067
+ 'stadistinct', ps.n_distinct,
2068
+ 'stakind1', CASE WHEN ps.most_common_vals IS NOT NULL THEN 1 ELSE 0 END, 'staop1', 0, 'stacoll1', 0, 'stanumbers1', ps.most_common_freqs,
2069
+ 'stakind2', CASE WHEN ps.histogram_bounds IS NOT NULL THEN 2 ELSE 0 END, 'staop2', 0, 'stacoll2', 0, 'stanumbers2', NULL,
2070
+ 'stakind3', CASE WHEN ps.correlation IS NOT NULL THEN 3 ELSE 0 END, 'staop3', 0, 'stacoll3', 0, 'stanumbers3', CASE WHEN ps.correlation IS NOT NULL THEN ARRAY[ps.correlation]::float4[] ELSE NULL END,
2071
+ 'stakind4', CASE WHEN ps.most_common_elems IS NOT NULL THEN 4 ELSE 0 END, 'staop4', 0, 'stacoll4', 0,
2072
+ 'stanumbers4', ps.most_common_elem_freqs,
2073
+ 'stakind5', 0, 'staop5', 0, 'stacoll5', 0, 'stanumbers5', NULL,
2074
+ 'stavalues1', CASE WHEN $1 THEN ps.most_common_vals ELSE NULL END,
2075
+ 'stavalues2', CASE WHEN $1 THEN ps.histogram_bounds ELSE NULL END,
2076
+ 'stavalues3', NULL,
2077
+ 'stavalues4', CASE WHEN $1 THEN ps.most_common_elems ELSE NULL END,
2078
+ 'stavalues5', NULL
1878
2079
  )
1879
- FROM pg_statistic s
1880
- WHERE s.starelid = a.attrelid AND s.staattnum = a.attnum
2080
+ FROM pg_stats ps
2081
+ WHERE ps.schemaname = c.table_schema
2082
+ AND ps.tablename = c.table_name
2083
+ AND ps.attname = c.column_name
1881
2084
  )
1882
2085
  )
1883
2086
  ORDER BY c.ordinal_position