Skip to content

Commit e5597eb

Browse files
Merge pull request #497 from drizzle-team/placeholders-limit-offset
Add placeholders in limit and offset
2 parents 071f463 + 6eae16f commit e5597eb

File tree

7 files changed

+171
-4
lines changed

7 files changed

+171
-4
lines changed

changelogs/drizzle-orm/0.24.5.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
- Add possibility to have placeholders in `.limit()` and `.offset()`
2+
3+
```ts
4+
const stmt = db
5+
.select({
6+
id: usersTable.id,
7+
name: usersTable.name,
8+
})
9+
.from(usersTable)
10+
.limit(placeholder('limit'))
11+
.offset(placeholder('offset'))
12+
.prepare('stmt');
13+
14+
const result = await stmt.execute({ limit: 1, offset: 1 });
15+
```

drizzle-orm/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "drizzle-orm",
3-
"version": "0.24.4",
3+
"version": "0.24.5",
44
"description": "Drizzle ORM package for SQL databases",
55
"scripts": {
66
"build": "tsc && resolve-tspaths && cp ../README.md package.json dist/",

drizzle-orm/src/pg-core/query-builders/select.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import type {
1515
SelectResult,
1616
} from '~/query-builders/select.types';
1717
import { QueryPromise } from '~/query-promise';
18-
import { type Query, SQL } from '~/sql';
18+
import { type Query, SQL, type Placeholder } from '~/sql';
1919
import { SelectionProxyHandler, Subquery, SubqueryConfig } from '~/subquery';
2020
import { Table } from '~/table';
2121
import { applyMixins, getTableColumns, getTableLikeName, type Simplify, type ValueOrArray } from '~/utils';
@@ -279,12 +279,12 @@ export abstract class PgSelectQueryBuilder<
279279
return this;
280280
}
281281

