@valv/clickhouse
Advanced tools
| import type { FilterNode } from "@valv/core"; | ||
| export declare function quoteIdent(name: string): string; | ||
| export declare function escapeString(s: string): string; | ||
| export declare function escapeLikePattern(s: string): string; | ||
| export declare function formatValue(v: unknown): string; | ||
| export declare function compileFilter(node: FilterNode): string; | ||
| //# sourceMappingURL=sql.d.ts.map |
| {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAmB9C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAkDtD"} |
+93
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.quoteIdent = quoteIdent; | ||
| exports.escapeString = escapeString; | ||
| exports.escapeLikePattern = escapeLikePattern; | ||
| exports.formatValue = formatValue; | ||
| exports.compileFilter = compileFilter; | ||
| function quoteIdent(name) { | ||
| return "`" + name.replace(/`/g, "``") + "`"; | ||
| } | ||
| function escapeString(s) { | ||
| return s.replace(/\\/g, "\\\\").replace(/'/g, "\\'"); | ||
| } | ||
| function escapeLikePattern(s) { | ||
| return s.replace(/\\/g, "\\\\").replace(/%/g, "\\%").replace(/_/g, "\\_"); | ||
| } | ||
| function formatValue(v) { | ||
| if (v === null || v === undefined) | ||
| return "NULL"; | ||
| if (typeof v === "boolean") | ||
| return v ? "1" : "0"; | ||
| if (typeof v === "number") { | ||
| if (!isFinite(v)) | ||
| throw new Error(`Non-finite number value not allowed in query: ${v}`); | ||
| return String(v); | ||
| } | ||
| if (v instanceof Date) { | ||
| const pad = (n) => String(n).padStart(2, "0"); | ||
| const y = v.getUTCFullYear(); | ||
| const mo = pad(v.getUTCMonth() + 1); | ||
| const d = pad(v.getUTCDate()); | ||
| const h = pad(v.getUTCHours()); | ||
| const mi = pad(v.getUTCMinutes()); | ||
| const s = pad(v.getUTCSeconds()); | ||
| return `'${y}-${mo}-${d} ${h}:${mi}:${s}'`; | ||
| } | ||
| if (typeof v === "string") | ||
| return `'${escapeString(v)}'`; | ||
| return `'${escapeString(JSON.stringify(v))}'`; | ||
| } | ||
| function compileFilter(node) { | ||
| switch (node.type) { | ||
| case "eq": | ||
| if (node.value === null || node.value === undefined) { | ||
| return `${quoteIdent(node.field)} IS NULL`; | ||
| } | ||
| return `${quoteIdent(node.field)} = ${formatValue(node.value)}`; | ||
| case "in": { | ||
| if (node.values.length === 0) | ||
| return "1 = 0"; | ||
| const list = node.values.map(formatValue).join(", "); | ||
| return `${quoteIdent(node.field)} IN (${list})`; | ||
| } | ||
| case "range": { | ||
| const parts = []; | ||
| if (node.gte !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} >= ${formatValue(node.gte)}`); | ||
| if (node.lte !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} <= ${formatValue(node.lte)}`); | ||
| if (node.gt !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} > ${formatValue(node.gt)}`); | ||
| if (node.lt !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} < ${formatValue(node.lt)}`); | ||
| return parts.join(" AND "); | ||
| } | ||
| case "like": { | ||
| const escaped = escapeLikePattern(node.value); | ||
| let pattern; | ||
| if (node.mode === "startsWith") | ||
| pattern = `${escaped}%`; | ||
| else if (node.mode === "endsWith") | ||
| pattern = `%${escaped}`; | ||
| else | ||
| pattern = `%${escaped}%`; | ||
| return `${quoteIdent(node.field)} ILIKE '${escapeString(pattern)}'`; | ||
| } | ||
| case "null": | ||
| return node.isNull | ||
| ? `${quoteIdent(node.field)} IS NULL` | ||
| : `${quoteIdent(node.field)} IS NOT NULL`; | ||
| case "and": | ||
| if (node.filters.length === 0) | ||
| return "1 = 1"; | ||
| return "(" + node.filters.map(compileFilter).join(" AND ") + ")"; | ||
| case "or": | ||
| if (node.filters.length === 0) | ||
| return "1 = 0"; | ||
| return "(" + node.filters.map(compileFilter).join(" OR ") + ")"; | ||
| case "not": | ||
| return `NOT (${compileFilter(node.filter)})`; | ||
| } | ||
| } | ||
| //# sourceMappingURL=sql.js.map |
| {"version":3,"file":"sql.js","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":";;AAEA,gCAEC;AAED,oCAEC;AAED,8CAEC;AAED,kCAmBC;AAED,sCAkDC;AAnFD,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAA;AAC7C,CAAC;AAED,SAAgB,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACtD,CAAC;AAED,SAAgB,iBAAiB,CAAC,CAAS;IACzC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAC3E,CAAC;AAED,SAAgB,WAAW,CAAC,CAAU;IACpC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IAChD,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,EAAE,CAAC,CAAA;QACvF,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACrD,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAA;QAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAA;QAChC,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAA;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAA;IACxD,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAC/C,CAAC;AAED,SAAgB,aAAa,CAAC,IAAgB;IAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,IAAI;YACP,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACpD,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;YAC5C,CAAC;YACD,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;QAEjE,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAA;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpD,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAA;QACjD,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrE,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrE,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAC5F,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAC5F,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC7C,IAAI,OAAe,CAAA;YACnB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO,GAAG,GAAG,OAAO,GAAG,CAAA;iBAClD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;;gBACrD,OAAO,GAAG,IAAI,OAAO,GAAG,CAAA;YAC7B,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,YAAY,CAAC,OAAO,CAAC,GAAG,CAAA;QACrE,CAAC;QAED,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,MAAM;gBAChB,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;gBACrC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAA;QAE7C,KAAK,KAAK;YACR,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAA;YAC7C,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAA;QAElE,KAAK,IAAI;YACP,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAA;YAC7C,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA;QAEjE,KAAK,KAAK;YACR,OAAO,QAAQ,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;IAChD,CAAC;AACH,CAAC"} |
@@ -7,2 +7,8 @@ import type { ValvAdapter, SchemaMap, Query, CompiledQuery, FnDef, InjectedMutation, MutationResult } from "@valv/core"; | ||
| schema?: SchemaMap; | ||
| /** | ||
| * Per-query wall-clock cap in milliseconds (`max_execution_time`). Defaults to | ||
| * 30000. Raise it for heavier analytical workloads; keep it low to bound a | ||
| * query that would otherwise full-scan a huge table. | ||
| */ | ||
| statementTimeoutMs?: number; | ||
| } | ||
@@ -9,0 +15,0 @@ export declare class ClickHouseAdapter implements ValvAdapter { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,KAAK,EACL,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAG7E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAaD,qBAAa,iBAAkB,YAAW,WAAW;IAIjD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IAJjB,OAAO,CAAC,WAAW,CAAyB;gBAGlC,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,wBAA6B;IAG1C,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAMtC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,aAAa;IAIxD,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAO5B,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC;IAarF;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAS3E"} | ||
| {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,KAAK,EACL,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAG7E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAaD,qBAAa,iBAAkB,YAAW,WAAW;IAIjD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IAJjB,OAAO,CAAC,WAAW,CAAyB;gBAGlC,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,wBAA6B;IAG1C,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAMtC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,aAAa;IAIxD,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAO5B,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC;IAarF;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAc3E"} |
+10
-7
@@ -7,8 +7,7 @@ "use strict"; | ||
| const dialect_1 = require("./dialect"); | ||
| // Per-query safety caps so a structurally-valid query can't run away on the | ||
| // server. They bound wall-clock and result size — a tiny `WHERE col > x` that | ||
| // would otherwise full-scan a billion-row table is killed at 30s. Conservative | ||
| // defaults; raise per deployment if real analytics needs more headroom. | ||
| const QUERY_SETTINGS = { | ||
| max_execution_time: 30, | ||
| const DEFAULT_STATEMENT_TIMEOUT_MS = 30000; | ||
| // Result-size caps so a structurally-valid query can't run away on the server — | ||
| // they bound how much a single query may return. The wall-clock cap | ||
| // (`max_execution_time`) is added per query from `statementTimeoutMs`. | ||
| const RESULT_CAPS = { | ||
| max_result_rows: 10000, | ||
@@ -59,3 +58,7 @@ max_result_bytes: 100000000, | ||
| format: "JSONEachRow", | ||
| clickhouse_settings: QUERY_SETTINGS, | ||
| // ClickHouse takes max_execution_time in seconds; the option is in ms. | ||
| clickhouse_settings: { | ||
| ...RESULT_CAPS, | ||
| max_execution_time: (this.options.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS) / 1000, | ||
| }, | ||
| ...(parameters.length ? { query_params: toQueryParams(parameters) } : {}), | ||
@@ -62,0 +65,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,KAAK,YAAY,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,GACzE,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,GAAG;IACzC,yEAAyE;IACzE,MAAM,EAAE,YAAY,GAAG,SAAS,CAAA;CACjC,CAAA;AAEH;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,GAAG,cAAc,EACxD,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAWjC"} | ||
| {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,KAAK,YAAY,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,GACzE,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,GAAG;IACzC,yEAAyE;IACzE,MAAM,EAAE,YAAY,GAAG,SAAS,CAAA;CACjC,CAAA;AAEH;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,GAAG,cAAc,EACxD,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAYjC"} |
+2
-1
@@ -12,3 +12,3 @@ "use strict"; | ||
| async function createValv(client, config) { | ||
| const { database, schema, ...rest } = config; | ||
| const { database, schema, statementTimeoutMs, ...rest } = config; | ||
| const valv = new core_1.Valv({ | ||
@@ -19,2 +19,3 @@ ...rest, | ||
| schema: schema === "introspect" ? undefined : schema, | ||
| statementTimeoutMs, | ||
| }), | ||
@@ -21,0 +22,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":";;AAgBA,gCAcC;AA9BD,qCAAiC;AAEjC,uCAA4E;AAS5E;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAC9B,MAAwB,EACxB,MAA8B;IAE9B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;IAC5C,MAAM,IAAI,GAAG,IAAI,WAAI,CAAmB;QACtC,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,2BAAiB,CAAC,MAAM,EAAE;YACrC,QAAQ;YACR,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;SACrD,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IACvB,OAAO,IAAI,CAAA;AACb,CAAC"} | ||
| {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":";;AAgBA,gCAeC;AA/BD,qCAAiC;AAEjC,uCAA4E;AAS5E;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAC9B,MAAwB,EACxB,MAA8B;IAE9B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;IAChE,MAAM,IAAI,GAAG,IAAI,WAAI,CAAmB;QACtC,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,2BAAiB,CAAC,MAAM,EAAE;YACrC,QAAQ;YACR,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACpD,kBAAkB;SACnB,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IACvB,OAAO,IAAI,CAAA;AACb,CAAC"} |
+2
-2
| { | ||
| "name": "@valv/clickhouse", | ||
| "version": "0.7.1", | ||
| "version": "0.8.0", | ||
| "description": "ClickHouse adapter for valv — row-level security and access control for AI agents", | ||
@@ -43,3 +43,3 @@ "keywords": [ | ||
| "@clickhouse/client": "^1.0.0", | ||
| "@valv/core": "^0.8.1" | ||
| "@valv/core": "^0.9.0" | ||
| }, | ||
@@ -46,0 +46,0 @@ "publishConfig": { |
| import type { Dialect } from "@valv/core"; | ||
| export declare const clickhouseDialect: Dialect; | ||
| //# sourceMappingURL=emit.d.ts.map |
| {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAUzC,eAAO,MAAM,iBAAiB,EAAE,OAqC/B,CAAA"} |
-48
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.clickhouseDialect = void 0; | ||
| const INTERVAL_UNITS = ["second", "minute", "hour", "day", "week", "month", "quarter", "year"]; | ||
| // ClickHouse uses backtick identifiers (escaping `\` then `` ` ``) and typed | ||
| // named placeholders `{pN:Type}`. The type is the one schema-derived string that | ||
| // reaches SQL, so its characters are allowlisted — a malformed hand-defined type | ||
| // can't break out of the placeholder. | ||
| const SAFE_TYPE = /^[A-Za-z0-9_(), '=]+$/; | ||
| exports.clickhouseDialect = { | ||
| quoteId(id) { | ||
| return "`" + id.replace(/\\/g, "\\\\").replace(/`/g, "``") + "`"; | ||
| }, | ||
| placeholder(index, type) { | ||
| if (!SAFE_TYPE.test(type)) { | ||
| throw new Error(`[valv/clickhouse] unsafe column type "${type}"`); | ||
| } | ||
| return `{p${index}:${type}}`; | ||
| }, | ||
| functions: { | ||
| // Parametric aggregate: quantileTiming(level)(column). `level` is a finite | ||
| // number in [0, 1], so inlining it can't carry SQL. | ||
| quantileTiming: { | ||
| args: [{ kind: "number", range: [0, 1] }, { kind: "column" }], | ||
| render: ([level, c]) => `quantileTiming(${level})(${c})`, | ||
| }, | ||
| // Time bucketing for series — fixed grains. | ||
| toDate: { args: [{ kind: "column" }], render: ([c]) => `toDate(${c})` }, | ||
| toStartOfHour: { args: [{ kind: "column" }], render: ([c]) => `toStartOfHour(${c})` }, | ||
| toStartOfDay: { args: [{ kind: "column" }], render: ([c]) => `toStartOfDay(${c})` }, | ||
| // Arbitrary-grain bucketing: toStartOfInterval(ts, INTERVAL n unit). The unit | ||
| // is membership-checked, the magnitude is a finite number — both safe inlined. | ||
| toStartOfInterval: { | ||
| args: [{ kind: "column" }, { kind: "number" }, { kind: "enum", values: INTERVAL_UNITS }], | ||
| render: ([c, n, unit]) => `toStartOfInterval(${c}, INTERVAL ${n} ${unit.toUpperCase()})`, | ||
| }, | ||
| // Distinct counts. | ||
| uniqExact: { args: [{ kind: "column" }], render: ([c]) => `uniqExact(${c})` }, | ||
| uniq: { args: [{ kind: "column" }], render: ([c]) => `uniq(${c})` }, | ||
| // Conditional aggregation — the predicate's literals become bound params. | ||
| countIf: { args: [{ kind: "predicate" }], render: ([p]) => `countIf(${p})` }, | ||
| sumIf: { | ||
| args: [{ kind: "column" }, { kind: "predicate" }], | ||
| render: ([c, p]) => `sumIf(${c}, ${p})`, | ||
| }, | ||
| }, | ||
| }; | ||
| //# sourceMappingURL=emit.js.map |
| {"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"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"} |
47367
8.85%562
11.73%