visitors

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 1, 2026 License: MIT Imports: 6 Imported by: 0

Documentation

Overview

Package visitors provides SQL dialect generators that walk the AST.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func RenderWindowDef

func RenderWindowDef(v nodes.Visitor, w *nodes.WindowDefinition) string

RenderWindowDef renders a window definition as a SQL parenthesised expression. Exported so FormattingVisitor and any future visitor can reuse it without duplicating logic. Pass the active dialect visitor for correct quoting.

Types

type DotVisitor

type DotVisitor struct {
	// contains filtered or unexported fields
}

DotVisitor walks the AST and produces Graphviz DOT output. It implements nodes.Visitor.

func NewDotVisitor

func NewDotVisitor() *DotVisitor

NewDotVisitor creates a new DotVisitor ready to walk an AST.

func (*DotVisitor) AddPluginCluster

func (dv *DotVisitor) AddPluginCluster(name, color string, nodeIDs []string)

AddPluginCluster registers a plugin cluster for grouped rendering in the DOT output.

func (*DotVisitor) NodeCount

func (dv *DotVisitor) NodeCount() int

NodeCount returns the number of nodes accumulated so far.

func (*DotVisitor) NodeIDsSince

func (dv *DotVisitor) NodeIDsSince(start int) []string

NodeIDsSince returns the IDs of nodes added since (and including) the given index.

func (*DotVisitor) SetProvenance

func (dv *DotVisitor) SetProvenance(p *PluginProvenance)

SetProvenance configures plugin provenance tracking for clause attribution.

func (*DotVisitor) ToDot

func (dv *DotVisitor) ToDot() string

ToDot generates the complete DOT graph text.

func (*DotVisitor) VisitAggregate

func (dv *DotVisitor) VisitAggregate(n *nodes.AggregateNode) string

func (*DotVisitor) VisitAlias

func (dv *DotVisitor) VisitAlias(n *nodes.AliasNode) string

func (*DotVisitor) VisitAnd

func (dv *DotVisitor) VisitAnd(n *nodes.AndNode) string

func (*DotVisitor) VisitAssignment

func (dv *DotVisitor) VisitAssignment(n *nodes.AssignmentNode) string

func (*DotVisitor) VisitAttribute

func (dv *DotVisitor) VisitAttribute(n *nodes.Attribute) string

func (*DotVisitor) VisitBetween

func (dv *DotVisitor) VisitBetween(n *nodes.BetweenNode) string

func (*DotVisitor) VisitBindParam

func (dv *DotVisitor) VisitBindParam(n *nodes.BindParamNode) string

func (*DotVisitor) VisitCTE

func (dv *DotVisitor) VisitCTE(n *nodes.CTENode) string

func (*DotVisitor) VisitCase

func (dv *DotVisitor) VisitCase(n *nodes.CaseNode) string

func (*DotVisitor) VisitCasted

func (dv *DotVisitor) VisitCasted(n *nodes.CastedNode) string

func (*DotVisitor) VisitComparison

func (dv *DotVisitor) VisitComparison(n *nodes.ComparisonNode) string

func (*DotVisitor) VisitDeleteStatement

func (dv *DotVisitor) VisitDeleteStatement(n *nodes.DeleteStatement) string

func (*DotVisitor) VisitExists

func (dv *DotVisitor) VisitExists(n *nodes.ExistsNode) string

func (*DotVisitor) VisitExtract

func (dv *DotVisitor) VisitExtract(n *nodes.ExtractNode) string

func (*DotVisitor) VisitGrouping

func (dv *DotVisitor) VisitGrouping(n *nodes.GroupingNode) string

func (*DotVisitor) VisitGroupingSet

func (dv *DotVisitor) VisitGroupingSet(n *nodes.GroupingSetNode) string

func (*DotVisitor) VisitIn

func (dv *DotVisitor) VisitIn(n *nodes.InNode) string

func (*DotVisitor) VisitInfix

func (dv *DotVisitor) VisitInfix(n *nodes.InfixNode) string

func (*DotVisitor) VisitInsertStatement

func (dv *DotVisitor) VisitInsertStatement(n *nodes.InsertStatement) string

func (*DotVisitor) VisitJoin

func (dv *DotVisitor) VisitJoin(n *nodes.JoinNode) string

func (*DotVisitor) VisitLiteral

func (dv *DotVisitor) VisitLiteral(n *nodes.LiteralNode) string

func (*DotVisitor) VisitNamedFunction

func (dv *DotVisitor) VisitNamedFunction(n *nodes.NamedFunctionNode) string

