identifier

package
v0.66.0 Latest Latest
Warning

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

Go to latest
Published: Sep 19, 2026 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

Package identifier validates a single bare, unquoted SQL identifier segment against its vendor's grammar and byte cap. It is a leaf: it imports only the standard library and database/types, so a consumer that must validate a schema or role name before opening a connection can import it alone.

Index

Constants

View Source
const (
	// MaxPostgreSQLBytes is NAMEDATALEN-1. PostgreSQL silently truncates
	// longer names, so two 64-byte names sharing a prefix collapse onto one
	// object; refusing them here surfaces the collision at the boundary.
	MaxPostgreSQLBytes = 63
	// MaxOracleBytes is the Oracle 12.2+ limit (earlier releases cap at 30
	// and are not modeled). Oracle raises ORA-00972 rather than truncating.
	MaxOracleBytes = 128
)

Byte caps per vendor. Length is measured in bytes, not runes: that is the unit the server truncates on.

Variables

View Source
var (
	ErrEmptyIdentifier   = errors.New("identifier: empty")
	ErrIdentifierCharset = errors.New("identifier: character outside the vendor grammar")
	ErrIdentifierTooLong = errors.New("identifier: exceeds the vendor byte cap")
	ErrUnsupportedVendor = errors.New("identifier: unsupported vendor")
)

Sentinels, one per refusal class. Each is wrapped with the offending value (or vendor) so errors.Is works and the message still names the input.

Functions

func Validate

func Validate(vendor dbtypes.Vendor, value string) error

Validate reports whether value is one bare, unquoted identifier segment under vendor's grammar. Bare means no dots, alias or wildcard: validate a qualified name one segment at a time.

  • dbtypes.PostgreSQL: ^[A-Za-z_][A-Za-z0-9_$]*$, at most MaxPostgreSQLBytes.
  • dbtypes.Oracle: ^[A-Za-z_][A-Za-z0-9_$#]*$, at most MaxOracleBytes.
  • any other vendor: ErrUnsupportedVendor.

Both grammars are a deliberate conservative ASCII subset of the vendor's unquoted-identifier rule: a non-ASCII letter the server itself would accept is rejected here by policy, so accepted names are safe to splice unquoted on every path. The value is validated as given — never trimmed — so surrounding whitespace is rejected. Length is byte length and is checked before the grammar, so an over-long value reports the cap even when it also has a bad character. The cap exists because PostgreSQL silently truncates a longer name, so two over-long names sharing a prefix would collapse onto one object. Mixed case is accepted; note that the server folds an unquoted identifier — PostgreSQL to lowercase, Oracle to uppercase — so "Foo" and "foo" name the same object once unquoted.

This is the identifier grammar. The query builder's lexer (database/internal/sqllex) tokenises a broader vendor-mixed character set and is not a substitute for it.

func ValidateCharset added in v0.64.0

func ValidateCharset(vendor dbtypes.Vendor, value string) error

ValidateCharset is Validate without the byte cap: it reports whether value is one bare, unquoted segment under vendor's CHARACTER grammar, and says nothing about length. The vendor and empty rules are Validate's.

This is the charset half of Validate, and it stays a door of its own because the query builder needs the two halves apart. The builder judges every identifier argument's charset here — where a rejected `#` is the difference between failing at ToSQL() and failing at execution on PostgreSQL — and judges length separately, per segment, against the renderer's MaxBytes(). The split is not bookkeeping: the exemption for a quoted segment is the charset's alone. A quoted segment's interior is still capped, because quoting escapes the vendor's alphabet, not its byte limit.

Types

This section is empty.

Jump to

Keyboard shortcuts

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