Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions changelogs/drizzle-kit/0.31.7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### Bug fixes

- Fixed `algorythm` => `algorithm` typo
3 changes: 3 additions & 0 deletions changelogs/drizzle-orm/0.45.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Fixed pg-native Pool detection in node-postgres transactions
- Allowed subqueries in select fields
- Updated typo algorythm => algorithm
2 changes: 1 addition & 1 deletion drizzle-kit/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "drizzle-kit",
"version": "0.31.6",
"version": "0.31.7",
"homepage": "https://orm.drizzle.team",
"keywords": [
"drizzle",
Expand Down
2 changes: 1 addition & 1 deletion drizzle-kit/src/serializer/mysqlSerializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ export const generateMySqlSnapshot = (
columns: indexColumns,
isUnique: value.config.unique ?? false,
using: value.config.using,
algorithm: value.config.algorythm,
algorithm: value.config.algorithm,
lock: value.config.lock,
};
});
Expand Down
2 changes: 1 addition & 1 deletion drizzle-kit/src/serializer/singlestoreSerializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ export const generateSingleStoreSnapshot = (
columns: indexColumns,
isUnique: value.config.unique ?? false,
using: value.config.using,
algorithm: value.config.algorythm,
algorithm: value.config.algorithm,
lock: value.config.lock,
};
});
Expand Down
2 changes: 1 addition & 1 deletion drizzle-orm/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "drizzle-orm",
"version": "0.44.7",
"version": "0.45.0",
"description": "Drizzle ORM package for SQL databases",
"type": "module",
"scripts": {
Expand Down
17 changes: 17 additions & 0 deletions drizzle-orm/src/gel-core/dialect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,23 @@ export class GelDialect {
// } else {
chunk.push(field);
// }
} else if (is(field, Subquery)) {
const entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];

if (entries.length === 1) {
const entry = entries[0]![1];

const fieldDecoder = is(entry, SQL)
? entry.decoder
: is(entry, Column)
? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }
: entry.sql.decoder;

if (fieldDecoder) {
field._.sql.decoder = fieldDecoder;
}
}
chunk.push(field);
}

if (i < columnsLen - 1) {
Expand Down
17 changes: 17 additions & 0 deletions drizzle-orm/src/mysql-core/dialect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,23 @@ export class MySqlDialect {
} else {
chunk.push(field);
}
} else if (is(field, Subquery)) {
const entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];

if (entries.length === 1) {
const entry = entries[0]![1];

const fieldDecoder = is(entry, SQL)
? entry.decoder
: is(entry, Column)
? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }
: entry.sql.decoder;

if (fieldDecoder) {
field._.sql.decoder = fieldDecoder;
}
}
chunk.push(field);
}