func (*DotVisitor) VisitNot

func (dv *DotVisitor) VisitNot(n *nodes.NotNode) string

func (*DotVisitor) VisitOnConflict

func (dv *DotVisitor) VisitOnConflict(n *nodes.OnConflictNode) string

func (*DotVisitor) VisitOr

func (dv *DotVisitor) VisitOr(n *nodes.OrNode) string

func (*DotVisitor) VisitOrdering

func (dv *DotVisitor) VisitOrdering(n *nodes.OrderingNode) string

func (*DotVisitor) VisitOver

func (dv *DotVisitor) VisitOver(n *nodes.OverNode) string

func (*DotVisitor) VisitSelectCore

func (dv *DotVisitor) VisitSelectCore(n *nodes.SelectCore) string

func (*DotVisitor) VisitSetOperation

func (dv *DotVisitor) VisitSetOperation(n *nodes.SetOperationNode) string

func (*DotVisitor) VisitSqlLiteral

func (dv *DotVisitor) VisitSqlLiteral(n *nodes.SqlLiteral) string

func (*DotVisitor) VisitStar

func (dv *DotVisitor) VisitStar(n *nodes.StarNode) string

func (*DotVisitor) VisitTable

func (dv *DotVisitor) VisitTable(n *nodes.Table) string

func (*DotVisitor) VisitTableAlias

func (dv *DotVisitor) VisitTableAlias(n *nodes.TableAlias) string

func (*DotVisitor) VisitUnary

func (dv *DotVisitor) VisitUnary(n *nodes.UnaryNode) string

func (*DotVisitor) VisitUnaryMath

func (dv *DotVisitor) VisitUnaryMath(n *nodes.UnaryMathNode) string

func (*DotVisitor) VisitUpdateStatement

func (dv *DotVisitor) VisitUpdateStatement(n *nodes.UpdateStatement) string

func (*DotVisitor) VisitWindowFunction

func (dv *DotVisitor) VisitWindowFunction(n *nodes.WindowFuncNode) string

type FormattingVisitor

type FormattingVisitor struct {
	// contains filtered or unexported fields
}

FormattingVisitor wraps any nodes.Visitor (dialect visitor) and produces human-readable multi-line SQL. VisitSelectCore, VisitSetOperation, VisitInsertStatement, VisitUpdateStatement, and VisitDeleteStatement are real implementations that render each major clause on its own line.

func NewFormattingVisitor

func NewFormattingVisitor(inner nodes.Visitor) *FormattingVisitor

NewFormattingVisitor constructs a FormattingVisitor wrapping the given dialect visitor.

func (*FormattingVisitor) Params

func (f *FormattingVisitor) Params() []any

Params delegates to the inner visitor if it implements nodes.Parameterizer, otherwise returns nil.

func (*FormattingVisitor) Reset

func (f *FormattingVisitor) Reset()

Reset delegates to the inner visitor if it implements nodes.Parameterizer.

func (*FormattingVisitor) VisitAggregate

func (f *FormattingVisitor) VisitAggregate(node *nodes.AggregateNode) string

func (*FormattingVisitor) VisitAlias

func (f *FormattingVisitor) VisitAlias(node *nodes.AliasNode) string

func (*FormattingVisitor) VisitAnd

func (f *FormattingVisitor) VisitAnd(node *nodes.AndNode) string

func (*FormattingVisitor) VisitAssignment

func (f *FormattingVisitor) VisitAssignment(node *nodes.AssignmentNode) string

func (*FormattingVisitor) VisitAttribute

func (f *FormattingVisitor) VisitAttribute(node *nodes.Attribute) string

func (*FormattingVisitor) VisitBetween

func (f *FormattingVisitor) VisitBetween(node *nodes.BetweenNode) string

func (*FormattingVisitor) VisitBindParam

func (f *FormattingVisitor) VisitBindParam(node *nodes.BindParamNode) string

func (*FormattingVisitor) VisitCTE

func (f *FormattingVisitor) VisitCTE(node *nodes.CTENode) string

func (*FormattingVisitor) VisitCase

func (f *FormattingVisitor) VisitCase(node *nodes.CaseNode) string

func (*FormattingVisitor) VisitCasted

func (f *FormattingVisitor) VisitCasted(node *nodes.CastedNode) string

func (*FormattingVisitor) VisitComparison

func (f *FormattingVisitor) VisitComparison(node *nodes.ComparisonNode) string

func (*FormattingVisitor) VisitDeleteStatement

func (f *FormattingVisitor) VisitDeleteStatement(n *nodes.DeleteStatement) string