282-
limit(limit: number) {
282+
limit(limit: number | Placeholder) {
283283
this.config.limit = limit;
284284
return this;
285285
}
286286

287-
offset(offset: number) {
287+
offset(offset: number | Placeholder) {
288288
this.config.offset = offset;
289289
return this;
290290
}

integration-tests/tests/pg-schema.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,44 @@ test.serial('prepared statement', async (t) => {
529529
t.deepEqual(result, [{ id: 1, name: 'John' }]);
530530
});
531531

532+
test.serial('prepared statement with placeholder in .limit', async (t) => {
533+
const { db } = t.context;
534+
535+
await db.insert(usersTable).values({ name: 'John' });
536+
const stmt = db
537+
.select({
538+
id: usersTable.id,
539+
name: usersTable.name,
540+
})
541+
.from(usersTable)
542+
.where(eq(usersTable.id, placeholder('id')))
543+
.limit(placeholder('limit'))
544+
.prepare('stmt_limit');
545+
546+
const result = await stmt.execute({ id: 1, limit: 1 });
547+
548+
t.deepEqual(result, [{ id: 1, name: 'John' }]);
549+
t.is(result.length, 1);
550+
});
551+
552+
test.serial('prepared statement with placeholder in .offset', async (t) => {
553+
const { db } = t.context;
554+
555+
await db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);
556+
const stmt = db
557+
.select({
558+
id: usersTable.id,
559+
name: usersTable.name,
560+
})
561+
.from(usersTable)
562+
.offset(placeholder('offset'))
563+
.prepare('stmt_offset');
564+
565+
const result = await stmt.execute({ offset: 1 });
566+
567+
t.deepEqual(result, [{ id: 2, name: 'John1' }]);
568+
});
569+
532570
test.serial('prepared statement reuse', async (t) => {
533571
const { db } = t.context;
534572

integration-tests/tests/pg.custom.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,44 @@ test.serial('prepared statement with placeholder in .where', async (t) => {
566566
t.deepEqual(result, [{ id: 1, name: 'John' }]);
567567
});
568568

569+
test.serial('prepared statement with placeholder in .limit', async (t) => {
570+
const { db } = t.context;
571+
572+
await db.insert(usersTable).values({ name: 'John' });
573+
const stmt = db
574+
.select({
575+
id: usersTable.id,
576+
name: usersTable.name,
577+
})
578+
.from(usersTable)
579+
.where(eq(usersTable.id, placeholder('id')))
580+
.limit(placeholder('limit'))
581+
.prepare('stmt_limit');
582+
583+
const result = await stmt.execute({ id: 1, limit: 1 });
584+
585+
t.deepEqual(result, [{ id: 1, name: 'John' }]);
586+
t.is(result.length, 1);
587+
});
588+
589+
test.serial('prepared statement with placeholder in .offset', async (t) => {
590+
const { db } = t.context;
591+
592+
await db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);
593+
const stmt = db
594+
.select({
595+
id: usersTable.id,
596+
name: usersTable.name,
597+
})
598+
.from(usersTable)
599+
.offset(placeholder('offset'))
600+
.prepare('stmt_offset');
601+
602+
const result = await stmt.execute({ offset: 1 });
603+
604+
t.deepEqual(result, [{ id: 2, name: 'John1' }]);
605+
});
606+
569607
test.serial('migrator', async (t) => {
570608
const { db } = t.context;
571609

integration-tests/tests/pg.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,44 @@ test.serial('prepared statement with placeholder in .where', async (t) => {
819819
t.deepEqual(result, [{ id: 1, name: 'John' }]);
820820
});
821821

822+
test.serial('prepared statement with placeholder in .limit', async (t) => {
823+
const { db } = t.context;
824+
825+
await db.insert(usersTable).values({ name: 'John' });
826+
const stmt = db
827+
.select({
828+
id: usersTable.id,
829+
name: usersTable.name,
830+
})
831+
.from(usersTable)
832+
.where(eq(usersTable.id, placeholder('id')))
833+
.limit(placeholder('limit'))
834+
.prepare('stmt_limit');
835+
836+
const result = await stmt.execute({ id: 1, limit: 1 });
837+
838+
t.deepEqual(result, [{ id: 1, name: 'John' }]);
839+
t.is(result.length, 1);
840+
});
841+
842+
test.serial('prepared statement with placeholder in .offset', async (t) => {
843+
const { db } = t.context;
844+
845+
await db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);
846+
const stmt = db
847+
.select({
848+
id: usersTable.id,
849+
name: usersTable.name,
850+
})
851+
.from(usersTable)
852+
.offset(placeholder('offset'))
853+
.prepare('stmt_offset');
854+
855+
const result = await stmt.execute({ offset: 1 });
856+
857+
t.deepEqual(result, [{ id: 2, name: 'John1' }]);
858+
});
859+
822860
// TODO change tests to new structure
823861
test.serial('migrator', async (t) => {
824862
const { db } = t.context;

integration-tests/tests/postgres.js.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,44 @@ test.serial('prepared statement', async (t) => {
628628
t.deepEqual(result, [{ id: 1, name: 'John' }]);
629629
});
630630

631+
test.serial('prepared statement with placeholder in .limit', async (t) => {
632+
const { db } = t.context;
633+
634+
await db.insert(usersTable).values({ name: 'John' });
635+
const stmt = db
636+
.select({
637+
id: usersTable.id,
638+
name: usersTable.name,
639+
})
640+
.from(usersTable)
641+
.where(eq(usersTable.id, placeholder('id')))
642+
.limit(placeholder('limit'))
643+
.prepare('stmt_limit');
644+
645+
const result = await stmt.execute({ id: 1, limit: 1 });
646+
647+
t.deepEqual(result, [{ id: 1, name: 'John' }]);
648+
t.is(result.length, 1);
649+
});
650+
651+
test.serial('prepared statement with placeholder in .offset', async (t) => {
652+
const { db } = t.context;
653+
654+
await db.insert(usersTable).values([{ name: 'John' }, { name: 'John1' }]);
655+
const stmt = db
656+
.select({
657+
id: usersTable.id,
658+
name: usersTable.name,
659+
})
660+
.from(usersTable)
661+
.offset(placeholder('offset'))
662+
.prepare('stmt_offset');
663+
664+
const result = await stmt.execute({ offset: 1 });
665+
666+
t.deepEqual(result, [{ id: 2, name: 'John1' }]);
667+
});
668+
631669
test.serial('prepared statement reuse', async (t) => {
632670
const { db } = t.context;
633671

0 commit comments

Comments
 (0)