@@ -59,6 +59,7 @@ import { NoResultError, NoResultErrorConstructor } from './no-result-error.js'
5959import { HavingInterface } from './having-interface.js'
6060import { IdentifierNode } from '../operation-node/identifier-node.js'
6161import { AliasedRawBuilder } from '../raw-builder/raw-builder.js'
62+ import { SelectModifierNode } from '../operation-node/select-modifier-node.js'
6263
6364export class SelectQueryBuilder < DB , TB extends keyof DB , O >
6465 implements
@@ -527,6 +528,68 @@ export class SelectQueryBuilder<DB, TB extends keyof DB, O>
527528 } )
528529 }
529530
531+ /**
532+ * This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
533+ *
534+ * ### Examples
535+ *
536+ * ```ts
537+ * db.selectFrom('person')
538+ * .modifyFront(sql`sql_no_cache`)
539+ * .select('first_name')
540+ * .execute()
541+ * ```
542+ *
543+ * The generated SQL (MySQL):
544+ *
545+ * ```sql
546+ * select sql_no_cache `first_name`
547+ * from `person`
548+ * ```
549+ */
550+ modifyFront ( modifier : AnyRawBuilder ) : SelectQueryBuilder < DB , TB , O > {
551+ return new SelectQueryBuilder ( {
552+ ...this . #props,
553+ queryNode : SelectQueryNode . cloneWithFrontModifier (
554+ this . #props. queryNode ,
555+ SelectModifierNode . createWithRaw ( modifier . toOperationNode ( ) )
556+ ) ,
557+ } )
558+ }
559+
560+ /**
561+ * This can be used to add any additional SQL to the end of the query.
562+ *
563+ * Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
564+ * {@link skipLocked} and {@link noWait}.
565+ *
566+ * ### Examples
567+ *
568+ * ```ts
569+ * db.selectFrom('person')
570+ * .select('first_name')
571+ * .modifyEnd(sql`for update`)
572+ * .execute()
573+ * ```
574+ *
575+ * The generated SQL (PostgreSQL):
576+ *
577+ * ```sql
578+ * select "first_name"
579+ * from "person"
580+ * for update
581+ * ```
582+ */
583+ modifyEnd ( modifier : AnyRawBuilder ) : SelectQueryBuilder < DB , TB , O > {
584+ return new SelectQueryBuilder ( {
585+ ...this . #props,
586+ queryNode : SelectQueryNode . cloneWithEndModifier (
587+ this . #props. queryNode ,
588+ SelectModifierNode . createWithRaw ( modifier . toOperationNode ( ) )
589+ ) ,
590+ } )
591+ }
592+
530593 /**
531594 * Makes the selection distinct.
532595 *
@@ -548,84 +611,87 @@ export class SelectQueryBuilder<DB, TB extends keyof DB, O>
548611 distinct ( ) : SelectQueryBuilder < DB , TB , O > {
549612 return new SelectQueryBuilder ( {
550613 ...this . #props,
551- queryNode : SelectQueryNode . cloneWithDistinct ( this . #props. queryNode ) ,
614+ queryNode : SelectQueryNode . cloneWithFrontModifier (
615+ this . #props. queryNode ,
616+ SelectModifierNode . create ( 'Distinct' )
617+ ) ,
552618 } )
553619 }
554620
555621 /**
556- * Adds the `for update` option to a select query on supported databases.
622+ * Adds the `for update` modifier to a select query on supported databases.
557623 */
558624 forUpdate ( ) : SelectQueryBuilder < DB , TB , O > {
559625 return new SelectQueryBuilder ( {
560626 ...this . #props,
561- queryNode : SelectQueryNode . cloneWithModifier (
627+ queryNode : SelectQueryNode . cloneWithEndModifier (
562628 this . #props. queryNode ,
563- 'ForUpdate'
629+ SelectModifierNode . create ( 'ForUpdate' )
564630 ) ,
565631 } )
566632 }
567633
568634 /**
569- * Adds the `for share` option to a select query on supported databases.
635+ * Adds the `for share` modifier to a select query on supported databases.
570636 */
571637 forShare ( ) : SelectQueryBuilder < DB , TB , O > {
572638 return new SelectQueryBuilder ( {
573639 ...this . #props,
574- queryNode : SelectQueryNode . cloneWithModifier (
640+ queryNode : SelectQueryNode . cloneWithEndModifier (
575641 this . #props. queryNode ,
576- 'ForShare'
642+ SelectModifierNode . create ( 'ForShare' )
577643 ) ,
578644 } )
579645 }
580646
581647 /**
582- * Adds the `for key share` option to a select query on supported databases.
648+ * Adds the `for key share` modifier to a select query on supported databases.
583649 */
584650 forKeyShare ( ) : SelectQueryBuilder < DB , TB , O > {
585651 return new SelectQueryBuilder ( {
586652 ...this . #props,
587- queryNode : SelectQueryNode . cloneWithModifier (
653+ queryNode : SelectQueryNode . cloneWithEndModifier (
588654 this . #props. queryNode ,
589- 'ForKeyShare'
655+ SelectModifierNode . create ( 'ForKeyShare' )
590656 ) ,
591657 } )
592658 }
593659
594660 /**
595- * Adds the `for no key update` option to a select query on supported databases.
661+ * Adds the `for no key update` modifier to a select query on supported databases.
596662 */
597663 forNoKeyUpdate ( ) : SelectQueryBuilder < DB , TB , O > {
598664 return new SelectQueryBuilder ( {
599665 ...this . #props,
600- queryNode : SelectQueryNode . cloneWithModifier (
666+ queryNode : SelectQueryNode . cloneWithEndModifier (
601667 this . #props. queryNode ,
602- 'ForNoKeyUpdate'
668+ SelectModifierNode . create ( 'ForNoKeyUpdate' )
603669 ) ,
604670 } )
605671 }
606672
607673 /**
608- * Adds the `skip locked` option to a select query on supported databases.
674+ * Adds the `skip locked` modifier to a select query on supported databases.
609675 */
610676 skipLocked ( ) : SelectQueryBuilder < DB , TB , O > {
611677 return new SelectQueryBuilder ( {
612678 ...this . #props,
613- queryNode : SelectQueryNode . cloneWithModifier (
679+ queryNode : SelectQueryNode . cloneWithEndModifier (
614680 this . #props. queryNode ,
615- 'SkipLocked'
681+ SelectModifierNode . create ( 'SkipLocked' )
616682 ) ,
617683 } )
618684 }
619685
620686 /**
621- * Adds the `nowait` option to a select query on supported databases.
687+ * Adds the `nowait` modifier to a select query on supported databases.
622688 */
623689 noWait ( ) : SelectQueryBuilder < DB , TB , O > {
624690 return new SelectQueryBuilder ( {
625691 ...this . #props,
626- queryNode : SelectQueryNode . cloneWithModifier (
692+ queryNode : SelectQueryNode . cloneWithEndModifier (
627693 this . #props. queryNode ,
628- 'NoWait'
694+ SelectModifierNode . create ( 'NoWait' )
629695 ) ,
630696 } )
631697 }
0 commit comments