VisitDeleteStatement renders DELETE FROM with each clause on its own line.

func (*FormattingVisitor) VisitExists

func (f *FormattingVisitor) VisitExists(node *nodes.ExistsNode) string

func (*FormattingVisitor) VisitExtract

func (f *FormattingVisitor) VisitExtract(node *nodes.ExtractNode) string

func (*FormattingVisitor) VisitGrouping

func (f *FormattingVisitor) VisitGrouping(node *nodes.GroupingNode) string

func (*FormattingVisitor) VisitGroupingSet

func (f *FormattingVisitor) VisitGroupingSet(node *nodes.GroupingSetNode) string

func (*FormattingVisitor) VisitIn

func (f *FormattingVisitor) VisitIn(node *nodes.InNode) string

func (*FormattingVisitor) VisitInfix

func (f *FormattingVisitor) VisitInfix(node *nodes.InfixNode) string

func (*FormattingVisitor) VisitInsertStatement

func (f *FormattingVisitor) VisitInsertStatement(n *nodes.InsertStatement) string

VisitInsertStatement renders INSERT with each major clause on its own line.

func (*FormattingVisitor) VisitJoin

func (f *FormattingVisitor) VisitJoin(node *nodes.JoinNode) string

func (*FormattingVisitor) VisitLiteral

func (f *FormattingVisitor) VisitLiteral(node *nodes.LiteralNode) string

func (*FormattingVisitor) VisitNamedFunction

func (f *FormattingVisitor) VisitNamedFunction(node *nodes.NamedFunctionNode) string

func (*FormattingVisitor) VisitNot

func (f *FormattingVisitor) VisitNot(node *nodes.NotNode) string

func (*FormattingVisitor) VisitOnConflict

func (f *FormattingVisitor) VisitOnConflict(node *nodes.OnConflictNode) string

func (*FormattingVisitor) VisitOr

func (f *FormattingVisitor) VisitOr(node *nodes.OrNode) string

func (*FormattingVisitor) VisitOrdering

func (f *FormattingVisitor) VisitOrdering(node *nodes.OrderingNode) string

func (*FormattingVisitor) VisitOver

func (f *FormattingVisitor) VisitOver(node *nodes.OverNode) string

func (*FormattingVisitor) VisitSelectCore

func (f *FormattingVisitor) VisitSelectCore(node *nodes.SelectCore) string

VisitSelectCore renders a SELECT statement in multi-line formatted style. Projections use leading-comma continuation; all major clauses begin on a new line. Child expressions are rendered via f.inner (dialect-specific).

func (*FormattingVisitor) VisitSetOperation

func (f *FormattingVisitor) VisitSetOperation(n *nodes.SetOperationNode) string

VisitSetOperation renders each leg of a set operation in parentheses with the operator keyword on its own line between them. Any ORDER BY, LIMIT, or OFFSET on the node apply to the combined result and are rendered afterwards.

func (*FormattingVisitor) VisitSqlLiteral

func (f *FormattingVisitor) VisitSqlLiteral(node *nodes.SqlLiteral) string

func (*FormattingVisitor) VisitStar

func (f *FormattingVisitor) VisitStar(node *nodes.StarNode) string

func (*FormattingVisitor) VisitTable

func (f *FormattingVisitor) VisitTable(node *nodes.Table) string

func (*FormattingVisitor) VisitTableAlias

func (f *FormattingVisitor) VisitTableAlias(node *nodes.TableAlias) string

func (*FormattingVisitor) VisitUnary

func (f *FormattingVisitor) VisitUnary(node *nodes.UnaryNode) string

func (*FormattingVisitor) VisitUnaryMath

func (f *FormattingVisitor) VisitUnaryMath(node *nodes.UnaryMathNode) string

func (*FormattingVisitor) VisitUpdateStatement

func (f *FormattingVisitor) VisitUpdateStatement(n *nodes.UpdateStatement) string

VisitUpdateStatement renders UPDATE with each clause on its own line and leading-comma style for multiple SET assignments.

func (*FormattingVisitor) VisitWindowFunction

func (f *FormattingVisitor) VisitWindowFunction(node *nodes.WindowFuncNode) string

type MySQLVisitor

type MySQLVisitor struct {
	// contains filtered or unexported fields
}

MySQLVisitor generates MySQL-dialect SQL. Identifiers are quoted with backticks: `table`.`column`.

func NewMySQLVisitor

func NewMySQLVisitor(opts ...Option) *MySQLVisitor

