← Files RivetARCHIVED FILE
node_modules/drizzle-orm/sql/sql.cjs
17 KB · Nov 5, 2026 · 12:09 UTC
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
const require_column = require('../column.cjs');
const require_table = require('../table.cjs');
let __entity_ts = require("../entity.cjs");
let __subquery_ts = require("../subquery.cjs");
let __table_utils_ts = require("../table.utils.cjs");
let __tracing_ts = require("../tracing.cjs");
let __view_common_ts = require("../view-common.cjs");
//#region src/sql/sql.ts
/**
* This class is used to indicate a primitive param value that is used in `sql` tag.
* It is only used on type level and is never instantiated at runtime.
* If you see a value of this type in the code, its runtime value is actually the primitive param value.
*/
var FakePrimitiveParam = class {
static [__entity_ts.entityKind] = "FakePrimitiveParam";
};
function isSQLWrapper(value) {
return value !== null && value !== void 0 && typeof value.getSQL === "function";
}
function mergeQueries(queries) {
const result = {
sql: "",
params: []
};
for (const query of queries) {
result.sql += query.sql;
result.params.push(...query.params);
}
return result;
}
function _mergeQueries(queries) {
const result = {
sql: "",
params: []
};
const sqls = [];
for (const query of queries) {
sqls.push(query.sql);
result.params.push(...query.params);
}
result._sql = Object.assign(sqls, { raw: sqls });
return result;
}
var StringChunk = class {
static [__entity_ts.entityKind] = "StringChunk";
value;
constructor(value) {
this.value = Array.isArray(value) ? value : [value];
}
getSQL() {
return new SQL([this]);
}
};
var SQL = class SQL {
static [__entity_ts.entityKind] = "SQL";
/** @internal */
decoder = noopDecoder;
/** @internal */
shouldInlineParams = false;
/** @internal */
usedTables = [];
constructor(queryChunks) {
this.queryChunks = queryChunks;
for (const chunk of queryChunks) if ((0, __entity_ts.is)(chunk, require_table.Table)) {
const schemaName = chunk[require_table.Table.Symbol.Schema];
this.usedTables.push(schemaName === void 0 ? chunk[require_table.Table.Symbol.Name] : schemaName + "." + chunk[require_table.Table.Symbol.Name]);
}
}
append(query) {
this.queryChunks.push(...query.queryChunks);
return this;
}
toQuery(config) {
return __tracing_ts.tracer.startActiveSpan("drizzle.buildSQL", (span) => {
const query = this.buildQueryFromSourceParams(this.queryChunks, config);
span?.setAttributes({
"drizzle.query.text": query.sql,
"drizzle.query.params": JSON.stringify(query.params)
});
return query;
});
}
buildQueryFromSourceParams(chunks, _config) {
const config = Object.assign({}, _config, {
inlineParams: _config.inlineParams || this.shouldInlineParams,
paramStartIndex: _config.paramStartIndex || { value: 0 }
});
const { escapeName, escapeParam, codecs, inlineParams, paramStartIndex, invokeSource } = config;
const mappedChunks = chunks.map((chunk) => {
if ((0, __entity_ts.is)(chunk, StringChunk)) return {
sql: chunk.value.join(""),
params: []
};
if ((0, __entity_ts.is)(chunk, Name)) return {
sql: escapeName(chunk.value),
params: []
};
if (chunk === void 0) return {
sql: "",
params: []
};
if (Array.isArray(chunk)) {
const result = [new StringChunk("(")];
for (const [i, p] of chunk.entries()) {
result.push(p);
if (i < chunk.length - 1) result.push(new StringChunk(", "));
}
result.push(new StringChunk(")"));
return this.buildQueryFromSourceParams(result, config);
}
if ((0, __entity_ts.is)(chunk, SQL)) return this.buildQueryFromSourceParams(chunk.queryChunks, {
...config,
inlineParams: inlineParams || chunk.shouldInlineParams
});
if ((0, __entity_ts.is)(chunk, require_table.Table)) {
const schemaName = chunk[require_table.Table.Symbol.Schema];
const tableName = chunk[require_table.Table.Symbol.Name];
if (invokeSource === "mssql-view-with-schemabinding") return {
sql: (schemaName === void 0 ? escapeName("dbo") : escapeName(schemaName)) + "." + escapeName(tableName),
params: []
};
return {
sql: schemaName === void 0 || chunk[require_table.IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
params: []
};
}
if ((0, __entity_ts.is)(chunk, require_column.Column)) {
const columnName = chunk.name;
if (_config.invokeSource === "indexes") return {
sql: escapeName(columnName),
params: []
};
const schemaName = invokeSource === "mssql-check" ? void 0 : chunk.table[require_table.Table.Symbol.Schema];
return {
sql: chunk.isAlias ? escapeName(chunk.name) : chunk.table[require_table.IsAlias] || schemaName === void 0 ? escapeName(chunk.table[require_table.Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[require_table.Table.Symbol.Name]) + "." + escapeName(columnName),
params: []
};
}
if ((0, __entity_ts.is)(chunk, View)) {
const schemaName = chunk[__view_common_ts.ViewBaseConfig].schema;
const viewName = chunk[__view_common_ts.ViewBaseConfig].name;
return {
sql: schemaName === void 0 || chunk[__view_common_ts.ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
params: []
};
}
if ((0, __entity_ts.is)(chunk, Param)) {
if ((0, __entity_ts.is)(chunk.value, SQL)) return this.buildQueryFromSourceParams([chunk.value], config);
const useCodecs = codecs && (0, __entity_ts.is)(chunk.encoder, require_column.Column);
if ((0, __entity_ts.is)(chunk.value, Placeholder)) {
const escaped = escapeParam(paramStartIndex.value++, chunk);
chunk.codec = useCodecs ? (value) => codecs.apply(chunk.encoder, "normalizeParam", value) : void 0;
return {
sql: useCodecs ? codecs.apply(chunk.encoder, "castParam", escaped) : escaped,
params: [chunk]
};
}
let mappedValue;
if (chunk.value === null) mappedValue = chunk.value;
else {
mappedValue = chunk.encoder.mapToDriverValue.isNoop ? chunk.value : chunk.encoder.mapToDriverValue(chunk.value);
if ((0, __entity_ts.is)(mappedValue, SQL)) return this.buildQueryFromSourceParams([mappedValue], config);
if (useCodecs) mappedValue = codecs.apply(chunk.encoder, "normalizeParam", mappedValue);
}
if (inlineParams) return {
sql: this.mapInlineParam(mappedValue, config),
params: []
};
const escaped = escapeParam(paramStartIndex.value++, mappedValue);
return {
sql: useCodecs ? codecs.apply(chunk.encoder, "castParam", escaped) : escaped,
params: [mappedValue]
};
}
if ((0, __entity_ts.is)(chunk, Placeholder)) return {
sql: escapeParam(paramStartIndex.value++, chunk),
params: [chunk]
};
if ((0, __entity_ts.is)(chunk, SQL.Aliased) && chunk.fieldAlias !== void 0) return {
sql: (chunk.origin !== void 0 ? escapeName(chunk.origin) + "." : "") + escapeName(chunk.fieldAlias),
params: []
};
if ((0, __entity_ts.is)(chunk, __subquery_ts.Subquery)) {
if (chunk._.isWith) return {
sql: escapeName(chunk._.alias),
params: []
};
return this.buildQueryFromSourceParams([
new StringChunk("("),
chunk._.sql,
new StringChunk(") "),
new Name(chunk._.alias)
], config);
}
if (typeof chunk === "function" && "enumName" in chunk) {
if ("schema" in chunk && chunk.schema) return {
sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName),
params: []
};
return {
sql: escapeName(chunk.enumName),
params: []
};
}
if (isSQLWrapper(chunk)) {
if (chunk.shouldOmitSQLParens?.()) return this.buildQueryFromSourceParams([chunk.getSQL()], config);
return this.buildQueryFromSourceParams([
new StringChunk("("),
chunk.getSQL(),
new StringChunk(")")
], config);
}
if (inlineParams) return {
sql: this.mapInlineParam(chunk, config),
params: []
};
return {
sql: escapeParam(paramStartIndex.value++, chunk),
params: [chunk]
};
});
if (_config.tagged) return _mergeQueries(mappedChunks);
return mergeQueries(mappedChunks);
}
mapInlineParam(chunk, { escapeString }) {
if (chunk === null) return "null";
if (typeof chunk === "number" || typeof chunk === "boolean" || typeof chunk === "bigint") return chunk.toString();
if (typeof chunk === "string") return escapeString(chunk);
if (typeof chunk === "object") {
const mappedValueAsString = chunk.toString();
if (mappedValueAsString === "[object Object]") return escapeString(JSON.stringify(chunk));
return escapeString(mappedValueAsString);
}
throw new Error("Unexpected param value: " + chunk);
}
getSQL() {
return this;
}
as(alias) {
if (alias === void 0) return this;
return new SQL.Aliased(this, alias);
}
mapWith(decoder) {
this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
return this;
}
nullable() {
return this;
}
inlineParams() {
this.shouldInlineParams = true;
return this;
}
/**
* This method is used to conditionally include a part of the query.
*
* @param condition - Condition to check
* @returns itself if the condition is `true`, otherwise `undefined`
*/
if(condition) {
return condition ? this : void 0;
}
};
/**
* Any DB name (table, column, index etc.)
*/
var Name = class {
static [__entity_ts.entityKind] = "Name";
brand;
constructor(value) {
this.value = value;
}
getSQL() {
return new SQL([this]);
}
};
/**
* Any DB name (table, column, index etc.)
* @deprecated Use `sql.identifier` instead.
*/
function name(value) {
return new Name(value);
}
function isDriverValueEncoder(value) {
return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
}
const noopDecoder = { mapFromDriverValue: (value) => value };
noopDecoder.mapFromDriverValue.isNoop = true;
const noopEncoder = { mapToDriverValue: (value) => value };
noopEncoder.mapToDriverValue.isNoop = true;
function isNoop(mapper) {
return mapper.isNoop;
}
const noopMapper = {
...noopDecoder,
...noopEncoder
};
/** Parameter value that is optionally bound to an encoder (for example, a column). */
var Param = class {
static [__entity_ts.entityKind] = "Param";
brand;
/**
* @param value - Parameter value
* @param encoder - Encoder to convert the value to a driver parameter
*/
constructor(value, encoder = noopEncoder, codec) {
this.value = value;
this.encoder = encoder;
this.codec = codec;
}
getSQL() {
return new SQL([this]);
}
};
/** @deprecated Use `sql.param` instead. */
function param(value, encoder) {
return new Param(value, encoder);
}
function sql(strings, ...params) {
const queryChunks = [];
if (params.length > 0 || strings.length > 0 && strings[0] !== "") queryChunks.push(new StringChunk(strings[0]));
for (const [paramIndex, param] of params.entries()) queryChunks.push(param, new StringChunk(strings[paramIndex + 1]));
return new SQL(queryChunks);
}
(function(_sql) {
function empty() {
return new SQL([]);
}
_sql.empty = empty;
function fromList(list) {
return new SQL(list);
}
_sql.fromList = fromList;
function raw(str) {
return new SQL([new StringChunk(str)]);
}
_sql.raw = raw;
function join(chunks, separator) {
const result = [];
for (const [i, chunk] of chunks.entries()) {
if (i > 0 && separator !== void 0) result.push(separator);
result.push(chunk);
}
return new SQL(result);
}
_sql.join = join;
function identifier(value) {
return new Name(value);
}
_sql.identifier = identifier;
function placeholder(name) {
return new Placeholder(name);
}
_sql.placeholder = placeholder;
function param(value, encoder) {
return new Param(value, encoder);
}
_sql.param = param;
function comment(input) {
const encoded = sqlCommenter(input);
if (!encoded.length) return void 0;
return sql.raw(encoded);
}
_sql.comment = comment;
})(sql || (sql = {}));
function sqlCommenter(input) {
const encoded = sqlCommenter.encodeInput(input);
if (!encoded.length) return "";
return `/*${encoded}*/`;
}
(function(_sqlCommenter) {
function merge(input1, input2) {
let encoded;
if (typeof input1 === "object" && typeof input2 === "object") encoded = encodeInput({
...input1,
...input2
});
else if (input1 && input2) encoded = [encodeInput(input1), encodeInput(input2)].filter((i) => i.length).join(",");
else if (input2) encoded = encodeInput(input2);
else if (input1) encoded = encodeInput(input1);
else return "";
if (!encoded.length) return "";
return `/*${encoded}*/`;
}
_sqlCommenter.merge = merge;
function encodeInput(input) {
if (typeof input === "string") {
if (!input.length) return input;
return sanitizeStringInput(input);
}
const parts = [];
for (const [key, value] of Object.entries(input)) {
if (value === null || value === void 0 || value === "") continue;
const encodedKey = sanitizeObjectElement(key);
const encodedValue = sanitizeObjectElement(String(value));
parts.push(`${encodedKey}='${encodedValue}'`);
}
if (!parts.length) return "";
return parts.sort().join(",");
}
_sqlCommenter.encodeInput = encodeInput;
function sanitizeObjectElement(key) {
return encodeURIComponent(key).replace(/'/g, `\\'`);
}
_sqlCommenter.sanitizeObjectElement = sanitizeObjectElement;
function sanitizeStringInput(input) {
return input.replace(/\/\*/g, "/ *").replace(/\*\//g, "* /");
}
_sqlCommenter.sanitizeStringInput = sanitizeStringInput;
})(sqlCommenter || (sqlCommenter = {}));
(function(_SQL) {
class Aliased {
static [__entity_ts.entityKind] = "SQL.Aliased";
/** @internal */
isSelectionField = false;
/** @internal */
origin;
constructor(sql, fieldAlias) {
this.sql = sql;
this.fieldAlias = fieldAlias;
}
getSQL() {
return this.sql;
}
/** @internal */
clone() {
return new Aliased(this.sql, this.fieldAlias);
}
}
_SQL.Aliased = Aliased;
})(SQL || (SQL = {}));
var Placeholder = class {
static [__entity_ts.entityKind] = "Placeholder";
constructor(name) {
this.name = name;
}
getSQL() {
return new SQL([this]);
}
};
/** @deprecated Use `sql.placeholder` instead. */
function placeholder(name) {
return new Placeholder(name);
}
function fillPlaceholders(params, values) {
return params.map((p) => {
if ((0, __entity_ts.is)(p, Placeholder)) {
if (!(p.name in values)) throw new Error(`No value for placeholder "${p.name}" was provided`);
return values[p.name];
}
if ((0, __entity_ts.is)(p, Param) && (0, __entity_ts.is)(p.value, Placeholder)) {
if (!(p.value.name in values)) throw new Error(`No value for placeholder "${p.value.name}" was provided`);
const value = values[p.value.name];
if (value === null) return value;
const mapped = p.encoder.mapToDriverValue.isNoop ? value : p.encoder.mapToDriverValue(value);
return p.codec ? p.codec(mapped) : mapped;
}
return p;
});
}
const IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
var View = class {
static [__entity_ts.entityKind] = "View";
/** @internal */
[__view_common_ts.ViewBaseConfig];
/** @internal */
[IsDrizzleView] = true;
/** @internal */
get [__table_utils_ts.TableName]() {
return this[__view_common_ts.ViewBaseConfig].name;
}
/** @internal */
get [require_table.TableSchema]() {
return this[__view_common_ts.ViewBaseConfig].schema;
}
/** @internal */
get [require_table.IsAlias]() {
return this[__view_common_ts.ViewBaseConfig].isAlias;
}
/** @internal */
get [require_table.OriginalName]() {
return this[__view_common_ts.ViewBaseConfig].originalName;
}
/** @internal */
get [require_table.TableColumns]() {
return this[__view_common_ts.ViewBaseConfig].selectedFields;
}
constructor({ name, schema, selectedFields, query }) {
this[__view_common_ts.ViewBaseConfig] = {
name,
originalName: name,
schema,
selectedFields,
query,
isExisting: !query,
isAlias: false
};
}
};
function isView(view) {
return typeof view === "object" && view !== null && IsDrizzleView in view;
}
function getViewName(view) {
return view[__view_common_ts.ViewBaseConfig].name;
}
require_column.Column.prototype.getSQL = function() {
return new SQL([this]);
};
__subquery_ts.Subquery.prototype.getSQL = function() {
return new SQL([this]);
};
//#endregion
exports.FakePrimitiveParam = FakePrimitiveParam;
exports.Name = Name;
exports.Param = Param;
exports.Placeholder = Placeholder;
Object.defineProperty(exports, 'SQL', {
enumerable: true,
get: function () {
return SQL;
}
});
exports.StringChunk = StringChunk;
exports.View = View;
exports.fillPlaceholders = fillPlaceholders;
exports.getViewName = getViewName;
exports.isDriverValueEncoder = isDriverValueEncoder;
exports.isNoop = isNoop;
exports.isSQLWrapper = isSQLWrapper;
exports.isView = isView;
exports.name = name;
exports.noopDecoder = noopDecoder;
exports.noopEncoder = noopEncoder;
exports.noopMapper = noopMapper;
exports.param = param;
exports.placeholder = placeholder;
Object.defineProperty(exports, 'sql', {
enumerable: true,
get: function () {
return sql;
}
});
Object.defineProperty(exports, 'sqlCommenter', {
enumerable: true,
get: function () {
return sqlCommenter;
}
});
//# sourceMappingURL=sql.cjs.mapSHA-256: bbaac949442eb8e7a34cc99199591ca892997a09fbb0430aad69e7f2a5dded72