if (i < columnsLen - 1) {
Expand Down
8 changes: 4 additions & 4 deletions drizzle-orm/src/mysql-core/indexes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ interface IndexConfig {
using?: 'btree' | 'hash';

/**
* If set, the index will be created as `create index ... algorythm { 'default' | 'inplace' | 'copy' }`.
* If set, the index will be created as `create index ... algorithm { 'default' | 'inplace' | 'copy' }`.
*/
algorythm?: 'default' | 'inplace' | 'copy';
algorithm?: 'default' | 'inplace' | 'copy';

/**
* If set, adds locks to the index creation.
Expand Down Expand Up @@ -67,8 +67,8 @@ export class IndexBuilder implements AnyIndexBuilder {
return this;
}

algorythm(algorythm: IndexConfig['algorythm']): this {
this.config.algorythm = algorythm;
algorithm(algorithm: IndexConfig['algorithm']): this {
this.config.algorithm = algorithm;
return this;
}

Expand Down
5 changes: 3 additions & 2 deletions drizzle-orm/src/node-postgres/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { tracer } from '~/tracing.ts';
import { type Assume, mapResultRow } from '~/utils.ts';

const { Pool, types } = pg;
const NativePool = (<any> pg).native ? (<{ Pool: typeof Pool }> (<any> pg).native).Pool : undefined;

export type NodePgClient = pg.Pool | PoolClient | Client;

Expand Down Expand Up @@ -249,7 +250,7 @@ export class NodePgSession<
transaction: (tx: NodePgTransaction<TFullSchema, TSchema>) => Promise<T>,
config?: PgTransactionConfig | undefined,
): Promise<T> {
const session = this.client instanceof Pool // eslint-disable-line no-instanceof/no-instanceof
const session = (this.client instanceof Pool || (NativePool && this.client instanceof NativePool)) // eslint-disable-line no-instanceof/no-instanceof
? new NodePgSession(await this.client.connect(), this.dialect, this.schema, this.options)
: this;
const tx = new NodePgTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);
Expand All @@ -262,7 +263,7 @@ export class NodePgSession<
await tx.execute(sql`rollback`);
throw error;
} finally {
if (this.client instanceof Pool) { // eslint-disable-line no-instanceof/no-instanceof
if (this.client instanceof Pool || (NativePool && this.client instanceof NativePool)) { // eslint-disable-line no-instanceof/no-instanceof
(session.client as PoolClient).release();
}
}
Expand Down
5 changes: 3 additions & 2 deletions drizzle-orm/src/operations.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { AnyColumn, Column } from './column.ts';
import type { SQL } from './sql/sql.ts';
import type { Subquery } from './subquery.ts';
import type { Table } from './table.ts';

export type RequiredKeyOnly<TKey extends string, T extends Column> = T extends AnyColumn<{
Expand All @@ -25,7 +26,7 @@ export type OptionalKeyOnly<TKey extends string, T extends Column, OverrideT ext
// TODO: SQL -> SQLWrapper
export type SelectedFieldsFlat<TColumn extends Column> = Record<
string,
TColumn | SQL | SQL.Aliased
TColumn | SQL | SQL.Aliased | Subquery
>;

export type SelectedFieldsFlatFull<TColumn extends Column> = Record<
Expand All @@ -40,5 +41,5 @@ export type SelectedFields<TColumn extends Column, TTable extends Table> = Recor

export type SelectedFieldsOrdered<TColumn extends Column> = {
path: string[];
field: TColumn | SQL | SQL.Aliased;
field: TColumn | SQL | SQL.Aliased | Subquery;
}[];
17 changes: 17 additions & 0 deletions drizzle-orm/src/pg-core/dialect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,23 @@ export class PgDialect {
} else {
chunk.push(field);
}
} else if (is(field, Subquery)) {
const entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];

if (entries.length === 1) {
const entry = entries[0]![1];

const fieldDecoder = is(entry, SQL)
? entry.decoder
: is(entry, Column)
? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }
: entry.sql.decoder;

if (fieldDecoder) {
field._.sql.decoder = fieldDecoder;
}
}
chunk.push(field);
}

if (i < columnsLen - 1) {
Expand Down
11 changes: 6 additions & 5 deletions drizzle-orm/src/query-builders/select.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { SelectedFields } from '~/operations.ts';
import type { ColumnsSelection, SQL, View } from '~/sql/sql.ts';
import type { Subquery } from '~/subquery.ts';
import type { Table } from '~/table.ts';
import type { Assume, DrizzleTypeError, Equal, IsAny, Simplify } from '~/utils.ts';
import type { Assume, DrizzleTypeError, Equal, FromSingleKeyObject, IsAny, IsUnion, Not, Simplify } from '~/utils.ts';

export type JoinType = 'inner' | 'left' | 'right' | 'full' | 'cross';

Expand Down Expand Up @@ -44,10 +44,6 @@ export type SelectResult<
: TSelectMode extends 'single' ? SelectResultFields<TResult>
: ApplyNotNullMapToJoins<SelectResultFields<TResult>, TNullabilityMap>;

type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false : true;

type Not<T extends boolean> = T extends true ? false : true;

type SelectPartialResult<TFields, TNullability extends Record<string, JoinNullability>> = TNullability extends
TNullability ? {
[Key in keyof TFields]: TFields[Key] extends infer TField
Expand All @@ -61,6 +57,11 @@ type SelectPartialResult<TFields, TNullability extends Record<string, JoinNullab
? ApplyNullability<SelectResultField<TField>, TNullability[TField['_']['tableName']]>
: never
: TField extends SQL | SQL.Aliased ? SelectResultField<TField>
: TField extends Subquery ? FromSingleKeyObject<
TField['_']['selectedFields'],
TField['_']['selectedFields'] extends { [key: string]: infer TValue } ? SelectResultField<TValue> : never,
'You can only select one column in the subquery'
>
: TField extends Record<string, any>
? TField[keyof TField] extends AnyColumn<{ tableName: infer TTableName extends string }> | SQL | SQL.Aliased
? Not<IsUnion<TTableName>> extends true
Expand Down
17 changes: 17 additions & 0 deletions drizzle-orm/src/singlestore-core/dialect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,23 @@ export class SingleStoreDialect {
} else {
chunk.push(field);
}
} else if (is(field, Subquery)) {
const entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];

if (entries.length === 1) {
const entry = entries[0]![1];

const fieldDecoder = is(entry, SQL)
? entry.decoder
: is(entry, Column)
? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }
: entry.sql.decoder;

if (fieldDecoder) {
field._.sql.decoder = fieldDecoder;
}
}
chunk.push(field);
}

if (i < columnsLen - 1) {
Expand Down
8 changes: 4 additions & 4 deletions drizzle-orm/src/singlestore-core/indexes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ interface IndexConfig {
using?: 'btree' | 'hash';

/**
* If set, the index will be created as `create index ... algorythm { 'default' | 'inplace' | 'copy' }`.
* If set, the index will be created as `create index ... algorithm { 'default' | 'inplace' | 'copy' }`.
*/
algorythm?: 'default' | 'inplace' | 'copy';
algorithm?: 'default' | 'inplace' | 'copy';

/**
* If set, adds locks to the index creation.
Expand Down Expand Up @@ -67,8 +67,8 @@ export class IndexBuilder implements AnyIndexBuilder {
return this;
}

algorythm(algorythm: IndexConfig['algorythm']): this {
this.config.algorythm = algorythm;
algorithm(algorithm: IndexConfig['algorithm']): this {
this.config.algorithm = algorithm;
return this;
}

Expand Down
14 changes: 14 additions & 0 deletions drizzle-orm/src/sqlite-core/dialect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,20 @@ export abstract class SQLiteDialect {
chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
}
}
} else if (is(field, Subquery)) {
const entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];

if (entries.length === 1) {
const entry = entries[0]![1];

const fieldDecoder = is(entry, SQL)
? entry.decoder
: is(entry, Column)
? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }
: entry.sql.decoder;
if (fieldDecoder) field._.sql.decoder = fieldDecoder;
}
chunk.push(field);
}

if (i < columnsLen - 1) {
Expand Down
19 changes: 18 additions & 1 deletion drizzle-orm/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ export function mapResultRow<TResult>(
decoder = field;
} else if (is(field, SQL)) {
decoder = field.decoder;
} else if (is(field, Subquery)) {
decoder = field._.sql.decoder;
} else {
decoder = field.sql.decoder;
}
Expand Down Expand Up @@ -81,7 +83,7 @@ export function orderSelectedFields<TColumn extends AnyColumn>(
}

const newPath = pathPrefix ? [...pathPrefix, name] : [name];
if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased) || is(field, Subquery)) {
result.push({ path: newPath, field });
} else if (is(field, Table)) {
result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
Expand Down Expand Up @@ -146,6 +148,21 @@ export type Simplify<T> =
}
& {};

export type Not<T extends boolean> = T extends true ? false : true;

export type IsNever<T> = [T] extends [never] ? true : false;

export type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false
: true;

export type SingleKeyObject<T, TError extends string, K = keyof T> = IsNever<K> extends true ? never
: IsUnion<K> extends true ? DrizzleTypeError<TError>
: T;

export type FromSingleKeyObject<T, Result, TError extends string, K = keyof T> = IsNever<K> extends true ? never
: IsUnion<K> extends true ? DrizzleTypeError<TError>
: Result;

export type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;

export type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;
Expand Down
Loading
Loading