NewMySQLVisitor creates a MySQLVisitor ready for use. Parameterized mode is enabled by default for SQL injection protection. Pass WithoutParams() to disable (not recommended for production).

Example

MySQL quotes identifiers with backticks and uses ? placeholders. Its default collations already compare case-insensitively, so a plain = is emitted.

package main

import (
	"fmt"

	"github.com/bawdo/gosbee/managers"
	"github.com/bawdo/gosbee/nodes"
	"github.com/bawdo/gosbee/visitors"
)

// lookupQuery builds one query for every dialect example, so the dialect
// is the only thing that changes between them.
func lookupQuery() *managers.SelectManager {
	users := nodes.NewTable("users")
	return managers.NewSelectManager(users).
		Select(users.Col("id"), users.Col("email")).
		Where(
			users.Col("email").CaseInsensitiveEq("Alice@Example.com"),
			users.Col("id").Gt(100),
		)
}

func render(v nodes.Visitor) {
	sql, params, err := lookupQuery().ToSQL(v)
	if err != nil {
		fmt.Println("error:", err)
		return
	}
	fmt.Println(sql)
	fmt.Println(params)
}

func main() {
	render(visitors.NewMySQLVisitor())
}
Output:
SELECT `users`.`id`, `users`.`email` FROM `users` WHERE `users`.`email` = ? AND `users`.`id` > ?
[Alice@Example.com 100]

func (MySQLVisitor) Params

func (b MySQLVisitor) Params() []any

Params returns the collected bind parameters from the last SQL generation.

func (MySQLVisitor) Reset

func (b MySQLVisitor) Reset()

Reset clears collected parameters for reuse.

func (MySQLVisitor) VisitAggregate

func (b MySQLVisitor) VisitAggregate(n *nodes.AggregateNode) string

func (MySQLVisitor) VisitAlias

func (b MySQLVisitor) VisitAlias(n *nodes.AliasNode) string

func (MySQLVisitor) VisitAnd

func (b MySQLVisitor) VisitAnd(n *nodes.AndNode) string

func (MySQLVisitor) VisitAssignment

func (b MySQLVisitor) VisitAssignment(n *nodes.AssignmentNode) string

VisitAssignment renders a SET assignment. A column target is written bare, never table-qualified: the target is always a column of the table being updated, and PostgreSQL and SQLite reject a qualified one. The value is an ordinary expression and is rendered in full.

func (MySQLVisitor) VisitAttribute

func (b MySQLVisitor) VisitAttribute(n *nodes.Attribute) string

func (MySQLVisitor) VisitBetween

func (b MySQLVisitor) VisitBetween(n *nodes.BetweenNode) string

func (MySQLVisitor) VisitBindParam

func (b MySQLVisitor) VisitBindParam(n *nodes.BindParamNode) string

func (MySQLVisitor) VisitCTE

func (b MySQLVisitor) VisitCTE(n *nodes.CTENode) string

func (MySQLVisitor) VisitCase

func (b MySQLVisitor) VisitCase(n *nodes.CaseNode) string

func (MySQLVisitor) VisitCasted

func (b MySQLVisitor) VisitCasted(n *nodes.CastedNode) string

func (*MySQLVisitor) VisitComparison

func (v *MySQLVisitor) VisitComparison(n *nodes.ComparisonNode) string

func (MySQLVisitor) VisitDeleteStatement

func (b MySQLVisitor) VisitDeleteStatement(n *nodes.DeleteStatement) string

func (MySQLVisitor) VisitExists

func (b MySQLVisitor) VisitExists(n *nodes.ExistsNode) string

func (MySQLVisitor) VisitExtract

func (b MySQLVisitor) VisitExtract(n *nodes.ExtractNode) string

func (MySQLVisitor) VisitGrouping

func (b MySQLVisitor) VisitGrouping(n *nodes.GroupingNode) string

func (MySQLVisitor) VisitGroupingSet

func (b MySQLVisitor) VisitGroupingSet(n *nodes.GroupingSetNode) string

func (MySQLVisitor) VisitIn

func (b MySQLVisitor) VisitIn(n *nodes.InNode) string

func (MySQLVisitor) VisitInfix

func (b MySQLVisitor) VisitInfix(n *nodes.InfixNode) string

func (MySQLVisitor) VisitInsertStatement

func (b MySQLVisitor) VisitInsertStatement(n *nodes.InsertStatement) string

func (MySQLVisitor) VisitJoin

func (b MySQLVisitor) VisitJoin(n *nodes.JoinNode) string

func (MySQLVisitor) VisitLiteral

