Documentation
¶
Index ¶
- Constants
- Variables
- func DiscardSQLAlias(input string) string
- func WithCollectCommands(collectCommands bool) normalizerOption
- func WithCollectComments(collectComments bool) normalizerOption
- func WithCollectTables(collectTables bool) normalizerOption
- func WithDBMS(dbms DBMSType) lexerOption
- func WithDollarQuotedFunc(dollarQuotedFunc bool) obfuscatorOption
- func WithKeepSQLAlias(keepSQLAlias bool) normalizerOption
- func WithReplaceDigits(replaceDigits bool) obfuscatorOption
- func WithUppercaseKeywords(uppercaseKeywords bool) normalizerOption
- type DBMSType
- type Lexer
- type LexerConfig
- type Normalizer
- type Obfuscator
- type StatementMetadata
- type Token
- type TokenType
Examples ¶
Constants ¶
const ( ArrayPlaceholder = "( ? )" BracketPlaceholder = "[ ? ]" )
const ( StringPlaceholder = "?" NumberPlaceholder = "?" )
Variables ¶
Functions ¶
func DiscardSQLAlias ¶
DiscardSQLAlias removes any SQL alias from the input string and returns the modified string. It uses a regular expression to match the alias pattern and replace it with an empty string. The function is case-insensitive and matches the pattern "AS <alias_name>". The input string is not modified in place.
func WithCollectCommands ¶
func WithCollectCommands(collectCommands bool) normalizerOption
func WithCollectComments ¶
func WithCollectComments(collectComments bool) normalizerOption
func WithCollectTables ¶
func WithCollectTables(collectTables bool) normalizerOption
func WithDollarQuotedFunc ¶
func WithDollarQuotedFunc(dollarQuotedFunc bool) obfuscatorOption
func WithKeepSQLAlias ¶
func WithKeepSQLAlias(keepSQLAlias bool) normalizerOption
func WithReplaceDigits ¶
func WithReplaceDigits(replaceDigits bool) obfuscatorOption
func WithUppercaseKeywords ¶ added in v0.0.2
func WithUppercaseKeywords(uppercaseKeywords bool) normalizerOption
Types ¶
type Lexer ¶
type Lexer struct {
// contains filtered or unexported fields
}
SQL Lexer inspired from Rob Pike's talk on Lexical Scanning in Go
Example ¶
query := "SELECT * FROM users WHERE id = 1" lexer := New(query) tokens := lexer.ScanAll() fmt.Println(tokens)
Output: [{6 SELECT} {2 } {8 *} {2 } {6 FROM} {2 } {6 users} {2 } {6 WHERE} {2 } {6 id} {2 } {7 =} {2 } {5 1}]
func (*Lexer) ScanAllTokens ¶
ScanAllTokens scans the entire input string and returns a channel of tokens. Use this if you want to process the tokens as they are scanned.
type LexerConfig ¶ added in v0.0.2
type LexerConfig struct {
DBMS DBMSType
}
type Normalizer ¶
type Normalizer struct {
// contains filtered or unexported fields
}
Example ¶
normalizer := NewNormalizer( WithCollectComments(true), WithCollectCommands(true), WithCollectTables(true), WithKeepSQLAlias(false), ) normalizedSQL, statementMetadata, _ := normalizer.Normalize( ` /* this is a comment */ SELECT * FROM users WHERE id in (?, ?) `, ) fmt.Println(normalizedSQL) fmt.Println(statementMetadata)
Output: SELECT * FROM users WHERE id in ( ? ) &{[users] [/* this is a comment */] [SELECT]}
func NewNormalizer ¶
func NewNormalizer(opts ...normalizerOption) *Normalizer
func (*Normalizer) Normalize ¶
func (n *Normalizer) Normalize(input string, lexerOpts ...lexerOption) (normalized string, info *StatementMetadata, err error)
Normalize takes an input SQL string and returns a normalized SQL string, a StatementMetadata struct, and an error. The normalizer collapses input SQL into compact format, groups obfuscated values into single placeholder, and collects metadata such as table names, comments, and commands.
type Obfuscator ¶
type Obfuscator struct {
// contains filtered or unexported fields
}
Example ¶
obfuscator := NewObfuscator() obfuscated := obfuscator.Obfuscate("SELECT * FROM users WHERE id = 1") fmt.Println(obfuscated)
Output: SELECT * FROM users WHERE id = ?
func NewObfuscator ¶
func NewObfuscator(opts ...obfuscatorOption) *Obfuscator
func (*Obfuscator) Obfuscate ¶
func (o *Obfuscator) Obfuscate(input string, lexerOpts ...lexerOption) string
Obfuscate takes an input SQL string and returns an obfuscated SQL string. The obfuscator replaces all literal values with a single placeholder
type StatementMetadata ¶
type TokenType ¶
type TokenType int
const ( ERROR TokenType = iota EOF WS // whitespace STRING // string literal INCOMPLETE_STRING // illegal string literal so that we can obfuscate it, e.g. 'abc NUMBER // number literal IDENT // identifier OPERATOR // operator WILDCARD // wildcard * COMMENT // comment MULTILINE_COMMENT // multiline comment PUNCTUATION // punctuation DOLLAR_QUOTED_FUNCTION // dollar quoted function DOLLAR_QUOTED_STRING // dollar quoted string NUMBERED_PARAMETER // numbered parameter UNKNOWN // unknown token )