Documentation
¶
Overview ¶
Package keywords provides SQL keyword definitions and categorization for multiple SQL dialects. It includes reserved words, DDL/DML keywords, dialect-specific extensions, and window function keywords.
Example ¶
Example demonstrates basic keyword detection and token type identification.
package main
import (
"fmt"
"github.com/ajitpratap0/GoSQLX/pkg/sql/keywords"
)
func main() {
// Create a keywords instance for generic SQL dialect
kw := keywords.New(keywords.DialectGeneric, true)
// Check if a word is a SQL keyword
if kw.IsKeyword("SELECT") {
fmt.Println("SELECT is a keyword")
}
// Get the token type for a keyword
tokenType := kw.GetTokenType("WHERE")
fmt.Printf("WHERE token type: %v\n", tokenType)
// Check if a keyword is reserved
if kw.IsReserved("FROM") {
fmt.Println("FROM is a reserved keyword")
}
}
Output: SELECT is a keyword WHERE token type: WHERE FROM is a reserved keyword
Example (CaseInsensitivity) ¶
Example_caseInsensitivity demonstrates case-insensitive keyword matching.
package main
import (
"fmt"
"github.com/ajitpratap0/GoSQLX/pkg/sql/keywords"
)
func main() {
// Create keywords with case-insensitive matching (default)
kw := keywords.New(keywords.DialectGeneric, true)
// All of these should match
examples := []string{"SELECT", "select", "Select", "SeLeCt"}
for _, word := range examples {
if kw.IsKeyword(word) {
fmt.Printf("%s is recognized as SELECT keyword\n", word)
}
}
}
Output: SELECT is recognized as SELECT keyword select is recognized as SELECT keyword Select is recognized as SELECT keyword SeLeCt is recognized as SELECT keyword
Example (DialectComparison) ¶
Example_dialectComparison demonstrates differences between SQL dialects.
package main
import (
"fmt"
"github.com/ajitpratap0/GoSQLX/pkg/sql/keywords"
)
func main() {
// Generic SQL
generic := keywords.New(keywords.DialectGeneric, true)
// PostgreSQL
postgres := keywords.New(keywords.DialectPostgreSQL, true)
// MySQL
mysql := keywords.New(keywords.DialectMySQL, true)
// Check dialect-specific keywords
testWords := []string{"ILIKE", "ZEROFILL", "MATERIALIZED"}
for _, word := range testWords {
genericMatch := generic.IsKeyword(word)
postgresMatch := postgres.IsKeyword(word)
mysqlMatch := mysql.IsKeyword(word)
fmt.Printf("%s: Generic=%v, PostgreSQL=%v, MySQL=%v\n",
word, genericMatch, postgresMatch, mysqlMatch)
}
}
Output: ILIKE: Generic=false, PostgreSQL=true, MySQL=false ZEROFILL: Generic=false, PostgreSQL=false, MySQL=true MATERIALIZED: Generic=false, PostgreSQL=true, MySQL=false
Example (DialectSupport) ¶
Example_dialectSupport demonstrates SQL dialect-specific keyword recognition.
package main
import (
"fmt"
"github.com/ajitpratap0/GoSQLX/pkg/sql/keywords"
)
func main() {
// Create keywords instance for PostgreSQL
pgKw := keywords.New(keywords.DialectPostgreSQL, true)
// PostgreSQL-specific keywords
if pgKw.IsKeyword("ILIKE") {
fmt.Println("ILIKE is a PostgreSQL keyword")
}
// Create keywords instance for MySQL
mysqlKw := keywords.New(keywords.DialectMySQL, true)
// MySQL-specific keywords
if mysqlKw.IsKeyword("ZEROFILL") {
fmt.Println("ZEROFILL is a MySQL keyword")
}
// Create keywords instance for SQLite
sqliteKw := keywords.New(keywords.DialectSQLite, true)
// SQLite-specific keywords
if sqliteKw.IsKeyword("AUTOINCREMENT") {
fmt.Println("AUTOINCREMENT is a SQLite keyword")
}
}
Output: ILIKE is a PostgreSQL keyword ZEROFILL is a MySQL keyword AUTOINCREMENT is a SQLite keyword
Example (ReservedVsNonReserved) ¶
Example_reservedVsNonReserved demonstrates distinction between reserved and non-reserved keywords.
package main
import (
"fmt"
"github.com/ajitpratap0/GoSQLX/pkg/sql/keywords"
)
func main() {
kw := keywords.New(keywords.DialectGeneric, true)
// Reserved keywords (cannot be used as identifiers)
reserved := []string{"SELECT", "FROM", "WHERE", "JOIN"}
fmt.Println("Reserved keywords:")
for _, word := range reserved {
if kw.IsReserved(word) {
fmt.Printf(" - %s\n", word)
}
}
// Non-reserved keywords (window functions - can be used as identifiers in some contexts)
nonReserved := []string{"ROW_NUMBER", "RANK", "DENSE_RANK"}
fmt.Println("Non-reserved keywords:")
for _, word := range nonReserved {
if kw.IsKeyword(word) && !kw.IsReserved(word) {
fmt.Printf(" - %s\n", word)
}
}
}
Output: Reserved keywords: - SELECT - FROM - WHERE - JOIN Non-reserved keywords: - ROW_NUMBER - RANK - DENSE_RANK
Example (TokenTypeMapping) ¶
Example_tokenTypeMapping demonstrates mapping keywords to token types.
package main
import (
"fmt"
"github.com/ajitpratap0/GoSQLX/pkg/models"
"github.com/ajitpratap0/GoSQLX/pkg/sql/keywords"
)
func main() {
kw := keywords.New(keywords.DialectGeneric, true)
// Different keywords map to different token types
keywords := map[string]models.TokenType{
"SELECT": models.TokenTypeSelect,
"FROM": models.TokenTypeFrom,
"WHERE": models.TokenTypeWhere,
"JOIN": models.TokenTypeJoin,
"GROUP": models.TokenTypeGroup,
"ORDER": models.TokenTypeOrder,
}
for word, expectedType := range keywords {
actualType := kw.GetTokenType(word)
if actualType == expectedType {
fmt.Printf("%s → %v ✓\n", word, actualType)
}
}
}
Output: SELECT → SELECT ✓ FROM → FROM ✓ WHERE → WHERE ✓ JOIN → JOIN ✓ GROUP → GROUP ✓ ORDER → ORDER ✓
Index ¶
- Variables
- type Keyword
- type KeywordCategory
- type Keywords
- func (k *Keywords) AddKeyword(keyword Keyword) error
- func (k *Keywords) GetCompoundKeywordType(s string) (models.TokenType, bool)
- func (k *Keywords) GetCompoundKeywords() KeywordCategory
- func (k *Keywords) GetDMLKeywordType(s string) (models.TokenType, bool)
- func (k *Keywords) GetKeyword(word string) (Keyword, bool)
- func (k *Keywords) GetKeywordType(s string) models.TokenType
- func (k *Keywords) GetTokenType(word string) models.TokenType
- func (k *Keywords) IsCompoundKeyword(s string) bool
- func (k *Keywords) IsCompoundKeywordStart(word string) bool
- func (k *Keywords) IsDMLKeyword(s string) bool
- func (k *Keywords) IsKeyword(s string) bool
- func (k *Keywords) IsReserved(s string) bool
- type SQLDialect
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ADDITIONAL_KEYWORDS = []Keyword{ {Word: "BETWEEN", Type: models.TokenTypeBetween, Reserved: true, ReservedForTableAlias: false}, {Word: "IS", Type: models.TokenTypeIs, Reserved: true, ReservedForTableAlias: false}, {Word: "NULL", Type: models.TokenTypeNull, Reserved: true, ReservedForTableAlias: false}, {Word: "TRUE", Type: models.TokenTypeTrue, Reserved: true, ReservedForTableAlias: false}, {Word: "FALSE", Type: models.TokenTypeFalse, Reserved: true, ReservedForTableAlias: false}, {Word: "ASC", Type: models.TokenTypeAsc, Reserved: true, ReservedForTableAlias: false}, {Word: "DESC", Type: models.TokenTypeDesc, Reserved: true, ReservedForTableAlias: false}, {Word: "CASE", Type: models.TokenTypeCase, Reserved: true, ReservedForTableAlias: false}, {Word: "WHEN", Type: models.TokenTypeWhen, Reserved: true, ReservedForTableAlias: false}, {Word: "THEN", Type: models.TokenTypeThen, Reserved: true, ReservedForTableAlias: false}, {Word: "ELSE", Type: models.TokenTypeElse, Reserved: true, ReservedForTableAlias: false}, {Word: "END", Type: models.TokenTypeEnd, Reserved: true, ReservedForTableAlias: false}, {Word: "CAST", Type: models.TokenTypeCast, Reserved: true, ReservedForTableAlias: false}, {Word: "ROW_NUMBER", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "RANK", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "DENSE_RANK", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "NTILE", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "LAG", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "LEAD", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "FIRST_VALUE", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "LAST_VALUE", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "ROLLUP", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "CUBE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "GROUPING", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "SETS", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "FILTER", Type: models.TokenTypeFilter, Reserved: true, ReservedForTableAlias: false}, {Word: "MERGE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "USING", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "MATCHED", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "SOURCE", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "TARGET", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "CREATE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "DROP", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "ALTER", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "TABLE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "ADD", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "COLUMN", Type: models.TokenTypeColumn, Reserved: true, ReservedForTableAlias: true}, {Word: "CONSTRAINT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "RENAME", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "TO", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "INDEX", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "REFRESH", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "CONCURRENTLY", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "CASCADE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "RESTRICT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "TEMPORARY", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "REPLACE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "EXISTS", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "IF", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "HASH", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "LIST", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "VALUES", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "LESS", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "THAN", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "MAXVALUE", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "TABLESPACE", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "CHECK", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: false}, {Word: "OPTION", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "CASCADED", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "LOCAL", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "TRUNCATE", Type: models.TokenTypeTruncate, Reserved: true, ReservedForTableAlias: true}, {Word: "RESTART", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "CONTINUE", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, {Word: "IDENTITY", Type: models.TokenTypeKeyword, Reserved: false, ReservedForTableAlias: false}, }
var MYSQL_SPECIFIC = []Keyword{ {Word: "BINARY", Type: models.TokenTypeKeyword}, {Word: "CHAR", Type: models.TokenTypeKeyword}, {Word: "DATETIME", Type: models.TokenTypeKeyword}, {Word: "DECIMAL", Type: models.TokenTypeKeyword}, {Word: "UNSIGNED", Type: models.TokenTypeKeyword}, {Word: "ZEROFILL", Type: models.TokenTypeKeyword}, {Word: "FORCE", Type: models.TokenTypeKeyword}, {Word: "IGNORE", Type: models.TokenTypeKeyword}, {Word: "INDEX", Type: models.TokenTypeKeyword}, {Word: "KEY", Type: models.TokenTypeKeyword}, {Word: "KEYS", Type: models.TokenTypeKeyword}, {Word: "KILL", Type: models.TokenTypeKeyword}, {Word: "OPTION", Type: models.TokenTypeKeyword}, {Word: "PURGE", Type: models.TokenTypeKeyword}, {Word: "READ", Type: models.TokenTypeKeyword}, {Word: "WRITE", Type: models.TokenTypeKeyword}, {Word: "STATUS", Type: models.TokenTypeKeyword}, {Word: "VARIABLES", Type: models.TokenTypeKeyword}, }
MySQL specific keywords
var POSTGRESQL_SPECIFIC = []Keyword{ {Word: "MATERIALIZED", Type: models.TokenTypeKeyword}, {Word: "ILIKE", Type: models.TokenTypeKeyword}, {Word: "SIMILAR", Type: models.TokenTypeKeyword}, {Word: "FREEZE", Type: models.TokenTypeKeyword}, {Word: "ANALYSE", Type: models.TokenTypeKeyword}, {Word: "ANALYZE", Type: models.TokenTypeKeyword}, {Word: "CONCURRENTLY", Type: models.TokenTypeKeyword}, {Word: "REINDEX", Type: models.TokenTypeKeyword}, {Word: "TOAST", Type: models.TokenTypeKeyword}, {Word: "NOWAIT", Type: models.TokenTypeKeyword}, {Word: "RECURSIVE", Type: models.TokenTypeKeyword}, {Word: "RETURNING", Type: models.TokenTypeKeyword}, }
PostgreSQL specific keywords
var RESERVED_FOR_TABLE_ALIAS = []Keyword{ {Word: "AS", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "WITH", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "EXPLAIN", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "ANALYZE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "SELECT", Type: models.TokenTypeSelect, Reserved: true, ReservedForTableAlias: true}, {Word: "WHERE", Type: models.TokenTypeWhere, Reserved: true, ReservedForTableAlias: true}, {Word: "GROUP", Type: models.TokenTypeGroup, Reserved: true, ReservedForTableAlias: true}, {Word: "SORT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "HAVING", Type: models.TokenTypeHaving, Reserved: true, ReservedForTableAlias: true}, {Word: "ORDER", Type: models.TokenTypeOrder, Reserved: true, ReservedForTableAlias: true}, {Word: "PIVOT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "UNPIVOT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "TOP", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "LATERAL", Type: models.TokenTypeLateral, Reserved: true, ReservedForTableAlias: true}, {Word: "VIEW", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "LIMIT", Type: models.TokenTypeLimit, Reserved: true, ReservedForTableAlias: true}, {Word: "OFFSET", Type: models.TokenTypeOffset, Reserved: true, ReservedForTableAlias: true}, {Word: "FETCH", Type: models.TokenTypeFetch, Reserved: true, ReservedForTableAlias: true}, {Word: "UNION", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "EXCEPT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "INTERSECT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "MINUS", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "ON", Type: models.TokenTypeOn, Reserved: true, ReservedForTableAlias: true}, {Word: "JOIN", Type: models.TokenTypeJoin, Reserved: true, ReservedForTableAlias: true}, {Word: "INNER", Type: models.TokenTypeInner, Reserved: true, ReservedForTableAlias: true}, {Word: "CROSS", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "FULL", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "LEFT", Type: models.TokenTypeLeft, Reserved: true, ReservedForTableAlias: true}, {Word: "RIGHT", Type: models.TokenTypeRight, Reserved: true, ReservedForTableAlias: true}, {Word: "NATURAL", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "USING", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "CLUSTER", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "DISTRIBUTE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "GLOBAL", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "ANTI", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "SEMI", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "RETURNING", Type: models.TokenTypeReturning, Reserved: true, ReservedForTableAlias: true}, {Word: "ASOF", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "MATCH_CONDITION", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "OUTER", Type: models.TokenTypeOuter, Reserved: true, ReservedForTableAlias: true}, {Word: "SET", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "QUALIFY", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "WINDOW", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "END", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "FOR", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "PARTITION", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "PREWHERE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "SETTINGS", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "FORMAT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "START", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "CONNECT", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "AND", Type: models.TokenTypeAnd, Reserved: true, ReservedForTableAlias: true}, {Word: "LIKE", Type: models.TokenTypeLike, Reserved: true, ReservedForTableAlias: true}, {Word: "ASC", Type: models.TokenTypeAsc, Reserved: true, ReservedForTableAlias: true}, {Word: "MATCH_RECOGNIZE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "SAMPLE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "TABLESAMPLE", Type: models.TokenTypeKeyword, Reserved: true, ReservedForTableAlias: true}, {Word: "FROM", Type: models.TokenTypeFrom, Reserved: true, ReservedForTableAlias: true}, {Word: "BY", Type: models.TokenTypeBy, Reserved: true, ReservedForTableAlias: true}, {Word: "OR", Type: models.TokenTypeOr, Reserved: true, ReservedForTableAlias: true}, {Word: "NOT", Type: models.TokenTypeNot, Reserved: true, ReservedForTableAlias: true}, {Word: "IN", Type: models.TokenTypeIn, Reserved: true, ReservedForTableAlias: true}, {Word: "COUNT", Type: models.TokenTypeCount, Reserved: true, ReservedForTableAlias: true}, {Word: "SUM", Type: models.TokenTypeSum, Reserved: true, ReservedForTableAlias: true}, {Word: "AVG", Type: models.TokenTypeAvg, Reserved: true, ReservedForTableAlias: true}, {Word: "MIN", Type: models.TokenTypeMin, Reserved: true, ReservedForTableAlias: true}, {Word: "MAX", Type: models.TokenTypeMax, Reserved: true, ReservedForTableAlias: true}, {Word: "OVER", Type: models.TokenTypeOver, Reserved: true, ReservedForTableAlias: true}, {Word: "ROWS", Type: models.TokenTypeRows, Reserved: true, ReservedForTableAlias: true}, {Word: "RANGE", Type: models.TokenTypeRange, Reserved: true, ReservedForTableAlias: true}, {Word: "CURRENT", Type: models.TokenTypeCurrent, Reserved: true, ReservedForTableAlias: true}, {Word: "ROW", Type: models.TokenTypeRow, Reserved: true, ReservedForTableAlias: true}, {Word: "UNBOUNDED", Type: models.TokenTypeUnbounded, Reserved: true, ReservedForTableAlias: true}, {Word: "PRECEDING", Type: models.TokenTypePreceding, Reserved: true, ReservedForTableAlias: true}, {Word: "FOLLOWING", Type: models.TokenTypeFollowing, Reserved: true, ReservedForTableAlias: true}, {Word: "NEXT", Type: models.TokenTypeNext, Reserved: true, ReservedForTableAlias: true}, {Word: "FIRST", Type: models.TokenTypeFirst, Reserved: true, ReservedForTableAlias: true}, {Word: "ONLY", Type: models.TokenTypeOnly, Reserved: true, ReservedForTableAlias: true}, {Word: "TIES", Type: models.TokenTypeTies, Reserved: true, ReservedForTableAlias: true}, {Word: "PERCENT", Type: models.TokenTypePercent, Reserved: true, ReservedForTableAlias: true}, }
Reserved keywords that can't be used as table aliases
var SQLITE_SPECIFIC = []Keyword{ {Word: "ABORT", Type: models.TokenTypeKeyword}, {Word: "ACTION", Type: models.TokenTypeKeyword}, {Word: "AFTER", Type: models.TokenTypeKeyword}, {Word: "ATTACH", Type: models.TokenTypeKeyword}, {Word: "AUTOINCREMENT", Type: models.TokenTypeKeyword}, {Word: "CONFLICT", Type: models.TokenTypeKeyword}, {Word: "DATABASE", Type: models.TokenTypeKeyword}, {Word: "DETACH", Type: models.TokenTypeKeyword}, {Word: "EXCLUSIVE", Type: models.TokenTypeKeyword}, {Word: "INDEXED", Type: models.TokenTypeKeyword}, {Word: "INSTEAD", Type: models.TokenTypeKeyword}, {Word: "PLAN", Type: models.TokenTypeKeyword}, {Word: "QUERY", Type: models.TokenTypeKeyword}, {Word: "RAISE", Type: models.TokenTypeKeyword}, {Word: "REPLACE", Type: models.TokenTypeKeyword}, {Word: "TEMP", Type: models.TokenTypeKeyword}, {Word: "TEMPORARY", Type: models.TokenTypeKeyword}, {Word: "VACUUM", Type: models.TokenTypeKeyword}, {Word: "VIRTUAL", Type: models.TokenTypeKeyword}, }
SQLite specific keywords
Functions ¶
This section is empty.
Types ¶
type KeywordCategory ¶
KeywordCategory represents a category of SQL keywords
type Keywords ¶
type Keywords struct {
// Keyword categories
DMLKeywords KeywordCategory
CompoundKeywords KeywordCategory
// contains filtered or unexported fields
}
Keywords holds all SQL keyword categories and configuration
func New ¶
func New(dialect SQLDialect, ignoreCase bool) *Keywords
addKeywordsWithCategory is a helper method to add multiple keywords New creates a new Keywords instance with the specified dialect and case sensitivity
func (*Keywords) AddKeyword ¶
func (*Keywords) GetCompoundKeywordType ¶
GetCompoundKeywordType returns the token type for a compound keyword
func (*Keywords) GetCompoundKeywords ¶
func (k *Keywords) GetCompoundKeywords() KeywordCategory
GetCompoundKeywords returns the compound keywords map
func (*Keywords) GetDMLKeywordType ¶
GetDMLKeywordType returns the token type for a DML keyword
func (*Keywords) GetKeywordType ¶
GetKeywordType returns the token type for a keyword
func (*Keywords) GetTokenType ¶
GetTokenType returns the token type for a given keyword
func (*Keywords) IsCompoundKeyword ¶
IsCompoundKeyword checks if a string is a compound keyword
func (*Keywords) IsCompoundKeywordStart ¶
IsCompoundKeywordStart checks if a word can start a compound keyword
func (*Keywords) IsDMLKeyword ¶
IsDMLKeyword checks if a given string is a DML keyword
func (*Keywords) IsReserved ¶
IsReserved checks if a keyword is reserved
type SQLDialect ¶
type SQLDialect string
SQLDialect represents different SQL dialects
const ( DialectUnknown SQLDialect = "unknown" DialectGeneric SQLDialect = "generic" DialectMySQL SQLDialect = "mysql" DialectPostgreSQL SQLDialect = "postgresql" DialectSQLite SQLDialect = "sqlite" )