func (b MySQLVisitor) VisitLiteral(n *nodes.LiteralNode) string

func (MySQLVisitor) VisitNamedFunction

func (b MySQLVisitor) VisitNamedFunction(n *nodes.NamedFunctionNode) string

func (MySQLVisitor) VisitNot

func (b MySQLVisitor) VisitNot(n *nodes.NotNode) string

func (MySQLVisitor) VisitOnConflict

func (b MySQLVisitor) VisitOnConflict(n *nodes.OnConflictNode) string

func (MySQLVisitor) VisitOr

func (b MySQLVisitor) VisitOr(n *nodes.OrNode) string

func (MySQLVisitor) VisitOrdering

func (b MySQLVisitor) VisitOrdering(n *nodes.OrderingNode) string

func (MySQLVisitor) VisitOver

func (b MySQLVisitor) VisitOver(n *nodes.OverNode) string

func (MySQLVisitor) VisitSelectCore

func (b MySQLVisitor) VisitSelectCore(n *nodes.SelectCore) string

func (MySQLVisitor) VisitSetOperation

func (b MySQLVisitor) VisitSetOperation(n *nodes.SetOperationNode) string

func (MySQLVisitor) VisitSqlLiteral

func (b MySQLVisitor) VisitSqlLiteral(n *nodes.SqlLiteral) string

func (MySQLVisitor) VisitStar

func (b MySQLVisitor) VisitStar(n *nodes.StarNode) string

func (MySQLVisitor) VisitTable

func (b MySQLVisitor) VisitTable(n *nodes.Table) string

func (MySQLVisitor) VisitTableAlias

func (b MySQLVisitor) VisitTableAlias(n *nodes.TableAlias) string

func (MySQLVisitor) VisitUnary

func (b MySQLVisitor) VisitUnary(n *nodes.UnaryNode) string

func (MySQLVisitor) VisitUnaryMath

func (b MySQLVisitor) VisitUnaryMath(n *nodes.UnaryMathNode) string

func (MySQLVisitor) VisitUpdateStatement

func (b MySQLVisitor) VisitUpdateStatement(n *nodes.UpdateStatement) string

func (MySQLVisitor) VisitWindowFunction

func (b MySQLVisitor) VisitWindowFunction(n *nodes.WindowFuncNode) string

type Option

type Option func(*baseVisitor)

Option configures a visitor at construction time.

func WithParams

func WithParams() Option

WithParams enables parameterized query mode. When enabled, literal values are replaced with bind placeholders and collected for separate retrieval.

Note: Parameterized mode is now enabled by default. This option is kept for backwards compatibility and has no effect.

func WithoutParams

func WithoutParams() Option

WithoutParams disables parameterized query mode.

⚠️ WARNING: Disables SQL injection protection. Only use for debugging or when you're certain all values are trusted. Production code should NEVER use this option.

When disabled, literal values are interpolated directly into the SQL string with basic escaping only. This is convenient for debugging but creates serious security vulnerabilities with untrusted input.

type PluginProvenance

type PluginProvenance struct {
	// contains filtered or unexported fields
}

PluginProvenance tracks which clause indices belong to which plugins.

func NewPluginProvenance

func NewPluginProvenance() *PluginProvenance

NewPluginProvenance creates a new PluginProvenance tracker.

func (*PluginProvenance) AddJoin

func (pp *PluginProvenance) AddJoin(plugin, color string, index int)

AddJoin marks a JOIN clause index as belonging to a plugin.

func (*PluginProvenance) AddWhere

func (pp *PluginProvenance) AddWhere(plugin, color string, index int)

AddWhere marks a WHERE clause index as belonging to a plugin.

type PostgresVisitor

type PostgresVisitor struct {
	// contains filtered or unexported fields
}

PostgresVisitor generates PostgreSQL-dialect SQL. Identifiers are quoted with double quotes: "table"."column".

func NewPostgresVisitor

func NewPostgresVisitor(opts ...Option) *PostgresVisitor

NewPostgresVisitor creates a PostgresVisitor ready for use. Parameterized mode is enabled by default for SQL injection protection. Pass WithoutParams() to disable (not recommended for production).

Example

PostgreSQL quotes identifiers with double quotes, numbers its placeholders, and compares case-insensitively by lowering both sides.

package main

import (
	"fmt"

	"github.com/bawdo/gosbee/managers"
	"github.com/bawdo/gosbee/nodes"
	"github.com/bawdo/gosbee/visitors"
)

// lookupQuery builds one query for every dialect example, so the dialect
// is the only thing that changes between them.
func lookupQuery() *managers.SelectManager {
	users := nodes.NewTable("users")
	return managers.NewSelectManager(users).
		Select(users.Col("id"), users.Col("email")).
		Where(
			users.Col("email").CaseInsensitiveEq("Alice@Example.com"),
			users.Col("id").Gt(100),
		)
}

func render(v nodes.Visitor) {
	sql, params, err := lookupQuery().ToSQL(v)
	if err != nil {
		fmt.Println("error:", err)
		return
	}
	fmt.Println(sql)
	fmt.Println(params)
}

func main() {
	render(visitors.NewPostgresVisitor())
}
Output:
SELECT "users"."id", "users"."email" FROM "users" WHERE LOWER("users"."email") = LOWER($1) AND "users"."id" > $2
[Alice@Example.com 100]

func (PostgresVisitor) Params

func (b PostgresVisitor) Params() []any

Params returns the collected bind parameters from the last SQL generation.

func (PostgresVisitor) Reset

func (b PostgresVisitor) Reset()

Reset clears collected parameters for reuse.

func (PostgresVisitor) VisitAggregate

func (b PostgresVisitor) VisitAggregate(n *nodes.AggregateNode) string

func (PostgresVisitor) VisitAlias

func (b PostgresVisitor) VisitAlias(n *nodes.AliasNode) string

func (PostgresVisitor) VisitAnd

func (b PostgresVisitor) VisitAnd(n *nodes.AndNode) string

func (PostgresVisitor) VisitAssignment

func (b PostgresVisitor) VisitAssignment(n *nodes.AssignmentNode) string

VisitAssignment renders a SET assignment. A column target is written bare, never table-qualified: the target is always a column of the table being updated, and PostgreSQL and SQLite reject a qualified one. The value is an ordinary expression and is rendered in full.

func (PostgresVisitor) VisitAttribute

func (b PostgresVisitor) VisitAttribute(n *nodes.Attribute) string

func (PostgresVisitor) VisitBetween

func (b PostgresVisitor) VisitBetween(n *nodes.BetweenNode) string

func (PostgresVisitor) VisitBindParam

func (b PostgresVisitor) VisitBindParam(n *nodes.BindParamNode) string

func (PostgresVisitor) VisitCTE

func (b PostgresVisitor) VisitCTE(n *nodes.CTENode) string

func (PostgresVisitor) VisitCase

func (b PostgresVisitor) VisitCase(n *nodes.CaseNode) string

func (PostgresVisitor) VisitCasted

func (b PostgresVisitor) VisitCasted(n *nodes.CastedNode) string

func (PostgresVisitor) VisitComparison

func (b PostgresVisitor) VisitComparison(n *nodes.ComparisonNode) string

func (PostgresVisitor) VisitDeleteStatement

func (b PostgresVisitor) VisitDeleteStatement(n *nodes.DeleteStatement) string

func (PostgresVisitor) VisitExists

func (b PostgresVisitor) VisitExists(n *nodes.ExistsNode) string

func (PostgresVisitor) VisitExtract

func (b PostgresVisitor) VisitExtract(n *nodes.ExtractNode) string

func (PostgresVisitor) VisitGrouping

func (b PostgresVisitor) VisitGrouping(n *nodes.GroupingNode) string

func (PostgresVisitor) VisitGroupingSet

func (b PostgresVisitor) VisitGroupingSet(n *nodes.GroupingSetNode) string

func (PostgresVisitor) VisitIn

func (b PostgresVisitor) VisitIn(n *nodes.InNode) string

func (PostgresVisitor) VisitInfix

func (b PostgresVisitor) VisitInfix(n *nodes.InfixNode) string

func (PostgresVisitor) VisitInsertStatement

func (b PostgresVisitor) VisitInsertStatement(n *nodes.InsertStatement) string

func (PostgresVisitor) VisitJoin

func (b PostgresVisitor) VisitJoin(n *nodes.JoinNode) string

func (PostgresVisitor) VisitLiteral

func (b PostgresVisitor) VisitLiteral(n *nodes.LiteralNode) string

func (PostgresVisitor) VisitNamedFunction

func (b PostgresVisitor) VisitNamedFunction(n *nodes.NamedFunctionNode) string

func (PostgresVisitor) VisitNot

func (b PostgresVisitor) VisitNot(n *nodes.NotNode) string

func (PostgresVisitor) VisitOnConflict

func (b PostgresVisitor) VisitOnConflict(n *nodes.OnConflictNode) string

func (PostgresVisitor) VisitOr

func (b PostgresVisitor) VisitOr(n *nodes.OrNode) string

func (PostgresVisitor) VisitOrdering

func (b PostgresVisitor) VisitOrdering(n *nodes.OrderingNode) string

func (PostgresVisitor) VisitOver

func (b PostgresVisitor) VisitOver(n *nodes.OverNode) string

func (PostgresVisitor) VisitSelectCore

func (b PostgresVisitor) VisitSelectCore(n *nodes.SelectCore) string

func (PostgresVisitor) VisitSetOperation

func (b PostgresVisitor) VisitSetOperation(n *nodes.SetOperationNode) string

func (PostgresVisitor) VisitSqlLiteral

func (b PostgresVisitor) VisitSqlLiteral(n *nodes.SqlLiteral) string

func (PostgresVisitor) VisitStar

func (b PostgresVisitor) VisitStar(n *nodes.StarNode) string

func (PostgresVisitor) VisitTable

func (b PostgresVisitor) VisitTable(n *nodes.Table) string

func (PostgresVisitor) VisitTableAlias

func (b PostgresVisitor) VisitTableAlias(n *nodes.TableAlias) string

func (PostgresVisitor) VisitUnary

func (b PostgresVisitor) VisitUnary(n *nodes.UnaryNode) string

func (PostgresVisitor) VisitUnaryMath

func (b PostgresVisitor) VisitUnaryMath(n *nodes.UnaryMathNode) string

func (PostgresVisitor) VisitUpdateStatement

func (b PostgresVisitor) VisitUpdateStatement(n *nodes.UpdateStatement) string

func (PostgresVisitor) VisitWindowFunction

func (b PostgresVisitor) VisitWindowFunction(n *nodes.WindowFuncNode) string

type SQLiteVisitor

type SQLiteVisitor struct {
	// contains filtered or unexported fields
}

SQLiteVisitor generates SQLite-dialect SQL. Identifiers are quoted with double quotes: "table"."column" (ANSI SQL).

func NewSQLiteVisitor

func NewSQLiteVisitor(opts ...Option) *SQLiteVisitor

NewSQLiteVisitor creates a SQLiteVisitor ready for use. Parameterized mode is enabled by default for SQL injection protection. Pass WithoutParams() to disable (not recommended for production).

Example

SQLite quotes identifiers with double quotes, uses ? placeholders, and spells a case-insensitive comparison as a collation.

package main

import (
	"fmt"

	"github.com/bawdo/gosbee/managers"
	"github.com/bawdo/gosbee/nodes"
	"github.com/bawdo/gosbee/visitors"
)

// lookupQuery builds one query for every dialect example, so the dialect
// is the only thing that changes between them.
func lookupQuery() *managers.SelectManager {
	users := nodes.NewTable("users")
	return managers.NewSelectManager(users).
		Select(users.Col("id"), users.Col("email")).
		Where(
			users.Col("email").CaseInsensitiveEq("Alice@Example.com"),
			users.Col("id").Gt(100),
		)
}

func render(v nodes.Visitor) {
	sql, params, err := lookupQuery().ToSQL(v)
	if err != nil {
		fmt.Println("error:", err)
		return
	}
	fmt.Println(sql)
	fmt.Println(params)
}

func main() {
	render(visitors.NewSQLiteVisitor())
}
Output:
SELECT "users"."id", "users"."email" FROM "users" WHERE "users"."email" = ? COLLATE NOCASE AND "users"."id" > ?
[Alice@Example.com 100]

func (SQLiteVisitor) Params

func (b SQLiteVisitor) Params() []any

Params returns the collected bind parameters from the last SQL generation.

func (SQLiteVisitor) Reset

func (b SQLiteVisitor) Reset()

Reset clears collected parameters for reuse.

func (SQLiteVisitor) VisitAggregate

func (b SQLiteVisitor) VisitAggregate(n *nodes.AggregateNode) string

func (SQLiteVisitor) VisitAlias

func (b SQLiteVisitor) VisitAlias(n *nodes.AliasNode) string

func (SQLiteVisitor) VisitAnd

func (b SQLiteVisitor) VisitAnd(n *nodes.AndNode) string

func (SQLiteVisitor) VisitAssignment

func (b SQLiteVisitor) VisitAssignment(n *nodes.AssignmentNode) string

VisitAssignment renders a SET assignment. A column target is written bare, never table-qualified: the target is always a column of the table being updated, and PostgreSQL and SQLite reject a qualified one. The value is an ordinary expression and is rendered in full.

func (SQLiteVisitor) VisitAttribute

func (b SQLiteVisitor) VisitAttribute(n *nodes.Attribute) string

func (SQLiteVisitor) VisitBetween

func (b SQLiteVisitor) VisitBetween(n *nodes.BetweenNode) string

func (SQLiteVisitor) VisitBindParam

func (b SQLiteVisitor) VisitBindParam(n *nodes.BindParamNode) string

func (SQLiteVisitor) VisitCTE

func (b SQLiteVisitor) VisitCTE(n *nodes.CTENode) string

func (SQLiteVisitor) VisitCase

func (b SQLiteVisitor) VisitCase(n *nodes.CaseNode) string

func (SQLiteVisitor) VisitCasted

func (b SQLiteVisitor) VisitCasted(n *nodes.CastedNode) string

func (*SQLiteVisitor) VisitComparison

func (v *SQLiteVisitor) VisitComparison(n *nodes.ComparisonNode) string

func (SQLiteVisitor) VisitDeleteStatement

func (b SQLiteVisitor) VisitDeleteStatement(n *nodes.DeleteStatement) string

func (SQLiteVisitor) VisitExists

func (b SQLiteVisitor) VisitExists(n *nodes.ExistsNode) string

func (SQLiteVisitor) VisitExtract

func (b SQLiteVisitor) VisitExtract(n *nodes.ExtractNode) string

func (SQLiteVisitor) VisitGrouping

func (b SQLiteVisitor) VisitGrouping(n *nodes.GroupingNode) string

func (SQLiteVisitor) VisitGroupingSet

func (b SQLiteVisitor) VisitGroupingSet(n *nodes.GroupingSetNode) string

func (SQLiteVisitor) VisitIn

func (b SQLiteVisitor) VisitIn(n *nodes.InNode) string

func (SQLiteVisitor) VisitInfix

func (b SQLiteVisitor) VisitInfix(n *nodes.InfixNode) string

func (SQLiteVisitor) VisitInsertStatement

func (b SQLiteVisitor) VisitInsertStatement(n *nodes.InsertStatement) string

func (SQLiteVisitor) VisitJoin

func (b SQLiteVisitor) VisitJoin(n *nodes.JoinNode) string

func (SQLiteVisitor) VisitLiteral

func (b SQLiteVisitor) VisitLiteral(n *nodes.LiteralNode) string

func (SQLiteVisitor) VisitNamedFunction

func (b SQLiteVisitor) VisitNamedFunction(n *nodes.NamedFunctionNode) string

func (SQLiteVisitor) VisitNot

func (b SQLiteVisitor) VisitNot(n *nodes.NotNode) string

func (SQLiteVisitor) VisitOnConflict

func (b SQLiteVisitor) VisitOnConflict(n *nodes.OnConflictNode) string

func (SQLiteVisitor) VisitOr

func (b SQLiteVisitor) VisitOr(n *nodes.OrNode) string

func (SQLiteVisitor) VisitOrdering

func (b SQLiteVisitor) VisitOrdering(n *nodes.OrderingNode) string

func (SQLiteVisitor) VisitOver

func (b SQLiteVisitor) VisitOver(n *nodes.OverNode) string

func (SQLiteVisitor) VisitSelectCore

func (b SQLiteVisitor) VisitSelectCore(n *nodes.SelectCore) string

func (SQLiteVisitor) VisitSetOperation

func (b SQLiteVisitor) VisitSetOperation(n *nodes.SetOperationNode) string

func (SQLiteVisitor) VisitSqlLiteral

func (b SQLiteVisitor) VisitSqlLiteral(n *nodes.SqlLiteral) string

func (SQLiteVisitor) VisitStar

func (b SQLiteVisitor) VisitStar(n *nodes.StarNode) string

func (SQLiteVisitor) VisitTable

func (b SQLiteVisitor) VisitTable(n *nodes.Table) string

func (SQLiteVisitor) VisitTableAlias

func (b SQLiteVisitor) VisitTableAlias(n *nodes.TableAlias) string

func (SQLiteVisitor) VisitUnary

func (b SQLiteVisitor) VisitUnary(n *nodes.UnaryNode) string

func (SQLiteVisitor) VisitUnaryMath

func (b SQLiteVisitor) VisitUnaryMath(n *nodes.UnaryMathNode) string

func (SQLiteVisitor) VisitUpdateStatement

func (b SQLiteVisitor) VisitUpdateStatement(n *nodes.UpdateStatement) string

func (SQLiteVisitor) VisitWindowFunction

func (b SQLiteVisitor) VisitWindowFunction(n *nodes.WindowFuncNode) string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL