snapshot of https://github.com/sqlc-dev/sqlc.git (main, 2026-09-16; blobs > 131072B omitted)
Some checks failed
kotlin / test (push) Has been skipped
python / test (push) Has been skipped
typescript / test (push) Has been skipped
go / build darwin/amd64 (push) Has been cancelled
go / build linux/amd64 (push) Has been cancelled
go / build windows/amd64 (push) Has been cancelled
go / build darwin/arm64 (push) Has been cancelled
go / build linux/arm64 (push) Has been cancelled
go / build windows/arm64 (push) Has been cancelled
go / test (push) Has been cancelled
go / vuln_check (push) Has been cancelled

This commit is contained in:
upstream-mirror
2026-09-16 02:17:34 +05:00
commit 0f4df23290
7340 changed files with 238743 additions and 0 deletions

View File

@@ -0,0 +1,322 @@
package analyzer
import (
"context"
"errors"
"fmt"
"strings"
"sync"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgconn"
"github.com/jackc/pgx/v5/pgxpool"
core "github.com/sqlc-dev/sqlc/internal/analysis"
"github.com/sqlc-dev/sqlc/internal/config"
"github.com/sqlc-dev/sqlc/internal/dbmanager"
"github.com/sqlc-dev/sqlc/internal/shfmt"
"github.com/sqlc-dev/sqlc/internal/sql/ast"
"github.com/sqlc-dev/sqlc/internal/sql/named"
"github.com/sqlc-dev/sqlc/internal/sql/sqlerr"
"github.com/sqlc-dev/sqlc/internal/sqlcdebug"
)
var debugDatabases = sqlcdebug.New("databases")
type Analyzer struct {
db config.Database
client dbmanager.Client
pool *pgxpool.Pool
replacer *shfmt.Replacer
formats sync.Map
columns sync.Map
tables sync.Map
}
func New(client dbmanager.Client, db config.Database) *Analyzer {
return &Analyzer{
db: db,
client: client,
replacer: shfmt.NewReplacer(nil),
}
}
const columnQuery = `
SELECT
pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type,
pg_attribute.attnotnull as not_null,
pg_attribute.attndims as array_dims
FROM
pg_catalog.pg_attribute
WHERE
attrelid = $1
AND attnum = $2;
`
const tableQuery = `
SELECT
pg_class.relname as table_name,
pg_namespace.nspname as schema_name
FROM
pg_catalog.pg_class
JOIN
pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
pg_class.oid = $1;
`
type pgTable struct {
TableName string `db:"table_name"`
SchemaName string `db:"schema_name"`
}
// Cache these types in memory
func (a *Analyzer) tableInfo(ctx context.Context, oid uint32) (*pgTable, error) {
ctbl, ok := a.tables.Load(oid)
if ok {
return ctbl.(*pgTable), nil
}
rows, err := a.pool.Query(ctx, tableQuery, oid)
if err != nil {
return nil, err
}
tbl, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[pgTable])
if err != nil {
return nil, err
}
a.tables.Store(oid, &tbl)
return &tbl, nil
}
type pgColumn struct {
DataType string `db:"data_type"`
NotNull bool `db:"not_null"`
ArrayDims int `db:"array_dims"`
}
type columnKey struct {
OID uint32
Attr uint16
}
// Cache these types in memory
func (a *Analyzer) columnInfo(ctx context.Context, field pgconn.FieldDescription) (*pgColumn, error) {
key := columnKey{field.TableOID, field.TableAttributeNumber}
cinfo, ok := a.columns.Load(key)
if ok {
return cinfo.(*pgColumn), nil
}
rows, err := a.pool.Query(ctx, columnQuery, field.TableOID, int16(field.TableAttributeNumber))
if err != nil {
return nil, err
}
col, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[pgColumn])
if err != nil {
return nil, err
}
a.columns.Store(key, &col)
return &col, nil
}
type formatKey struct {
OID uint32
Modified int32
}
// TODO: Use PGX to do the lookup for basic OID types
func (a *Analyzer) formatType(ctx context.Context, oid uint32, modifier int32) (string, error) {
key := formatKey{oid, modifier}
ftyp, ok := a.formats.Load(key)
if ok {
return ftyp.(string), nil
}
rows, err := a.pool.Query(ctx, `SELECT format_type($1, $2)`, oid, modifier)
if err != nil {
return "", err
}
dt, err := pgx.CollectOneRow(rows, pgx.RowTo[string])
if err != nil {
return "", err
}
a.formats.Store(key, dt)
return dt, err
}
// TODO: This is bad
func rewriteType(dt string) string {
switch {
case strings.HasPrefix(dt, "character("):
return "pg_catalog.bpchar"
case strings.HasPrefix(dt, "character varying"):
return "pg_catalog.varchar"
case strings.HasPrefix(dt, "bit varying"):
return "pg_catalog.varbit"
case strings.HasPrefix(dt, "bit("):
return "pg_catalog.bit"
}
switch dt {
case "bpchar":
return "pg_catalog.bpchar"
case "timestamp without time zone":
return "pg_catalog.timestamp"
case "timestamp with time zone":
return "pg_catalog.timestamptz"
case "time without time zone":
return "pg_catalog.time"
case "time with time zone":
return "pg_catalog.timetz"
}
return dt
}
func parseType(dt string) (string, bool, int) {
size := 0
for {
trimmed := strings.TrimSuffix(dt, "[]")
if trimmed == dt {
return rewriteType(dt), size > 0, size
}
size += 1
dt = trimmed
}
}
// Don't create a database per query
func (a *Analyzer) Analyze(ctx context.Context, n ast.Node, query string, migrations []string, ps *named.ParamSet) (*core.Analysis, error) {
extractSqlErr := func(e error) error {
var pgErr *pgconn.PgError
if errors.As(e, &pgErr) {
return &sqlerr.Error{
Code: pgErr.Code,
Message: pgErr.Message,
Location: max(n.Pos()+int(pgErr.Position)-1, 0),
}
}
return e
}
if a.pool == nil {
var uri string
if a.db.Managed {
if a.client == nil {
return nil, fmt.Errorf("client is nil")
}
edb, err := a.client.CreateDatabase(ctx, &dbmanager.CreateDatabaseRequest{
Engine: "postgresql",
Migrations: migrations,
})
if err != nil {
return nil, err
}
uri = edb.Uri
} else if debugDatabases.Value() == "managed" {
return nil, fmt.Errorf("database: connections disabled via SQLCDEBUG=databases=managed")
} else {
uri = a.replacer.Replace(a.db.URI)
}
conf, err := pgxpool.ParseConfig(uri)
if err != nil {
return nil, err
}
pool, err := pgxpool.NewWithConfig(ctx, conf)
if err != nil {
return nil, err
}
a.pool = pool
}
c, err := a.pool.Acquire(ctx)
if err != nil {
return nil, err
}
defer c.Release()
// TODO: Pick a random name
desc, err := c.Conn().Prepare(ctx, "foo", query)
if err != nil {
return nil, extractSqlErr(err)
}
if err := c.Conn().Deallocate(ctx, "foo"); err != nil {
return nil, err
}
var result core.Analysis
for _, field := range desc.Fields {
if field.TableOID > 0 {
col, err := a.columnInfo(ctx, field)
if err != nil {
return nil, err
}
// debug.Dump(i, field, col)
tbl, err := a.tableInfo(ctx, field.TableOID)
if err != nil {
return nil, err
}
dt, isArray, dims := parseType(col.DataType)
notNull := col.NotNull
name := field.Name
result.Columns = append(result.Columns, &core.Column{
Name: name,
OriginalName: field.Name,
DataType: dt,
NotNull: notNull,
IsArray: isArray,
ArrayDims: int32(max(col.ArrayDims, dims)),
Table: &core.Identifier{
Schema: tbl.SchemaName,
Name: tbl.TableName,
},
})
} else {
dataType, err := a.formatType(ctx, field.DataTypeOID, field.TypeModifier)
if err != nil {
return nil, err
}
// debug.Dump(i, field, dataType)
notNull := false
name := field.Name
dt, isArray, dims := parseType(dataType)
result.Columns = append(result.Columns, &core.Column{
Name: name,
OriginalName: field.Name,
DataType: dt,
NotNull: notNull,
IsArray: isArray,
ArrayDims: int32(dims),
})
}
}
for i, oid := range desc.ParamOIDs {
dataType, err := a.formatType(ctx, oid, -1)
if err != nil {
return nil, err
}
notNull := false
dt, isArray, dims := parseType(dataType)
name := ""
if ps != nil {
name, _ = ps.NameFor(i + 1)
}
result.Params = append(result.Params, &core.Parameter{
Number: int32(i + 1),
Column: &core.Column{
Name: name,
DataType: dt,
IsArray: isArray,
ArrayDims: int32(dims),
NotNull: notNull,
},
})
}
return &result, nil
}
func (a *Analyzer) Close(_ context.Context) error {
if a.pool != nil {
a.pool.Close()
}
return nil
}

View File

@@ -0,0 +1,40 @@
package postgresql
import (
"github.com/sqlc-dev/sqlc/internal/core/seed"
"github.com/sqlc-dev/sqlc/internal/sql/catalog"
)
func NewCatalog() *catalog.Catalog {
c := catalog.New("public")
c.Schemas = append(c.Schemas, pgTemp())
c.Schemas = append(c.Schemas, genPGCatalog())
c.Schemas = append(c.Schemas, genInformationSchema())
c.SearchPath = []string{"pg_catalog"}
c.LoadExtension = loadExtension
return c
}
// genPGCatalog and genInformationSchema build the schemas sqlc knows
// PostgreSQL by. Both read the dialect directory, which goldeneye writes,
// and which the analysis core seeds its catalog from as well.
func genPGCatalog() *catalog.Schema {
return systemSchema("pg_catalog", pgCatalogFuncs())
}
func genInformationSchema() *catalog.Schema {
return systemSchema("information_schema", nil)
}
// systemSchema builds a schema from the relations recorded for it. The tables
// are read fresh each time, because a catalog is free to change the schemas it
// was built with.
func systemSchema(name string, funcs []*catalog.Function) *catalog.Schema {
tables, err := seed.Relations(dialectFS, "dialect", name)
if err != nil {
// The relations are embedded in the binary: a failure here means sqlc
// was built from a broken tree, which no caller can do anything about.
panic(err)
}
return &catalog.Schema{Name: name, Funcs: funcs, Tables: tables}
}

View File

@@ -0,0 +1,170 @@
package postgresql
import (
"errors"
"strconv"
"strings"
"testing"
"github.com/sqlc-dev/sqlc/internal/sql/sqlerr"
"github.com/google/go-cmp/cmp"
)
func TestUpdateErrors(t *testing.T) {
p := NewParser()
for i, tc := range []struct {
stmt string
err *sqlerr.Error
}{
{
`
CREATE TABLE foo ();
CREATE TABLE foo ();
`,
sqlerr.RelationExists("foo"),
},
{
`
CREATE TYPE foo AS ENUM ('bar');
CREATE TYPE foo AS ENUM ('bar');
`,
sqlerr.TypeExists("foo"),
},
{
`
DROP TABLE foo;
`,
sqlerr.RelationNotFound("foo"),
},
{
`
DROP TYPE foo;
`,
sqlerr.TypeNotFound("foo"),
},
{
`
CREATE TABLE foo ();
CREATE TABLE bar ();
ALTER TABLE foo RENAME TO bar;
`,
sqlerr.RelationExists("bar"),
},
{
`
ALTER TABLE foo RENAME TO bar;
`,
sqlerr.RelationNotFound("foo"),
},
{
`
CREATE TABLE foo ();
ALTER TABLE foo ADD COLUMN bar text;
ALTER TABLE foo ADD COLUMN bar text;
`,
sqlerr.ColumnExists("foo", "bar"),
},
{
`
CREATE TABLE foo ();
ALTER TABLE foo DROP COLUMN bar;
`,
sqlerr.ColumnNotFound("foo", "bar"),
},
{
`
CREATE TABLE foo ();
ALTER TABLE foo ALTER COLUMN bar SET NOT NULL;
`,
sqlerr.ColumnNotFound("foo", "bar"),
},
{
`
CREATE TABLE foo ();
ALTER TABLE foo ALTER COLUMN bar DROP NOT NULL;
`,
sqlerr.ColumnNotFound("foo", "bar"),
},
{
`
CREATE SCHEMA foo;
CREATE SCHEMA foo;
`,
sqlerr.SchemaExists("foo"),
},
{
`
ALTER TABLE foo.baz SET SCHEMA bar;
`,
sqlerr.SchemaNotFound("foo"),
},
{
`
CREATE SCHEMA foo;
ALTER TABLE foo.baz SET SCHEMA bar;
`,
sqlerr.RelationNotFound("baz"),
},
{
`
CREATE SCHEMA foo;
CREATE TABLE foo.baz ();
ALTER TABLE foo.baz SET SCHEMA bar;
`,
sqlerr.SchemaNotFound("bar"),
},
{
`
DROP SCHEMA bar;
`,
sqlerr.SchemaNotFound("bar"),
},
{
`
ALTER TABLE foo RENAME bar TO baz;
`,
sqlerr.RelationNotFound("foo"),
},
{
`
CREATE TABLE foo ();
ALTER TABLE foo RENAME bar TO baz;
`,
sqlerr.ColumnNotFound("foo", "bar"),
},
{
`
CREATE TABLE foo (bar text, baz text);
ALTER TABLE foo RENAME bar TO baz;
`,
sqlerr.ColumnExists("foo", "baz"),
},
} {
test := tc
t.Run(strconv.Itoa(i), func(t *testing.T) {
stmts, err := p.Parse(strings.NewReader(test.stmt))
if err != nil {
t.Log(test.stmt)
t.Fatal(err)
}
c := NewCatalog()
err = c.Build(stmts)
if err == nil {
t.Log(test.stmt)
t.Fatal("err was nil")
}
var actual *sqlerr.Error
if !errors.As(err, &actual) {
t.Fatalf("err is not *sqlerr.Error: %#v", err)
}
if diff := cmp.Diff(test.err.Error(), actual.Error()); diff != "" {
t.Log(test.stmt)
t.Errorf("error mismatch: \n%s", diff)
}
})
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,15 @@
{
"dialect": "postgresql",
"const": {
"integer": "integer",
"float": "numeric",
"string": "text",
"bool": "boolean"
},
"bool": "boolean",
"comparison": ["=", "<>", "!=", "<", "<=", ">", ">=", "IS DISTINCT FROM", "IS NOT DISTINCT FROM"],
"comparison_categories": "BNSDTU",
"arithmetic": ["+", "-", "*", "/", "%"],
"arithmetic_categories": "N",
"cast_categories": "NSD"
}

View File

@@ -0,0 +1,6 @@
{"name":"pg_file_rename","args":[{"type":"text"},{"type":"text"}],"returns":"boolean"}
{"name":"pg_file_rename","args":[{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"boolean"}
{"name":"pg_file_sync","args":[{"type":"text"}],"returns":"void"}
{"name":"pg_file_unlink","args":[{"type":"text"}],"returns":"boolean"}
{"name":"pg_file_write","args":[{"type":"text"},{"type":"text"},{"type":"boolean"}],"returns":"bigint"}
{"name":"pg_logdir_ls","returns":"record"}

View File

@@ -0,0 +1,6 @@
{"name":"bt_index_check","args":[{"name":"index","type":"regclass"}],"returns":"void"}
{"name":"bt_index_check","args":[{"name":"index","type":"regclass"},{"name":"heapallindexed","type":"boolean"}],"returns":"void"}
{"name":"bt_index_parent_check","args":[{"name":"index","type":"regclass"}],"returns":"void"}
{"name":"bt_index_parent_check","args":[{"name":"index","type":"regclass"},{"name":"heapallindexed","type":"boolean"}],"returns":"void"}
{"name":"bt_index_parent_check","args":[{"name":"index","type":"regclass"},{"name":"heapallindexed","type":"boolean"},{"name":"rootdescend","type":"boolean"}],"returns":"void"}
{"name":"verify_heapam","args":[{"name":"relation","type":"regclass"},{"name":"on_error_stop","type":"boolean","has_default":true},{"name":"check_toast","type":"boolean","has_default":true},{"name":"skip","type":"text","has_default":true},{"name":"startblock","type":"bigint","has_default":true},{"name":"endblock","type":"bigint","has_default":true}],"returns":"record"}

View File

@@ -0,0 +1,2 @@
{"name":"gin_enum_cmp","args":[{"type":"anyenum"},{"type":"anyenum"}],"returns":"integer"}
{"name":"gin_numeric_cmp","args":[{"type":"numeric"},{"type":"numeric"}],"returns":"integer"}

View File

@@ -0,0 +1,24 @@
{"name":"cash_dist","args":[{"type":"money"},{"type":"money"}],"returns":"money"}
{"name":"date_dist","args":[{"type":"date"},{"type":"date"}],"returns":"integer"}
{"name":"float4_dist","args":[{"type":"real"},{"type":"real"}],"returns":"real"}
{"name":"float8_dist","args":[{"type":"double precision"},{"type":"double precision"}],"returns":"double precision"}
{"name":"gbtreekey16_in","args":[{"type":"cstring"}],"returns":"gbtreekey16"}
{"name":"gbtreekey16_out","args":[{"type":"gbtreekey16"}],"returns":"cstring"}
{"name":"gbtreekey2_in","args":[{"type":"cstring"}],"returns":"gbtreekey2"}
{"name":"gbtreekey2_out","args":[{"type":"gbtreekey2"}],"returns":"cstring"}
{"name":"gbtreekey32_in","args":[{"type":"cstring"}],"returns":"gbtreekey32"}
{"name":"gbtreekey32_out","args":[{"type":"gbtreekey32"}],"returns":"cstring"}
{"name":"gbtreekey4_in","args":[{"type":"cstring"}],"returns":"gbtreekey4"}
{"name":"gbtreekey4_out","args":[{"type":"gbtreekey4"}],"returns":"cstring"}
{"name":"gbtreekey8_in","args":[{"type":"cstring"}],"returns":"gbtreekey8"}
{"name":"gbtreekey8_out","args":[{"type":"gbtreekey8"}],"returns":"cstring"}
{"name":"gbtreekey_var_in","args":[{"type":"cstring"}],"returns":"gbtreekey_var"}
{"name":"gbtreekey_var_out","args":[{"type":"gbtreekey_var"}],"returns":"cstring"}
{"name":"int2_dist","args":[{"type":"smallint"},{"type":"smallint"}],"returns":"smallint"}
{"name":"int4_dist","args":[{"type":"integer"},{"type":"integer"}],"returns":"integer"}
{"name":"int8_dist","args":[{"type":"bigint"},{"type":"bigint"}],"returns":"bigint"}
{"name":"interval_dist","args":[{"type":"interval"},{"type":"interval"}],"returns":"interval"}
{"name":"oid_dist","args":[{"type":"oid"},{"type":"oid"}],"returns":"oid"}
{"name":"time_dist","args":[{"type":"time without time zone"},{"type":"time without time zone"}],"returns":"interval"}
{"name":"ts_dist","args":[{"type":"timestamp without time zone"},{"type":"timestamp without time zone"}],"returns":"interval"}
{"name":"tstz_dist","args":[{"type":"timestamp with time zone"},{"type":"timestamp with time zone"}],"returns":"interval"}

View File

@@ -0,0 +1,6 @@
{"name":"gbtreekey4","category":"U"}
{"name":"gbtreekey8","category":"U"}
{"name":"gbtreekey16","category":"U"}
{"name":"gbtreekey32","category":"U"}
{"name":"gbtreekey_var","category":"U"}
{"name":"gbtreekey2","category":"U"}

View File

@@ -0,0 +1,46 @@
{"name":"citext","args":[{"type":"boolean"}],"returns":"citext"}
{"name":"citext","args":[{"type":"character"}],"returns":"citext"}
{"name":"citext","args":[{"type":"inet"}],"returns":"citext"}
{"name":"citext_cmp","args":[{"type":"citext"},{"type":"citext"}],"returns":"integer"}
{"name":"citext_eq","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_ge","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_gt","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_hash","args":[{"type":"citext"}],"returns":"integer"}
{"name":"citext_hash_extended","args":[{"type":"citext"},{"type":"bigint"}],"returns":"bigint"}
{"name":"citext_larger","args":[{"type":"citext"},{"type":"citext"}],"returns":"citext"}
{"name":"citext_le","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_lt","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_ne","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_pattern_cmp","args":[{"type":"citext"},{"type":"citext"}],"returns":"integer"}
{"name":"citext_pattern_ge","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_pattern_gt","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_pattern_le","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_pattern_lt","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"citext_smaller","args":[{"type":"citext"},{"type":"citext"}],"returns":"citext"}
{"name":"citextin","args":[{"type":"cstring"}],"returns":"citext"}
{"name":"citextout","args":[{"type":"citext"}],"returns":"cstring"}
{"name":"citextsend","args":[{"type":"citext"}],"returns":"bytea"}
{"name":"max","args":[{"type":"citext"}],"returns":"citext"}
{"name":"min","args":[{"type":"citext"}],"returns":"citext"}
{"name":"regexp_match","args":[{"type":"citext"},{"type":"citext"}],"returns":"text[]"}
{"name":"regexp_match","args":[{"type":"citext"},{"type":"citext"},{"type":"text"}],"returns":"text[]"}
{"name":"regexp_matches","args":[{"type":"citext"},{"type":"citext"}],"returns":"text[]"}
{"name":"regexp_matches","args":[{"type":"citext"},{"type":"citext"},{"type":"text"}],"returns":"text[]"}
{"name":"regexp_replace","args":[{"type":"citext"},{"type":"citext"},{"type":"text"}],"returns":"text"}
{"name":"regexp_replace","args":[{"type":"citext"},{"type":"citext"},{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"regexp_split_to_array","args":[{"type":"citext"},{"type":"citext"}],"returns":"text[]"}
{"name":"regexp_split_to_array","args":[{"type":"citext"},{"type":"citext"},{"type":"text"}],"returns":"text[]"}
{"name":"regexp_split_to_table","args":[{"type":"citext"},{"type":"citext"}],"returns":"text"}
{"name":"regexp_split_to_table","args":[{"type":"citext"},{"type":"citext"},{"type":"text"}],"returns":"text"}
{"name":"replace","args":[{"type":"citext"},{"type":"citext"},{"type":"citext"}],"returns":"text"}
{"name":"split_part","args":[{"type":"citext"},{"type":"citext"},{"type":"integer"}],"returns":"text"}
{"name":"strpos","args":[{"type":"citext"},{"type":"citext"}],"returns":"integer"}
{"name":"texticlike","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"texticlike","args":[{"type":"citext"},{"type":"text"}],"returns":"boolean"}
{"name":"texticnlike","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"texticnlike","args":[{"type":"citext"},{"type":"text"}],"returns":"boolean"}
{"name":"texticregexeq","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"texticregexeq","args":[{"type":"citext"},{"type":"text"}],"returns":"boolean"}
{"name":"texticregexne","args":[{"type":"citext"},{"type":"citext"}],"returns":"boolean"}
{"name":"texticregexne","args":[{"type":"citext"},{"type":"text"}],"returns":"boolean"}
{"name":"translate","args":[{"type":"citext"},{"type":"citext"},{"type":"text"}],"returns":"text"}

View File

@@ -0,0 +1 @@
{"name":"citext","category":"S"}

View File

@@ -0,0 +1,33 @@
{"name":"cube","args":[{"type":"cube"},{"type":"double precision"}],"returns":"cube"}
{"name":"cube","args":[{"type":"cube"},{"type":"double precision"},{"type":"double precision"}],"returns":"cube"}
{"name":"cube","args":[{"type":"double precision"}],"returns":"cube"}
{"name":"cube","args":[{"type":"double precision"},{"type":"double precision"}],"returns":"cube"}
{"name":"cube","args":[{"type":"double precision[]"}],"returns":"cube"}
{"name":"cube","args":[{"type":"double precision[]"},{"type":"double precision[]"}],"returns":"cube"}
{"name":"cube_cmp","args":[{"type":"cube"},{"type":"cube"}],"returns":"integer"}
{"name":"cube_contained","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_contains","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_coord","args":[{"type":"cube"},{"type":"integer"}],"returns":"double precision"}
{"name":"cube_coord_llur","args":[{"type":"cube"},{"type":"integer"}],"returns":"double precision"}
{"name":"cube_dim","args":[{"type":"cube"}],"returns":"integer"}
{"name":"cube_distance","args":[{"type":"cube"},{"type":"cube"}],"returns":"double precision"}
{"name":"cube_enlarge","args":[{"type":"cube"},{"type":"double precision"},{"type":"integer"}],"returns":"cube"}
{"name":"cube_eq","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_ge","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_gt","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_in","args":[{"type":"cstring"}],"returns":"cube"}
{"name":"cube_inter","args":[{"type":"cube"},{"type":"cube"}],"returns":"cube"}
{"name":"cube_is_point","args":[{"type":"cube"}],"returns":"boolean"}
{"name":"cube_le","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_ll_coord","args":[{"type":"cube"},{"type":"integer"}],"returns":"double precision"}
{"name":"cube_lt","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_ne","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_out","args":[{"type":"cube"}],"returns":"cstring"}
{"name":"cube_overlap","args":[{"type":"cube"},{"type":"cube"}],"returns":"boolean"}
{"name":"cube_send","args":[{"type":"cube"}],"returns":"bytea"}
{"name":"cube_size","args":[{"type":"cube"}],"returns":"double precision"}
{"name":"cube_subset","args":[{"type":"cube"},{"type":"integer[]"}],"returns":"cube"}
{"name":"cube_union","args":[{"type":"cube"},{"type":"cube"}],"returns":"cube"}
{"name":"cube_ur_coord","args":[{"type":"cube"},{"type":"integer"}],"returns":"double precision"}
{"name":"distance_chebyshev","args":[{"type":"cube"},{"type":"cube"}],"returns":"double precision"}
{"name":"distance_taxicab","args":[{"type":"cube"},{"type":"cube"}],"returns":"double precision"}

View File

@@ -0,0 +1 @@
{"name":"cube","category":"U"}

View File

@@ -0,0 +1,41 @@
{"name":"dblink","args":[{"type":"text"}],"returns":"record"}
{"name":"dblink","args":[{"type":"text"},{"type":"boolean"}],"returns":"record"}
{"name":"dblink","args":[{"type":"text"},{"type":"text"}],"returns":"record"}
{"name":"dblink","args":[{"type":"text"},{"type":"text"},{"type":"boolean"}],"returns":"record"}
{"name":"dblink_build_sql_delete","args":[{"type":"text"},{"type":"int2vector"},{"type":"integer"},{"type":"text[]"}],"returns":"text"}
{"name":"dblink_build_sql_insert","args":[{"type":"text"},{"type":"int2vector"},{"type":"integer"},{"type":"text[]"},{"type":"text[]"}],"returns":"text"}
{"name":"dblink_build_sql_update","args":[{"type":"text"},{"type":"int2vector"},{"type":"integer"},{"type":"text[]"},{"type":"text[]"}],"returns":"text"}
{"name":"dblink_cancel_query","args":[{"type":"text"}],"returns":"text"}
{"name":"dblink_close","args":[{"type":"text"}],"returns":"text"}
{"name":"dblink_close","args":[{"type":"text"},{"type":"boolean"}],"returns":"text"}
{"name":"dblink_close","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"dblink_close","args":[{"type":"text"},{"type":"text"},{"type":"boolean"}],"returns":"text"}
{"name":"dblink_connect","args":[{"type":"text"}],"returns":"text"}
{"name":"dblink_connect","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"dblink_connect_u","args":[{"type":"text"}],"returns":"text"}
{"name":"dblink_connect_u","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"dblink_current_query","returns":"text"}
{"name":"dblink_disconnect","returns":"text"}
{"name":"dblink_disconnect","args":[{"type":"text"}],"returns":"text"}
{"name":"dblink_error_message","args":[{"type":"text"}],"returns":"text"}
{"name":"dblink_exec","args":[{"type":"text"}],"returns":"text"}
{"name":"dblink_exec","args":[{"type":"text"},{"type":"boolean"}],"returns":"text"}
{"name":"dblink_exec","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"dblink_exec","args":[{"type":"text"},{"type":"text"},{"type":"boolean"}],"returns":"text"}
{"name":"dblink_fdw_validator","args":[{"name":"options","type":"text[]"},{"name":"catalog","type":"oid"}],"returns":"void"}
{"name":"dblink_fetch","args":[{"type":"text"},{"type":"integer"}],"returns":"record"}
{"name":"dblink_fetch","args":[{"type":"text"},{"type":"integer"},{"type":"boolean"}],"returns":"record"}
{"name":"dblink_fetch","args":[{"type":"text"},{"type":"text"},{"type":"integer"}],"returns":"record"}
{"name":"dblink_fetch","args":[{"type":"text"},{"type":"text"},{"type":"integer"},{"type":"boolean"}],"returns":"record"}
{"name":"dblink_get_connections","returns":"text[]"}
{"name":"dblink_get_notify","returns":"record"}
{"name":"dblink_get_notify","args":[{"name":"conname","type":"text"}],"returns":"record"}
{"name":"dblink_get_pkey","args":[{"type":"text"}],"returns":"dblink_pkey_results"}
{"name":"dblink_get_result","args":[{"type":"text"}],"returns":"record"}
{"name":"dblink_get_result","args":[{"type":"text"},{"type":"boolean"}],"returns":"record"}
{"name":"dblink_is_busy","args":[{"type":"text"}],"returns":"integer"}
{"name":"dblink_open","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"dblink_open","args":[{"type":"text"},{"type":"text"},{"type":"boolean"}],"returns":"text"}
{"name":"dblink_open","args":[{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"dblink_open","args":[{"type":"text"},{"type":"text"},{"type":"text"},{"type":"boolean"}],"returns":"text"}
{"name":"dblink_send_query","args":[{"type":"text"},{"type":"text"}],"returns":"integer"}

View File

@@ -0,0 +1 @@
{"name":"dblink_pkey_results","category":"C"}

View File

@@ -0,0 +1,9 @@
{"name":"earth","returns":"double precision"}
{"name":"earth_box","args":[{"type":"earth"},{"type":"double precision"}],"returns":"cube"}
{"name":"earth_distance","args":[{"type":"earth"},{"type":"earth"}],"returns":"double precision"}
{"name":"gc_to_sec","args":[{"type":"double precision"}],"returns":"double precision"}
{"name":"geo_distance","args":[{"type":"point"},{"type":"point"}],"returns":"double precision"}
{"name":"latitude","args":[{"type":"earth"}],"returns":"double precision"}
{"name":"ll_to_earth","args":[{"type":"double precision"},{"type":"double precision"}],"returns":"earth"}
{"name":"longitude","args":[{"type":"earth"}],"returns":"double precision"}
{"name":"sec_to_gc","args":[{"type":"double precision"}],"returns":"double precision"}

View File

@@ -0,0 +1 @@
{"name":"earth","category":"U"}

View File

@@ -0,0 +1,2 @@
{"name":"file_fdw_handler","returns":"fdw_handler"}
{"name":"file_fdw_validator","args":[{"type":"text[]"},{"type":"oid"}],"returns":"void"}

View File

@@ -0,0 +1,11 @@
{"name":"daitch_mokotoff","args":[{"type":"text"}],"returns":"text[]"}
{"name":"difference","args":[{"type":"text"},{"type":"text"}],"returns":"integer"}
{"name":"dmetaphone","args":[{"type":"text"}],"returns":"text"}
{"name":"dmetaphone_alt","args":[{"type":"text"}],"returns":"text"}
{"name":"levenshtein","args":[{"type":"text"},{"type":"text"}],"returns":"integer"}
{"name":"levenshtein","args":[{"type":"text"},{"type":"text"},{"type":"integer"},{"type":"integer"},{"type":"integer"}],"returns":"integer"}
{"name":"levenshtein_less_equal","args":[{"type":"text"},{"type":"text"},{"type":"integer"}],"returns":"integer"}
{"name":"levenshtein_less_equal","args":[{"type":"text"},{"type":"text"},{"type":"integer"},{"type":"integer"},{"type":"integer"},{"type":"integer"}],"returns":"integer"}
{"name":"metaphone","args":[{"type":"text"},{"type":"integer"}],"returns":"text"}
{"name":"soundex","args":[{"type":"text"}],"returns":"text"}
{"name":"text_soundex","args":[{"type":"text"}],"returns":"text"}

View File

@@ -0,0 +1,47 @@
{"name":"akeys","args":[{"type":"hstore"}],"returns":"text[]"}
{"name":"avals","args":[{"type":"hstore"}],"returns":"text[]"}
{"name":"defined","args":[{"type":"hstore"},{"type":"text"}],"returns":"boolean"}
{"name":"delete","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"hstore"}
{"name":"delete","args":[{"type":"hstore"},{"type":"text"}],"returns":"hstore"}
{"name":"delete","args":[{"type":"hstore"},{"type":"text[]"}],"returns":"hstore"}
{"name":"each","args":[{"name":"hs","type":"hstore"}],"returns":"record"}
{"name":"exist","args":[{"type":"hstore"},{"type":"text"}],"returns":"boolean"}
{"name":"exists_all","args":[{"type":"hstore"},{"type":"text[]"}],"returns":"boolean"}
{"name":"exists_any","args":[{"type":"hstore"},{"type":"text[]"}],"returns":"boolean"}
{"name":"fetchval","args":[{"type":"hstore"},{"type":"text"}],"returns":"text"}
{"name":"ghstore_in","args":[{"type":"cstring"}],"returns":"ghstore"}
{"name":"ghstore_out","args":[{"type":"ghstore"}],"returns":"cstring"}
{"name":"hs_concat","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"hstore"}
{"name":"hs_contained","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hs_contains","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hstore","args":[{"type":"record"}],"returns":"hstore"}
{"name":"hstore","args":[{"type":"text"},{"type":"text"}],"returns":"hstore"}
{"name":"hstore","args":[{"type":"text[]"}],"returns":"hstore"}
{"name":"hstore","args":[{"type":"text[]"},{"type":"text[]"}],"returns":"hstore"}
{"name":"hstore_cmp","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"integer"}
{"name":"hstore_eq","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hstore_ge","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hstore_gt","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hstore_hash","args":[{"type":"hstore"}],"returns":"integer"}
{"name":"hstore_hash_extended","args":[{"type":"hstore"},{"type":"bigint"}],"returns":"bigint"}
{"name":"hstore_in","args":[{"type":"cstring"}],"returns":"hstore"}
{"name":"hstore_le","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hstore_lt","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hstore_ne","args":[{"type":"hstore"},{"type":"hstore"}],"returns":"boolean"}
{"name":"hstore_out","args":[{"type":"hstore"}],"returns":"cstring"}
{"name":"hstore_send","args":[{"type":"hstore"}],"returns":"bytea"}
{"name":"hstore_to_array","args":[{"type":"hstore"}],"returns":"text[]"}
{"name":"hstore_to_json","args":[{"type":"hstore"}],"returns":"json"}
{"name":"hstore_to_json_loose","args":[{"type":"hstore"}],"returns":"json"}
{"name":"hstore_to_jsonb","args":[{"type":"hstore"}],"returns":"jsonb"}
{"name":"hstore_to_jsonb_loose","args":[{"type":"hstore"}],"returns":"jsonb"}
{"name":"hstore_to_matrix","args":[{"type":"hstore"}],"returns":"text[]"}
{"name":"hstore_version_diag","args":[{"type":"hstore"}],"returns":"integer"}
{"name":"isdefined","args":[{"type":"hstore"},{"type":"text"}],"returns":"boolean"}
{"name":"isexists","args":[{"type":"hstore"},{"type":"text"}],"returns":"boolean"}
{"name":"populate_record","args":[{"type":"anyelement"},{"type":"hstore"}],"returns":"anyelement"}
{"name":"skeys","args":[{"type":"hstore"}],"returns":"text"}
{"name":"slice","args":[{"type":"hstore"},{"type":"text[]"}],"returns":"hstore"}
{"name":"slice_array","args":[{"type":"hstore"},{"type":"text[]"}],"returns":"text[]"}
{"name":"svals","args":[{"type":"hstore"}],"returns":"text"}
{"name":"tconvert","args":[{"type":"text"},{"type":"text"}],"returns":"hstore"}

View File

@@ -0,0 +1,2 @@
{"name":"hstore","category":"U"}
{"name":"ghstore","category":"U"}

View File

@@ -0,0 +1,2 @@
{"name":"int_array_aggregate","args":[{"type":"integer"}],"returns":"integer[]"}
{"name":"int_array_enum","args":[{"type":"integer[]"}],"returns":"integer"}

View File

@@ -0,0 +1,29 @@
{"name":"_int_contained","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"boolean"}
{"name":"_int_contains","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"boolean"}
{"name":"_int_different","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"boolean"}
{"name":"_int_inter","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"integer[]"}
{"name":"_int_overlap","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"boolean"}
{"name":"_int_same","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"boolean"}
{"name":"_int_union","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"integer[]"}
{"name":"_intbig_in","args":[{"type":"cstring"}],"returns":"intbig_gkey"}
{"name":"_intbig_out","args":[{"type":"intbig_gkey"}],"returns":"cstring"}
{"name":"boolop","args":[{"type":"integer[]"},{"type":"query_int"}],"returns":"boolean"}
{"name":"bqarr_in","args":[{"type":"cstring"}],"returns":"query_int"}
{"name":"bqarr_out","args":[{"type":"query_int"}],"returns":"cstring"}
{"name":"icount","args":[{"type":"integer[]"}],"returns":"integer"}
{"name":"idx","args":[{"type":"integer[]"},{"type":"integer"}],"returns":"integer"}
{"name":"intarray_del_elem","args":[{"type":"integer[]"},{"type":"integer"}],"returns":"integer[]"}
{"name":"intarray_push_array","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"integer[]"}
{"name":"intarray_push_elem","args":[{"type":"integer[]"},{"type":"integer"}],"returns":"integer[]"}
{"name":"intset","args":[{"type":"integer"}],"returns":"integer[]"}
{"name":"intset_subtract","args":[{"type":"integer[]"},{"type":"integer[]"}],"returns":"integer[]"}
{"name":"intset_union_elem","args":[{"type":"integer[]"},{"type":"integer"}],"returns":"integer[]"}
{"name":"querytree","args":[{"type":"query_int"}],"returns":"text"}
{"name":"rboolop","args":[{"type":"query_int"},{"type":"integer[]"}],"returns":"boolean"}
{"name":"sort","args":[{"type":"integer[]"}],"returns":"integer[]"}
{"name":"sort","args":[{"type":"integer[]"},{"type":"text"}],"returns":"integer[]"}
{"name":"sort_asc","args":[{"type":"integer[]"}],"returns":"integer[]"}
{"name":"sort_desc","args":[{"type":"integer[]"}],"returns":"integer[]"}
{"name":"subarray","args":[{"type":"integer[]"},{"type":"integer"}],"returns":"integer[]"}
{"name":"subarray","args":[{"type":"integer[]"},{"type":"integer"},{"type":"integer"}],"returns":"integer[]"}
{"name":"uniq","args":[{"type":"integer[]"}],"returns":"integer[]"}

View File

@@ -0,0 +1,2 @@
{"name":"query_int","category":"U"}
{"name":"intbig_gkey","category":"U"}

View File

@@ -0,0 +1,245 @@
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"ean13"}],"returns":"integer"}
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"isbn"}],"returns":"integer"}
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"isbn13"}],"returns":"integer"}
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"ismn"}],"returns":"integer"}
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"ismn13"}],"returns":"integer"}
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"issn"}],"returns":"integer"}
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"issn13"}],"returns":"integer"}
{"name":"btean13cmp","args":[{"type":"ean13"},{"type":"upc"}],"returns":"integer"}
{"name":"btisbn13cmp","args":[{"type":"isbn13"},{"type":"ean13"}],"returns":"integer"}
{"name":"btisbn13cmp","args":[{"type":"isbn13"},{"type":"isbn"}],"returns":"integer"}
{"name":"btisbn13cmp","args":[{"type":"isbn13"},{"type":"isbn13"}],"returns":"integer"}
{"name":"btisbncmp","args":[{"type":"isbn"},{"type":"ean13"}],"returns":"integer"}
{"name":"btisbncmp","args":[{"type":"isbn"},{"type":"isbn"}],"returns":"integer"}
{"name":"btisbncmp","args":[{"type":"isbn"},{"type":"isbn13"}],"returns":"integer"}
{"name":"btismn13cmp","args":[{"type":"ismn13"},{"type":"ean13"}],"returns":"integer"}
{"name":"btismn13cmp","args":[{"type":"ismn13"},{"type":"ismn"}],"returns":"integer"}
{"name":"btismn13cmp","args":[{"type":"ismn13"},{"type":"ismn13"}],"returns":"integer"}
{"name":"btismncmp","args":[{"type":"ismn"},{"type":"ean13"}],"returns":"integer"}
{"name":"btismncmp","args":[{"type":"ismn"},{"type":"ismn"}],"returns":"integer"}
{"name":"btismncmp","args":[{"type":"ismn"},{"type":"ismn13"}],"returns":"integer"}
{"name":"btissn13cmp","args":[{"type":"issn13"},{"type":"ean13"}],"returns":"integer"}
{"name":"btissn13cmp","args":[{"type":"issn13"},{"type":"issn"}],"returns":"integer"}
{"name":"btissn13cmp","args":[{"type":"issn13"},{"type":"issn13"}],"returns":"integer"}
{"name":"btissncmp","args":[{"type":"issn"},{"type":"ean13"}],"returns":"integer"}
{"name":"btissncmp","args":[{"type":"issn"},{"type":"issn"}],"returns":"integer"}
{"name":"btissncmp","args":[{"type":"issn"},{"type":"issn13"}],"returns":"integer"}
{"name":"btupccmp","args":[{"type":"upc"},{"type":"ean13"}],"returns":"integer"}
{"name":"btupccmp","args":[{"type":"upc"},{"type":"upc"}],"returns":"integer"}
{"name":"ean13_in","args":[{"type":"cstring"}],"returns":"ean13"}
{"name":"ean13_out","args":[{"type":"ean13"}],"returns":"cstring"}
{"name":"ean13_out","args":[{"type":"isbn13"}],"returns":"cstring"}
{"name":"ean13_out","args":[{"type":"ismn13"}],"returns":"cstring"}
{"name":"ean13_out","args":[{"type":"issn13"}],"returns":"cstring"}
{"name":"hashean13","args":[{"type":"ean13"}],"returns":"integer"}
{"name":"hashisbn","args":[{"type":"isbn"}],"returns":"integer"}
{"name":"hashisbn13","args":[{"type":"isbn13"}],"returns":"integer"}
{"name":"hashismn","args":[{"type":"ismn"}],"returns":"integer"}
{"name":"hashismn13","args":[{"type":"ismn13"}],"returns":"integer"}
{"name":"hashissn","args":[{"type":"issn"}],"returns":"integer"}
{"name":"hashissn13","args":[{"type":"issn13"}],"returns":"integer"}
{"name":"hashupc","args":[{"type":"upc"}],"returns":"integer"}
{"name":"is_valid","args":[{"type":"ean13"}],"returns":"boolean"}
{"name":"is_valid","args":[{"type":"isbn"}],"returns":"boolean"}
{"name":"is_valid","args":[{"type":"isbn13"}],"returns":"boolean"}
{"name":"is_valid","args":[{"type":"ismn"}],"returns":"boolean"}
{"name":"is_valid","args":[{"type":"ismn13"}],"returns":"boolean"}
{"name":"is_valid","args":[{"type":"issn"}],"returns":"boolean"}
{"name":"is_valid","args":[{"type":"issn13"}],"returns":"boolean"}
{"name":"is_valid","args":[{"type":"upc"}],"returns":"boolean"}
{"name":"isbn","args":[{"type":"ean13"}],"returns":"isbn"}
{"name":"isbn13","args":[{"type":"ean13"}],"returns":"isbn13"}
{"name":"isbn13_in","args":[{"type":"cstring"}],"returns":"isbn13"}
{"name":"isbn_in","args":[{"type":"cstring"}],"returns":"isbn"}
{"name":"ismn","args":[{"type":"ean13"}],"returns":"ismn"}
{"name":"ismn13","args":[{"type":"ean13"}],"returns":"ismn13"}
{"name":"ismn13_in","args":[{"type":"cstring"}],"returns":"ismn13"}
{"name":"ismn_in","args":[{"type":"cstring"}],"returns":"ismn"}
{"name":"isn_out","args":[{"type":"isbn"}],"returns":"cstring"}
{"name":"isn_out","args":[{"type":"ismn"}],"returns":"cstring"}
{"name":"isn_out","args":[{"type":"issn"}],"returns":"cstring"}
{"name":"isn_out","args":[{"type":"upc"}],"returns":"cstring"}
{"name":"isn_weak","returns":"boolean"}
{"name":"isn_weak","args":[{"type":"boolean"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ean13"},{"type":"upc"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"isbn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"isbn"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"isbn"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"isbn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"isbn13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"isbn13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ismn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ismn"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ismn"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ismn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ismn13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"ismn13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"issn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"issn"},{"type":"issn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"issn"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"issn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"issn13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"issn13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"upc"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isneq","args":[{"type":"upc"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ean13"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"isbn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"isbn"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"isbn"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"isbn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"isbn13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"isbn13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ismn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ismn"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ismn"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ismn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ismn13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"ismn13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"issn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"issn"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"issn"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"issn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"issn13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"issn13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"upc"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnge","args":[{"type":"upc"},{"type":"upc"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ean13"},{"type":"upc"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"isbn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"isbn"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"isbn"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"isbn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"isbn13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"isbn13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ismn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ismn"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ismn"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ismn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ismn13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"ismn13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"issn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"issn"},{"type":"issn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"issn"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"issn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"issn13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"issn13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"upc"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isngt","args":[{"type":"upc"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ean13"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"isbn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"isbn"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"isbn"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"isbn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"isbn13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"isbn13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ismn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ismn"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ismn"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ismn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ismn13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"ismn13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"issn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"issn"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"issn"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"issn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"issn13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"issn13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"upc"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnle","args":[{"type":"upc"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ean13"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"isbn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"isbn"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"isbn"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"isbn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"isbn13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"isbn13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ismn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ismn"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ismn"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ismn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ismn13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"ismn13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"issn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"issn"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"issn"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"issn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"issn13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"issn13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"upc"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnlt","args":[{"type":"upc"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ean13"},{"type":"upc"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"isbn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"isbn"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"isbn"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"isbn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"isbn13"},{"type":"isbn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"isbn13"},{"type":"isbn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ismn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ismn"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ismn"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ismn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ismn13"},{"type":"ismn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"ismn13"},{"type":"ismn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"issn"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"issn"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"issn"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"issn13"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"issn13"},{"type":"issn"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"issn13"},{"type":"issn13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"upc"},{"type":"ean13"}],"returns":"boolean"}
{"name":"isnne","args":[{"type":"upc"},{"type":"upc"}],"returns":"boolean"}
{"name":"issn","args":[{"type":"ean13"}],"returns":"issn"}
{"name":"issn13","args":[{"type":"ean13"}],"returns":"issn13"}
{"name":"issn13_in","args":[{"type":"cstring"}],"returns":"issn13"}
{"name":"issn_in","args":[{"type":"cstring"}],"returns":"issn"}
{"name":"make_valid","args":[{"type":"ean13"}],"returns":"ean13"}
{"name":"make_valid","args":[{"type":"isbn"}],"returns":"isbn"}
{"name":"make_valid","args":[{"type":"isbn13"}],"returns":"isbn13"}
{"name":"make_valid","args":[{"type":"ismn"}],"returns":"ismn"}
{"name":"make_valid","args":[{"type":"ismn13"}],"returns":"ismn13"}
{"name":"make_valid","args":[{"type":"issn"}],"returns":"issn"}
{"name":"make_valid","args":[{"type":"issn13"}],"returns":"issn13"}
{"name":"make_valid","args":[{"type":"upc"}],"returns":"upc"}
{"name":"upc","args":[{"type":"ean13"}],"returns":"upc"}
{"name":"upc_in","args":[{"type":"cstring"}],"returns":"upc"}

View File

@@ -0,0 +1,8 @@
{"name":"ean13","category":"U"}
{"name":"isbn13","category":"U"}
{"name":"ismn13","category":"U"}
{"name":"issn13","category":"U"}
{"name":"isbn","category":"U"}
{"name":"ismn","category":"U"}
{"name":"issn","category":"U"}
{"name":"upc","category":"U"}

View File

@@ -0,0 +1,2 @@
{"name":"lo_manage","returns":"trigger"}
{"name":"lo_oid","args":[{"type":"lo"}],"returns":"oid"}

View File

@@ -0,0 +1 @@
{"name":"lo","category":"N"}

View File

@@ -0,0 +1,59 @@
{"name":"_lt_q_regex","args":[{"type":"ltree[]"},{"type":"lquery[]"}],"returns":"boolean"}
{"name":"_lt_q_rregex","args":[{"type":"lquery[]"},{"type":"ltree[]"}],"returns":"boolean"}
{"name":"_ltq_extract_regex","args":[{"type":"ltree[]"},{"type":"lquery"}],"returns":"ltree"}
{"name":"_ltq_regex","args":[{"type":"ltree[]"},{"type":"lquery"}],"returns":"boolean"}
{"name":"_ltq_rregex","args":[{"type":"lquery"},{"type":"ltree[]"}],"returns":"boolean"}
{"name":"_ltree_extract_isparent","args":[{"type":"ltree[]"},{"type":"ltree"}],"returns":"ltree"}
{"name":"_ltree_extract_risparent","args":[{"type":"ltree[]"},{"type":"ltree"}],"returns":"ltree"}
{"name":"_ltree_isparent","args":[{"type":"ltree[]"},{"type":"ltree"}],"returns":"boolean"}
{"name":"_ltree_r_isparent","args":[{"type":"ltree"},{"type":"ltree[]"}],"returns":"boolean"}
{"name":"_ltree_r_risparent","args":[{"type":"ltree"},{"type":"ltree[]"}],"returns":"boolean"}
{"name":"_ltree_risparent","args":[{"type":"ltree[]"},{"type":"ltree"}],"returns":"boolean"}
{"name":"_ltxtq_exec","args":[{"type":"ltree[]"},{"type":"ltxtquery"}],"returns":"boolean"}
{"name":"_ltxtq_extract_exec","args":[{"type":"ltree[]"},{"type":"ltxtquery"}],"returns":"ltree"}
{"name":"_ltxtq_rexec","args":[{"type":"ltxtquery"},{"type":"ltree[]"}],"returns":"boolean"}
{"name":"index","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"integer"}
{"name":"index","args":[{"type":"ltree"},{"type":"ltree"},{"type":"integer"}],"returns":"integer"}
{"name":"lca","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"lca","args":[{"type":"ltree"},{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"lca","args":[{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"lca","args":[{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"lca","args":[{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"lca","args":[{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"lca","args":[{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"lca","args":[{"type":"ltree[]"}],"returns":"ltree"}
{"name":"lquery_in","args":[{"type":"cstring"}],"returns":"lquery"}
{"name":"lquery_out","args":[{"type":"lquery"}],"returns":"cstring"}
{"name":"lquery_send","args":[{"type":"lquery"}],"returns":"bytea"}
{"name":"lt_q_regex","args":[{"type":"ltree"},{"type":"lquery[]"}],"returns":"boolean"}
{"name":"lt_q_rregex","args":[{"type":"lquery[]"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltq_regex","args":[{"type":"ltree"},{"type":"lquery"}],"returns":"boolean"}
{"name":"ltq_rregex","args":[{"type":"lquery"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree2text","args":[{"type":"ltree"}],"returns":"text"}
{"name":"ltree_addltree","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"ltree"}
{"name":"ltree_addtext","args":[{"type":"ltree"},{"type":"text"}],"returns":"ltree"}
{"name":"ltree_cmp","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"integer"}
{"name":"ltree_eq","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_ge","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_gist_in","args":[{"type":"cstring"}],"returns":"ltree_gist"}
{"name":"ltree_gist_out","args":[{"type":"ltree_gist"}],"returns":"cstring"}
{"name":"ltree_gt","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_in","args":[{"type":"cstring"}],"returns":"ltree"}
{"name":"ltree_isparent","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_le","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_lt","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_ne","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_out","args":[{"type":"ltree"}],"returns":"cstring"}
{"name":"ltree_risparent","args":[{"type":"ltree"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltree_send","args":[{"type":"ltree"}],"returns":"bytea"}
{"name":"ltree_textadd","args":[{"type":"text"},{"type":"ltree"}],"returns":"ltree"}
{"name":"ltxtq_exec","args":[{"type":"ltree"},{"type":"ltxtquery"}],"returns":"boolean"}
{"name":"ltxtq_in","args":[{"type":"cstring"}],"returns":"ltxtquery"}
{"name":"ltxtq_out","args":[{"type":"ltxtquery"}],"returns":"cstring"}
{"name":"ltxtq_rexec","args":[{"type":"ltxtquery"},{"type":"ltree"}],"returns":"boolean"}
{"name":"ltxtq_send","args":[{"type":"ltxtquery"}],"returns":"bytea"}
{"name":"nlevel","args":[{"type":"ltree"}],"returns":"integer"}
{"name":"subltree","args":[{"type":"ltree"},{"type":"integer"},{"type":"integer"}],"returns":"ltree"}
{"name":"subpath","args":[{"type":"ltree"},{"type":"integer"}],"returns":"ltree"}
{"name":"subpath","args":[{"type":"ltree"},{"type":"integer"},{"type":"integer"}],"returns":"ltree"}
{"name":"text2ltree","args":[{"type":"text"}],"returns":"ltree"}

View File

@@ -0,0 +1,4 @@
{"name":"ltree","category":"U"}
{"name":"lquery","category":"U"}
{"name":"ltxtquery","category":"U"}
{"name":"ltree_gist","category":"U"}

View File

@@ -0,0 +1,31 @@
{"name":"brin_metapage_info","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"brin_page_items","args":[{"name":"page","type":"bytea"},{"name":"index_oid","type":"regclass"}],"returns":"record"}
{"name":"brin_page_type","args":[{"name":"page","type":"bytea"}],"returns":"text"}
{"name":"brin_revmap_data","args":[{"name":"page","type":"bytea"}],"returns":"tid"}
{"name":"bt_metap","args":[{"name":"relname","type":"text"}],"returns":"record"}
{"name":"bt_multi_page_stats","args":[{"name":"relname","type":"text"},{"name":"blkno","type":"bigint"},{"name":"blk_count","type":"bigint"}],"returns":"record"}
{"name":"bt_page_items","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"bt_page_items","args":[{"name":"relname","type":"text"},{"name":"blkno","type":"bigint"}],"returns":"record"}
{"name":"bt_page_stats","args":[{"name":"relname","type":"text"},{"name":"blkno","type":"bigint"}],"returns":"record"}
{"name":"fsm_page_contents","args":[{"name":"page","type":"bytea"}],"returns":"text"}
{"name":"get_raw_page","args":[{"type":"text"},{"type":"bigint"}],"returns":"bytea"}
{"name":"get_raw_page","args":[{"type":"text"},{"type":"text"},{"type":"bigint"}],"returns":"bytea"}
{"name":"gin_leafpage_items","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"gin_metapage_info","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"gin_page_opaque_info","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"gist_page_items","args":[{"name":"page","type":"bytea"},{"name":"index_oid","type":"regclass"}],"returns":"record"}
{"name":"gist_page_items_bytea","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"gist_page_opaque_info","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"hash_bitmap_info","args":[{"name":"index_oid","type":"regclass"},{"name":"blkno","type":"bigint"}],"returns":"record"}
{"name":"hash_metapage_info","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"hash_page_items","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"hash_page_stats","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"hash_page_type","args":[{"name":"page","type":"bytea"}],"returns":"text"}
{"name":"heap_page_item_attrs","args":[{"name":"page","type":"bytea"},{"name":"rel_oid","type":"regclass"}],"returns":"record"}
{"name":"heap_page_item_attrs","args":[{"name":"page","type":"bytea"},{"name":"rel_oid","type":"regclass"},{"name":"do_detoast","type":"boolean"}],"returns":"record"}
{"name":"heap_page_items","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"heap_tuple_infomask_flags","args":[{"name":"t_infomask","type":"integer"},{"name":"t_infomask2","type":"integer"}],"returns":"record"}
{"name":"page_checksum","args":[{"name":"page","type":"bytea"},{"name":"blkno","type":"bigint"}],"returns":"smallint"}
{"name":"page_header","args":[{"name":"page","type":"bytea"}],"returns":"record"}
{"name":"tuple_data_split","args":[{"name":"rel_oid","type":"oid"},{"name":"t_data","type":"bytea"},{"name":"t_infomask","type":"integer"},{"name":"t_infomask2","type":"integer"},{"name":"t_bits","type":"text"}],"returns":"bytea[]"}
{"name":"tuple_data_split","args":[{"name":"rel_oid","type":"oid"},{"name":"t_data","type":"bytea"},{"name":"t_infomask","type":"integer"},{"name":"t_infomask2","type":"integer"},{"name":"t_bits","type":"text"},{"name":"do_detoast","type":"boolean"}],"returns":"bytea[]"}

View File

@@ -0,0 +1,3 @@
{"name":"pg_buffercache_pages","returns":"record"}
{"name":"pg_buffercache_summary","returns":"record"}
{"name":"pg_buffercache_usage_counts","returns":"record"}

View File

@@ -0,0 +1,2 @@
{"name":"pg_freespace","args":[{"name":"rel","type":"regclass"}],"returns":"record"}
{"name":"pg_freespace","args":[{"type":"regclass"},{"type":"bigint"}],"returns":"smallint"}

View File

@@ -0,0 +1,3 @@
{"name":"autoprewarm_dump_now","returns":"bigint"}
{"name":"autoprewarm_start_worker","returns":"void"}
{"name":"pg_prewarm","args":[{"type":"regclass"},{"name":"mode","type":"text","has_default":true},{"name":"fork","type":"text","has_default":true},{"name":"first_block","type":"bigint","has_default":true},{"name":"last_block","type":"bigint","has_default":true}],"returns":"bigint"}

View File

@@ -0,0 +1,3 @@
{"name":"pg_stat_statements","args":[{"name":"showtext","type":"boolean"}],"returns":"record"}
{"name":"pg_stat_statements_info","returns":"record"}
{"name":"pg_stat_statements_reset","args":[{"name":"userid","type":"oid","has_default":true},{"name":"dbid","type":"oid","has_default":true},{"name":"queryid","type":"bigint","has_default":true}],"returns":"void"}

View File

@@ -0,0 +1,18 @@
{"name":"gtrgm_in","args":[{"type":"cstring"}],"returns":"gtrgm"}
{"name":"gtrgm_out","args":[{"type":"gtrgm"}],"returns":"cstring"}
{"name":"set_limit","args":[{"type":"real"}],"returns":"real"}
{"name":"show_limit","returns":"real"}
{"name":"show_trgm","args":[{"type":"text"}],"returns":"text[]"}
{"name":"similarity","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"similarity_dist","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"similarity_op","args":[{"type":"text"},{"type":"text"}],"returns":"boolean"}
{"name":"strict_word_similarity","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"strict_word_similarity_commutator_op","args":[{"type":"text"},{"type":"text"}],"returns":"boolean"}
{"name":"strict_word_similarity_dist_commutator_op","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"strict_word_similarity_dist_op","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"strict_word_similarity_op","args":[{"type":"text"},{"type":"text"}],"returns":"boolean"}
{"name":"word_similarity","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"word_similarity_commutator_op","args":[{"type":"text"},{"type":"text"}],"returns":"boolean"}
{"name":"word_similarity_dist_commutator_op","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"word_similarity_dist_op","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"word_similarity_op","args":[{"type":"text"},{"type":"text"}],"returns":"boolean"}

View File

@@ -0,0 +1 @@
{"name":"gtrgm","category":"U"}

View File

@@ -0,0 +1,8 @@
{"name":"pg_check_frozen","args":[{"type":"regclass"}],"returns":"tid"}
{"name":"pg_check_visible","args":[{"type":"regclass"}],"returns":"tid"}
{"name":"pg_truncate_visibility_map","args":[{"type":"regclass"}],"returns":"void"}
{"name":"pg_visibility","args":[{"type":"regclass"}],"returns":"record"}
{"name":"pg_visibility","args":[{"type":"regclass"},{"name":"blkno","type":"bigint"}],"returns":"record"}
{"name":"pg_visibility_map","args":[{"type":"regclass"}],"returns":"record"}
{"name":"pg_visibility_map","args":[{"type":"regclass"},{"name":"blkno","type":"bigint"}],"returns":"record"}
{"name":"pg_visibility_map_summary","args":[{"type":"regclass"}],"returns":"record"}

View File

@@ -0,0 +1,35 @@
{"name":"armor","args":[{"type":"bytea"}],"returns":"text"}
{"name":"armor","args":[{"type":"bytea"},{"type":"text[]"},{"type":"text[]"}],"returns":"text"}
{"name":"crypt","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"dearmor","args":[{"type":"text"}],"returns":"bytea"}
{"name":"decrypt","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"decrypt_iv","args":[{"type":"bytea"},{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"digest","args":[{"type":"text"},{"type":"text"}],"returns":"bytea"}
{"name":"digest","args":[{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"encrypt","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"encrypt_iv","args":[{"type":"bytea"},{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"gen_random_bytes","args":[{"type":"integer"}],"returns":"bytea"}
{"name":"gen_salt","args":[{"type":"text"}],"returns":"text"}
{"name":"gen_salt","args":[{"type":"text"},{"type":"integer"}],"returns":"text"}
{"name":"hmac","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"hmac","args":[{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_armor_headers","args":[{"type":"text"}],"returns":"record"}
{"name":"pgp_key_id","args":[{"type":"bytea"}],"returns":"text"}
{"name":"pgp_pub_decrypt","args":[{"type":"bytea"},{"type":"bytea"}],"returns":"text"}
{"name":"pgp_pub_decrypt","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"text"}
{"name":"pgp_pub_decrypt","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"pgp_pub_decrypt_bytea","args":[{"type":"bytea"},{"type":"bytea"}],"returns":"bytea"}
{"name":"pgp_pub_decrypt_bytea","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_pub_decrypt_bytea","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_pub_encrypt","args":[{"type":"text"},{"type":"bytea"}],"returns":"bytea"}
{"name":"pgp_pub_encrypt","args":[{"type":"text"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_pub_encrypt_bytea","args":[{"type":"bytea"},{"type":"bytea"}],"returns":"bytea"}
{"name":"pgp_pub_encrypt_bytea","args":[{"type":"bytea"},{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_sym_decrypt","args":[{"type":"bytea"},{"type":"text"}],"returns":"text"}
{"name":"pgp_sym_decrypt","args":[{"type":"bytea"},{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"pgp_sym_decrypt_bytea","args":[{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_sym_decrypt_bytea","args":[{"type":"bytea"},{"type":"text"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_sym_encrypt","args":[{"type":"text"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_sym_encrypt","args":[{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_sym_encrypt_bytea","args":[{"type":"bytea"},{"type":"text"}],"returns":"bytea"}
{"name":"pgp_sym_encrypt_bytea","args":[{"type":"bytea"},{"type":"text"},{"type":"text"}],"returns":"bytea"}

View File

@@ -0,0 +1 @@
{"name":"pgrowlocks","args":[{"name":"relname","type":"text"}],"returns":"record"}

View File

@@ -0,0 +1,9 @@
{"name":"pg_relpages","args":[{"name":"relname","type":"regclass"}],"returns":"bigint"}
{"name":"pg_relpages","args":[{"name":"relname","type":"text"}],"returns":"bigint"}
{"name":"pgstatginindex","args":[{"name":"relname","type":"regclass"}],"returns":"record"}
{"name":"pgstathashindex","args":[{"name":"relname","type":"regclass"}],"returns":"record"}
{"name":"pgstatindex","args":[{"name":"relname","type":"regclass"}],"returns":"record"}
{"name":"pgstatindex","args":[{"name":"relname","type":"text"}],"returns":"record"}
{"name":"pgstattuple","args":[{"name":"reloid","type":"regclass"}],"returns":"record"}
{"name":"pgstattuple","args":[{"name":"relname","type":"text"}],"returns":"record"}
{"name":"pgstattuple_approx","args":[{"name":"reloid","type":"regclass"}],"returns":"record"}

View File

@@ -0,0 +1,5 @@
{"name":"postgres_fdw_disconnect","args":[{"type":"text"}],"returns":"boolean"}
{"name":"postgres_fdw_disconnect_all","returns":"boolean"}
{"name":"postgres_fdw_get_connections","returns":"record"}
{"name":"postgres_fdw_handler","returns":"fdw_handler"}
{"name":"postgres_fdw_validator","args":[{"type":"text[]"},{"type":"oid"}],"returns":"void"}

View File

@@ -0,0 +1,22 @@
{"name":"seg_center","args":[{"type":"seg"}],"returns":"real"}
{"name":"seg_cmp","args":[{"type":"seg"},{"type":"seg"}],"returns":"integer"}
{"name":"seg_contained","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_contains","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_different","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_ge","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_gt","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_in","args":[{"type":"cstring"}],"returns":"seg"}
{"name":"seg_inter","args":[{"type":"seg"},{"type":"seg"}],"returns":"seg"}
{"name":"seg_le","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_left","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_lower","args":[{"type":"seg"}],"returns":"real"}
{"name":"seg_lt","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_out","args":[{"type":"seg"}],"returns":"cstring"}
{"name":"seg_over_left","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_over_right","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_overlap","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_right","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_same","args":[{"type":"seg"},{"type":"seg"}],"returns":"boolean"}
{"name":"seg_size","args":[{"type":"seg"}],"returns":"real"}
{"name":"seg_union","args":[{"type":"seg"},{"type":"seg"}],"returns":"seg"}
{"name":"seg_upper","args":[{"type":"seg"}],"returns":"real"}

View File

@@ -0,0 +1 @@
{"name":"seg","category":"U"}

View File

@@ -0,0 +1,10 @@
{"name":"ssl_cipher","returns":"text"}
{"name":"ssl_client_cert_present","returns":"boolean"}
{"name":"ssl_client_dn","returns":"text"}
{"name":"ssl_client_dn_field","args":[{"type":"text"}],"returns":"text"}
{"name":"ssl_client_serial","returns":"numeric"}
{"name":"ssl_extension_info","returns":"record"}
{"name":"ssl_is_used","returns":"boolean"}
{"name":"ssl_issuer_dn","returns":"text"}
{"name":"ssl_issuer_field","args":[{"type":"text"}],"returns":"text"}
{"name":"ssl_version","returns":"text"}

View File

@@ -0,0 +1,11 @@
{"name":"connectby","args":[{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"},{"type":"integer"}],"returns":"record"}
{"name":"connectby","args":[{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"},{"type":"integer"},{"type":"text"}],"returns":"record"}
{"name":"connectby","args":[{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"},{"type":"integer"}],"returns":"record"}
{"name":"connectby","args":[{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"},{"type":"integer"},{"type":"text"}],"returns":"record"}
{"name":"crosstab","args":[{"type":"text"}],"returns":"record"}
{"name":"crosstab","args":[{"type":"text"},{"type":"integer"}],"returns":"record"}
{"name":"crosstab","args":[{"type":"text"},{"type":"text"}],"returns":"record"}
{"name":"crosstab2","args":[{"type":"text"}],"returns":"tablefunc_crosstab_2"}
{"name":"crosstab3","args":[{"type":"text"}],"returns":"tablefunc_crosstab_3"}
{"name":"crosstab4","args":[{"type":"text"}],"returns":"tablefunc_crosstab_4"}
{"name":"normal_rand","args":[{"type":"integer"},{"type":"double precision"},{"type":"double precision"}],"returns":"double precision"}

View File

@@ -0,0 +1,3 @@
{"name":"tablefunc_crosstab_2","category":"C"}
{"name":"tablefunc_crosstab_3","category":"C"}
{"name":"tablefunc_crosstab_4","category":"C"}

View File

@@ -0,0 +1 @@
{"name":"triggered_change_notification","returns":"trigger"}

View File

@@ -0,0 +1,2 @@
{"name":"unaccent","args":[{"type":"regdictionary"},{"type":"text"}],"returns":"text"}
{"name":"unaccent","args":[{"type":"text"}],"returns":"text"}

View File

@@ -0,0 +1,10 @@
{"name":"uuid_generate_v1","returns":"uuid"}
{"name":"uuid_generate_v1mc","returns":"uuid"}
{"name":"uuid_generate_v3","args":[{"name":"namespace","type":"uuid"},{"name":"name","type":"text"}],"returns":"uuid"}
{"name":"uuid_generate_v4","returns":"uuid"}
{"name":"uuid_generate_v5","args":[{"name":"namespace","type":"uuid"},{"name":"name","type":"text"}],"returns":"uuid"}
{"name":"uuid_nil","returns":"uuid"}
{"name":"uuid_ns_dns","returns":"uuid"}
{"name":"uuid_ns_oid","returns":"uuid"}
{"name":"uuid_ns_url","returns":"uuid"}
{"name":"uuid_ns_x500","returns":"uuid"}

View File

@@ -0,0 +1,13 @@
{"name":"xml_encode_special_chars","args":[{"type":"text"}],"returns":"text"}
{"name":"xml_valid","args":[{"type":"text"}],"returns":"boolean"}
{"name":"xpath_bool","args":[{"type":"text"},{"type":"text"}],"returns":"boolean"}
{"name":"xpath_list","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"xpath_list","args":[{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"xpath_nodeset","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"xpath_nodeset","args":[{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"xpath_nodeset","args":[{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"xpath_number","args":[{"type":"text"},{"type":"text"}],"returns":"real"}
{"name":"xpath_string","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"xpath_table","args":[{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"record"}
{"name":"xslt_process","args":[{"type":"text"},{"type":"text"}],"returns":"text"}
{"name":"xslt_process","args":[{"type":"text"},{"type":"text"},{"type":"text"}],"returns":"text"}

View File

@@ -0,0 +1,21 @@
{"name": "||", "left": "text", "right": "text", "result": "text"}
{"name": "~~", "left": "text", "right": "text", "result": "bool"}
{"name": "!~~", "left": "text", "right": "text", "result": "bool"}
{"name": "~~*", "left": "text", "right": "text", "result": "bool"}
{"name": "!~~*", "left": "text", "right": "text", "result": "bool"}
{"name": "~", "left": "text", "right": "text", "result": "bool"}
{"name": "!~", "left": "text", "right": "text", "result": "bool"}
{"name": "~*", "left": "text", "right": "text", "result": "bool"}
{"name": "!~*", "left": "text", "right": "text", "result": "bool"}
{"name": "@>", "left": "jsonb", "right": "jsonb", "result": "bool"}
{"name": "<@", "left": "jsonb", "right": "jsonb", "result": "bool"}
{"name": "->", "left": "jsonb", "right": "text", "result": "jsonb"}
{"name": "->>", "left": "jsonb", "right": "text", "result": "text"}
{"name": "->", "left": "json", "right": "text", "result": "json"}
{"name": "->>", "left": "json", "right": "text", "result": "text"}
{"name": "+", "left": "date", "right": "int4", "result": "date"}
{"name": "-", "left": "date", "right": "int4", "result": "date"}
{"name": "+", "left": "timestamptz", "right": "interval", "result": "timestamptz"}
{"name": "-", "left": "timestamptz", "right": "interval", "result": "timestamptz"}
{"name": "+", "left": "timestamp", "right": "interval", "result": "timestamp"}
{"name": "-", "left": "timestamp", "right": "interval", "result": "timestamp"}

View File

@@ -0,0 +1,48 @@
{"name": "boolean", "category": "B", "aliases": ["bool"]}
{"name": "smallint", "category": "N", "aliases": ["int2", "smallserial", "serial2"]}
{"name": "integer", "category": "N", "aliases": ["int4", "int", "serial", "serial4"]}
{"name": "bigint", "category": "N", "aliases": ["int8", "bigserial", "serial8"]}
{"name": "real", "category": "N", "aliases": ["float4"]}
{"name": "double precision", "category": "N", "aliases": ["float8"]}
{"name": "numeric", "category": "N", "aliases": ["decimal"]}
{"name": "money", "category": "N"}
{"name": "oid", "category": "N"}
{"name": "text", "category": "S"}
{"name": "character varying", "category": "S", "aliases": ["varchar"]}
{"name": "character", "category": "S", "aliases": ["bpchar", "char"]}
{"name": "name", "category": "S"}
{"name": "citext", "category": "S"}
{"name": "date", "category": "D"}
{"name": "time without time zone", "category": "D", "aliases": ["time"]}
{"name": "time with time zone", "category": "D", "aliases": ["timetz"]}
{"name": "timestamp without time zone", "category": "D", "aliases": ["timestamp"]}
{"name": "timestamp with time zone", "category": "D", "aliases": ["timestamptz"]}
{"name": "interval", "category": "T"}
{"name": "uuid", "category": "U"}
{"name": "bytea", "category": "U"}
{"name": "json", "category": "U"}
{"name": "jsonb", "category": "U"}
{"name": "xml", "category": "U"}
{"name": "inet", "category": "U"}
{"name": "cidr", "category": "U"}
{"name": "macaddr", "category": "U"}
{"name": "macaddr8", "category": "U"}
{"name": "bit", "category": "U"}
{"name": "bit varying", "category": "U", "aliases": ["varbit"]}
{"name": "tsvector", "category": "U"}
{"name": "tsquery", "category": "U"}
{"name": "point", "category": "U"}
{"name": "line", "category": "U"}
{"name": "lseg", "category": "U"}
{"name": "box", "category": "U"}
{"name": "path", "category": "U"}
{"name": "polygon", "category": "U"}
{"name": "circle", "category": "U"}
{"name": "int4range", "category": "U"}
{"name": "int8range", "category": "U"}
{"name": "numrange", "category": "U"}
{"name": "tsrange", "category": "U"}
{"name": "tstzrange", "category": "U"}
{"name": "daterange", "category": "U"}
{"name": "anyarray", "category": "A"}
{"name": "array", "category": "A"}

View File

@@ -0,0 +1,27 @@
package postgresql
import (
"io/fs"
"path"
"github.com/sqlc-dev/sqlc/internal/core/seed"
"github.com/sqlc-dev/sqlc/internal/sql/catalog"
)
// loadExtension reads the named extension's function list from the dialect
// directory, where goldeneye writes one directory per extension. An
// extension sqlc does not know is nil, which CREATE EXTENSION treats as
// nothing to add.
func loadExtension(name string) *catalog.Schema {
dir := path.Join("dialect", "extensions", name)
if _, err := fs.Stat(dialectFS, path.Join(dir, seed.FunctionsFile)); err != nil {
return nil
}
funcs, err := seed.Functions(dialectFS, dir)
if err != nil {
// The list is embedded in the binary: a failure here means sqlc was
// built from a broken tree, which no caller can do anything about.
panic(err)
}
return &catalog.Schema{Name: "pg_catalog", Funcs: funcs}
}

View File

@@ -0,0 +1,798 @@
package postgresql
import (
"errors"
"fmt"
"io"
"strings"
nodes "github.com/sqlc-dev/oliphant"
"github.com/sqlc-dev/oliphant/parser"
"github.com/sqlc-dev/sqlc/internal/source"
"github.com/sqlc-dev/sqlc/internal/sql/ast"
"github.com/sqlc-dev/sqlc/internal/sql/sqlerr"
)
var Parse = nodes.Parse
var Fingerprint = nodes.Fingerprint
func stringSlice(list *nodes.List) []string {
items := []string{}
for _, item := range list.Items {
if n, ok := item.Node.(*nodes.Node_String_); ok {
items = append(items, n.String_.Sval)
}
}
return items
}
func stringSliceFromNodes(s []*nodes.Node) []string {
var items []string
for _, item := range s {
if n, ok := item.Node.(*nodes.Node_String_); ok {
items = append(items, n.String_.Sval)
}
}
return items
}
type relation struct {
Catalog string
Schema string
Name string
}
func (r relation) TableName() *ast.TableName {
return &ast.TableName{
Catalog: r.Catalog,
Schema: r.Schema,
Name: r.Name,
}
}
func (r relation) TypeName() *ast.TypeName {
return &ast.TypeName{
Catalog: r.Catalog,
Schema: r.Schema,
Name: r.Name,
}
}
func (r relation) FuncName() *ast.FuncName {
return &ast.FuncName{
Catalog: r.Catalog,
Schema: r.Schema,
Name: r.Name,
}
}
func parseRelationFromNodes(list []*nodes.Node) (*relation, error) {
parts := stringSliceFromNodes(list)
switch len(parts) {
case 1:
return &relation{
Name: parts[0],
}, nil
case 2:
return &relation{
Schema: parts[0],
Name: parts[1],
}, nil
case 3:
return &relation{
Catalog: parts[0],
Schema: parts[1],
Name: parts[2],
}, nil
default:
return nil, fmt.Errorf("invalid name: %s", joinNodes(list, "."))
}
}
func parseRelationFromRangeVar(rv *nodes.RangeVar) *relation {
return &relation{
Catalog: rv.Catalogname,
Schema: rv.Schemaname,
Name: rv.Relname,
}
}
func parseRelation(in *nodes.Node) (*relation, error) {
switch n := in.Node.(type) {
case *nodes.Node_List:
return parseRelationFromNodes(n.List.Items)
case *nodes.Node_RangeVar:
return parseRelationFromRangeVar(n.RangeVar), nil
case *nodes.Node_TypeName:
return parseRelationFromNodes(n.TypeName.Names)
default:
return nil, fmt.Errorf("unexpected node type: %T", n)
}
}
func parseColName(node *nodes.Node) (*ast.ColumnRef, *ast.TableName, error) {
switch n := node.Node.(type) {
case *nodes.Node_List:
parts := stringSlice(n.List)
var tbl *ast.TableName
var ref *ast.ColumnRef
switch len(parts) {
case 2:
tbl = &ast.TableName{Name: parts[0]}
ref = &ast.ColumnRef{Name: parts[1]}
case 3:
tbl = &ast.TableName{Schema: parts[0], Name: parts[1]}
ref = &ast.ColumnRef{Name: parts[2]}
case 4:
tbl = &ast.TableName{Catalog: parts[0], Schema: parts[1], Name: parts[2]}
ref = &ast.ColumnRef{Name: parts[3]}
default:
return nil, nil, fmt.Errorf("column specifier %q is not the proper format, expected '[catalog.][schema.]colname.tablename'", strings.Join(parts, "."))
}
return ref, tbl, nil
default:
return nil, nil, fmt.Errorf("parseColName: unexpected node type: %T", n)
}
}
func joinNodes(list []*nodes.Node, sep string) string {
return strings.Join(stringSliceFromNodes(list), sep)
}
func NewParser() *Parser {
return &Parser{}
}
type Parser struct {
}
var errSkip = errors.New("skip stmt")
func (p *Parser) Parse(r io.Reader) ([]ast.Statement, error) {
f, err := p.ParseFile(r)
if err != nil {
return nil, err
}
return f.Stmts, nil
}
// ParseFile parses like Parse and also carries the file's comments, which
// oliphant's parser collects from the same pass its scanner already makes
// over the input.
func (p *Parser) ParseFile(r io.Reader) (*ast.File, error) {
blob, err := io.ReadAll(r)
if err != nil {
return nil, err
}
contents := string(blob)
parsed, err := parser.ParseFile(contents)
if err != nil {
pErr := normalizeErr(err)
return nil, pErr
}
tree := parsed.ParseResult
var stmts []ast.Statement
// PostgreSQL 18 changed stmt_location to point at the statement's first
// token. The rest of the compiler expects the earlier convention, where a
// statement begins where the previous one ended and so carries its leading
// comments (that's where `-- name:` lives).
loc := 0
for _, raw := range tree.Stmts {
start := loc
end := int(raw.StmtLocation) + int(raw.StmtLen)
next := end
for next < len(contents) && contents[next] != ';' {
next++
}
terminated := next < len(contents)
if terminated {
next++
}
loc = next
length := end - start
if !terminated {
// A zero length marked an unterminated final statement before
// PostgreSQL 18, and the compiler still reports it that way.
length = 0
}
n, err := translate(raw.Stmt)
if err == errSkip {
continue
}
if err != nil {
return nil, err
}
if n == nil {
return nil, fmt.Errorf("unexpected nil node")
}
stmts = append(stmts, ast.Statement{
Raw: &ast.RawStmt{
Stmt: n,
StmtLocation: start,
StmtLen: length,
},
})
}
var comments []ast.Comment
for _, tok := range parsed.Comments {
comments = append(comments, ast.Comment{
Text: strings.TrimRight(contents[tok.Start:tok.End], " \t\r\n"),
Start: int(tok.Start),
End: int(tok.End),
OwnLine: ownLine(contents, int(tok.Start)),
})
}
return &ast.File{Stmts: stmts, Comments: comments}, nil
}
// ownLine reports that only blank space sits between the preceding line
// break and pos.
func ownLine(src string, pos int) bool {
for j := pos - 1; j >= 0; j-- {
switch src[j] {
case '\n':
return true
case ' ', '\t', '\r':
continue
default:
return false
}
}
return true
}
func normalizeErr(err error) error {
//TODO: errors.As complains that *parser.Error does not implement error
if pErr, ok := err.(*parser.Error); ok {
sErr := &sqlerr.Error{
Message: pErr.Message,
//Err: pErr,
Line: pErr.Lineno,
Location: pErr.Cursorpos,
}
return sErr
}
return err
}
// https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-COMMENTS
func (p *Parser) CommentSyntax() source.CommentSyntax {
return source.CommentSyntax{
Dash: true,
SlashStar: true,
}
}
func translate(node *nodes.Node) (ast.Node, error) {
switch inner := node.Node.(type) {
case *nodes.Node_AlterEnumStmt:
n := inner.AlterEnumStmt
rel, err := parseRelationFromNodes(n.TypeName)
if err != nil {
return nil, err
}
if n.OldVal != "" {
return &ast.AlterTypeRenameValueStmt{
Type: rel.TypeName(),
OldValue: makeString(n.OldVal),
NewValue: makeString(n.NewVal),
}, nil
} else {
return &ast.AlterTypeAddValueStmt{
Type: rel.TypeName(),
NewValue: makeString(n.NewVal),
NewValHasNeighbor: len(n.NewValNeighbor) > 0,
NewValNeighbor: makeString(n.NewValNeighbor),
NewValIsAfter: n.NewValIsAfter,
SkipIfNewValExists: n.SkipIfNewValExists,
}, nil
}
case *nodes.Node_AlterObjectSchemaStmt:
n := inner.AlterObjectSchemaStmt
switch n.ObjectType {
case nodes.ObjectType_OBJECT_TABLE, nodes.ObjectType_OBJECT_VIEW, nodes.ObjectType_OBJECT_MATVIEW:
rel := parseRelationFromRangeVar(n.Relation)
return &ast.AlterTableSetSchemaStmt{
Table: rel.TableName(),
NewSchema: makeString(n.Newschema),
MissingOk: n.MissingOk,
}, nil
case nodes.ObjectType_OBJECT_TYPE:
rel, err := parseRelation(n.Object)
if err != nil {
return nil, err
}
return &ast.AlterTypeSetSchemaStmt{
Type: rel.TypeName(),
NewSchema: makeString(n.Newschema),
}, nil
}
return nil, errSkip
case *nodes.Node_AlterTableStmt:
n := inner.AlterTableStmt
rel := parseRelationFromRangeVar(n.Relation)
at := &ast.AlterTableStmt{
Table: rel.TableName(),
Cmds: &ast.List{},
MissingOk: n.MissingOk,
}
for _, cmd := range n.Cmds {
switch cmdOneOf := cmd.Node.(type) {
case *nodes.Node_AlterTableCmd:
altercmd := cmdOneOf.AlterTableCmd
item := &ast.AlterTableCmd{Name: &altercmd.Name, MissingOk: altercmd.MissingOk}
switch altercmd.Subtype {
case nodes.AlterTableType_AT_AddColumn:
d, ok := altercmd.Def.Node.(*nodes.Node_ColumnDef)
if !ok {
return nil, fmt.Errorf("expected alter table definition to be a ColumnDef")
}
rel, err := parseRelationFromNodes(d.ColumnDef.TypeName.Names)
if err != nil {
return nil, err
}
item.Subtype = ast.AT_AddColumn
item.Def = &ast.ColumnDef{
Colname: d.ColumnDef.Colname,
TypeName: columnTypeName(rel, d.ColumnDef.TypeName),
IsNotNull: isNotNull(d.ColumnDef),
IsArray: isArray(d.ColumnDef.TypeName),
ArrayDims: len(d.ColumnDef.TypeName.ArrayBounds),
}
case nodes.AlterTableType_AT_AlterColumnType:
d, ok := altercmd.Def.Node.(*nodes.Node_ColumnDef)
if !ok {
return nil, fmt.Errorf("expected alter table definition to be a ColumnDef")
}
col := ""
if altercmd.Name != "" {
col = altercmd.Name
} else if d.ColumnDef.Colname != "" {
col = d.ColumnDef.Colname
} else {
return nil, fmt.Errorf("unknown name for alter column type")
}
rel, err := parseRelationFromNodes(d.ColumnDef.TypeName.Names)
if err != nil {
return nil, err
}
item.Subtype = ast.AT_AlterColumnType
item.Def = &ast.ColumnDef{
Colname: col,
TypeName: columnTypeName(rel, d.ColumnDef.TypeName),
IsNotNull: isNotNull(d.ColumnDef),
IsArray: isArray(d.ColumnDef.TypeName),
ArrayDims: len(d.ColumnDef.TypeName.ArrayBounds),
}
case nodes.AlterTableType_AT_DropColumn:
item.Subtype = ast.AT_DropColumn
case nodes.AlterTableType_AT_DropNotNull:
item.Subtype = ast.AT_DropNotNull
case nodes.AlterTableType_AT_SetNotNull:
item.Subtype = ast.AT_SetNotNull
default:
continue
}
at.Cmds.Items = append(at.Cmds.Items, item)
}
}
return at, nil
case *nodes.Node_CommentStmt:
n := inner.CommentStmt
switch n.Objtype {
case nodes.ObjectType_OBJECT_COLUMN:
col, tbl, err := parseColName(n.Object)
if err != nil {
return nil, fmt.Errorf("COMMENT ON COLUMN: %w", err)
}
return &ast.CommentOnColumnStmt{
Col: col,
Table: tbl,
Comment: makeString(n.Comment),
}, nil
case nodes.ObjectType_OBJECT_SCHEMA:
o, ok := n.Object.Node.(*nodes.Node_String_)
if !ok {
return nil, fmt.Errorf("COMMENT ON SCHEMA: unexpected node type: %T", n.Object)
}
return &ast.CommentOnSchemaStmt{
Schema: &ast.String{Str: o.String_.Sval},
Comment: makeString(n.Comment),
}, nil
case nodes.ObjectType_OBJECT_TABLE:
rel, err := parseRelation(n.Object)
if err != nil {
return nil, fmt.Errorf("COMMENT ON TABLE: %w", err)
}
return &ast.CommentOnTableStmt{
Table: rel.TableName(),
Comment: makeString(n.Comment),
}, nil
case nodes.ObjectType_OBJECT_TYPE:
rel, err := parseRelation(n.Object)
if err != nil {
return nil, err
}
return &ast.CommentOnTypeStmt{
Type: rel.TypeName(),
Comment: makeString(n.Comment),
}, nil
case nodes.ObjectType_OBJECT_VIEW:
rel, err := parseRelation(n.Object)
if err != nil {
return nil, fmt.Errorf("COMMENT ON VIEW: %w", err)
}
return &ast.CommentOnViewStmt{
View: rel.TableName(),
Comment: makeString(n.Comment),
}, nil
}
return nil, errSkip
case *nodes.Node_CompositeTypeStmt:
n := inner.CompositeTypeStmt
rel := parseRelationFromRangeVar(n.Typevar)
stmt := &ast.CompositeTypeStmt{
TypeName: rel.TypeName(),
Coldeflist: &ast.List{},
}
for _, node := range n.Coldeflist {
field, ok := node.Node.(*nodes.Node_ColumnDef)
if !ok {
continue
}
rel, err := parseRelationFromNodes(field.ColumnDef.TypeName.Names)
if err != nil {
return nil, err
}
stmt.Coldeflist.Items = append(stmt.Coldeflist.Items, &ast.ColumnDef{
Colname: field.ColumnDef.Colname,
TypeName: columnTypeName(rel, field.ColumnDef.TypeName),
IsArray: isArray(field.ColumnDef.TypeName),
ArrayDims: len(field.ColumnDef.TypeName.ArrayBounds),
})
}
return stmt, nil
case *nodes.Node_CreateStmt:
n := inner.CreateStmt
rel := parseRelationFromRangeVar(n.Relation)
create := &ast.CreateTableStmt{
Name: rel.TableName(),
IfNotExists: n.IfNotExists,
}
for _, node := range n.InhRelations {
switch item := node.Node.(type) {
case *nodes.Node_RangeVar:
if item.RangeVar.Inh {
rel := parseRelationFromRangeVar(item.RangeVar)
create.Inherits = append(create.Inherits, rel.TableName())
}
}
}
primaryKey := make(map[string]bool)
for _, elt := range n.TableElts {
switch item := elt.Node.(type) {
case *nodes.Node_Constraint:
if item.Constraint.Contype == nodes.ConstrType_CONSTR_PRIMARY {
for _, key := range item.Constraint.Keys {
// FIXME: Possible nil pointer dereference
primaryKey[key.Node.(*nodes.Node_String_).String_.Sval] = true
}
}
case *nodes.Node_TableLikeClause:
rel := parseRelationFromRangeVar(item.TableLikeClause.Relation)
create.ReferTable = rel.TableName()
}
}
for _, elt := range n.TableElts {
switch item := elt.Node.(type) {
case *nodes.Node_ColumnDef:
rel, err := parseRelationFromNodes(item.ColumnDef.TypeName.Names)
if err != nil {
return nil, err
}
primary := false
for _, con := range item.ColumnDef.Constraints {
if constraint, ok := con.Node.(*nodes.Node_Constraint); ok {
primary = constraint.Constraint.Contype == nodes.ConstrType_CONSTR_PRIMARY
}
}
create.Cols = append(create.Cols, &ast.ColumnDef{
Colname: item.ColumnDef.Colname,
TypeName: columnTypeName(rel, item.ColumnDef.TypeName),
IsNotNull: isNotNull(item.ColumnDef) || primaryKey[item.ColumnDef.Colname],
IsArray: isArray(item.ColumnDef.TypeName),
ArrayDims: len(item.ColumnDef.TypeName.ArrayBounds),
PrimaryKey: primary,
})
}
}
return create, nil
case *nodes.Node_CreateEnumStmt:
n := inner.CreateEnumStmt
rel, err := parseRelationFromNodes(n.TypeName)
if err != nil {
return nil, err
}
stmt := &ast.CreateEnumStmt{
TypeName: rel.TypeName(),
Vals: &ast.List{},
}
for _, val := range n.Vals {
switch v := val.Node.(type) {
case *nodes.Node_String_:
stmt.Vals.Items = append(stmt.Vals.Items, &ast.String{
Str: v.String_.Sval,
})
}
}
return stmt, nil
case *nodes.Node_CreateFunctionStmt:
n := inner.CreateFunctionStmt
fn, err := parseRelationFromNodes(n.Funcname)
if err != nil {
return nil, err
}
var rt *ast.TypeName
if n.ReturnType != nil {
rel, err := parseRelationFromNodes(n.ReturnType.Names)
if err != nil {
return nil, err
}
rt = rel.TypeName()
}
stmt := &ast.CreateFunctionStmt{
Func: fn.FuncName(),
ReturnType: rt,
Replace: n.Replace,
Params: &ast.List{},
Options: convertSlice(n.Options),
}
for _, item := range n.Parameters {
arg := item.Node.(*nodes.Node_FunctionParameter).FunctionParameter
rel, err := parseRelationFromNodes(arg.ArgType.Names)
if err != nil {
return nil, err
}
mode, err := convertFuncParamMode(arg.Mode)
if err != nil {
return nil, err
}
fp := &ast.FuncParam{
Name: &arg.Name,
Type: rel.TypeName(),
Mode: mode,
}
if arg.Defexpr != nil {
fp.DefExpr = &ast.TODO{}
}
stmt.Params.Items = append(stmt.Params.Items, fp)
}
return stmt, nil
case *nodes.Node_CreateSchemaStmt:
n := inner.CreateSchemaStmt
return &ast.CreateSchemaStmt{
Name: makeString(n.Schemaname),
IfNotExists: n.IfNotExists,
}, nil
case *nodes.Node_DropStmt:
n := inner.DropStmt
switch n.RemoveType {
case nodes.ObjectType_OBJECT_FUNCTION:
drop := &ast.DropFunctionStmt{
MissingOk: n.MissingOk,
}
for _, obj := range n.Objects {
nowa, ok := obj.Node.(*nodes.Node_ObjectWithArgs)
if !ok {
return nil, fmt.Errorf("nodes.DropStmt: FUNCTION: unknown type in objects list: %T", obj)
}
owa := nowa.ObjectWithArgs
fn, err := parseRelationFromNodes(owa.Objname)
if err != nil {
return nil, fmt.Errorf("nodes.DropStmt: FUNCTION: %w", err)
}
args := make([]*ast.TypeName, len(owa.Objargs))
for i, objarg := range owa.Objargs {
tn, ok := objarg.Node.(*nodes.Node_TypeName)
if !ok {
return nil, fmt.Errorf("nodes.DropStmt: FUNCTION: unknown type in objargs list: %T", objarg)
}
at, err := parseRelationFromNodes(tn.TypeName.Names)
if err != nil {
return nil, fmt.Errorf("nodes.DropStmt: FUNCTION: %w", err)
}
args[i] = at.TypeName()
}
drop.Funcs = append(drop.Funcs, &ast.FuncSpec{
Name: fn.FuncName(),
Args: args,
HasArgs: !owa.ArgsUnspecified,
})
}
return drop, nil
case nodes.ObjectType_OBJECT_SCHEMA:
drop := &ast.DropSchemaStmt{
MissingOk: n.MissingOk,
}
for _, obj := range n.Objects {
val, ok := obj.Node.(*nodes.Node_String_)
if !ok {
return nil, fmt.Errorf("nodes.DropStmt: SCHEMA: unknown type in objects list: %T", obj)
}
drop.Schemas = append(drop.Schemas, &ast.String{Str: val.String_.Sval})
}
return drop, nil
case nodes.ObjectType_OBJECT_TABLE, nodes.ObjectType_OBJECT_VIEW, nodes.ObjectType_OBJECT_MATVIEW:
drop := &ast.DropTableStmt{
IfExists: n.MissingOk,
}
for _, obj := range n.Objects {
name, err := parseRelation(obj)
if err != nil {
return nil, fmt.Errorf("nodes.DropStmt: TABLE: %w", err)
}
drop.Tables = append(drop.Tables, name.TableName())
}
return drop, nil
case nodes.ObjectType_OBJECT_TYPE:
drop := &ast.DropTypeStmt{
IfExists: n.MissingOk,
}
for _, obj := range n.Objects {
name, err := parseRelation(obj)
if err != nil {
return nil, fmt.Errorf("nodes.DropStmt: TYPE: %w", err)
}
drop.Types = append(drop.Types, name.TypeName())
}
return drop, nil
}
return nil, errSkip
case *nodes.Node_RenameStmt:
n := inner.RenameStmt
switch n.RenameType {
case nodes.ObjectType_OBJECT_COLUMN:
rel := parseRelationFromRangeVar(n.Relation)
return &ast.RenameColumnStmt{
Table: rel.TableName(),
Col: &ast.ColumnRef{Name: n.Subname},
NewName: makeString(n.Newname),
MissingOk: n.MissingOk,
}, nil
case nodes.ObjectType_OBJECT_TABLE, nodes.ObjectType_OBJECT_MATVIEW, nodes.ObjectType_OBJECT_VIEW:
rel := parseRelationFromRangeVar(n.Relation)
return &ast.RenameTableStmt{
Table: rel.TableName(),
NewName: makeString(n.Newname),
MissingOk: n.MissingOk,
}, nil
case nodes.ObjectType_OBJECT_TYPE:
rel, err := parseRelation(n.Object)
if err != nil {
return nil, fmt.Errorf("nodes.RenameStmt: TYPE: %w", err)
}
return &ast.RenameTypeStmt{
Type: rel.TypeName(),
NewName: makeString(n.Newname),
}, nil
}
return nil, errSkip
default:
return convert(node)
}
}
// columnTypeName is a column's type as the catalog needs it: the name the
// relation resolves, with the type modifiers the parser reported. Every
// modifier is an integer constant, except that an interval's first one is a
// bit mask of the fields it keeps, which is decoded into the words
// format_type prints, so that "interval day to second" carries "day to
// second" as its first argument.
func columnTypeName(rel *relation, tn *nodes.TypeName) *ast.TypeName {
out := rel.TypeName()
if tn == nil || len(tn.Typmods) == 0 {
return out
}
out.Typmods = &ast.List{}
for i, mod := range tn.Typmods {
c, ok := mod.Node.(*nodes.Node_AConst)
if !ok {
continue
}
ival, ok := c.AConst.Val.(*nodes.A_Const_Ival)
if !ok {
continue
}
if i == 0 && rel.Name == "interval" {
fields, ok := intervalFields[ival.Ival.Ival]
if !ok {
continue
}
if fields != "" {
out.Typmods.Items = append(out.Typmods.Items, &ast.String{Str: fields})
}
continue
}
out.Typmods.Items = append(out.Typmods.Items, &ast.A_Const{Val: &ast.Integer{Ival: int64(ival.Ival.Ival)}})
}
if len(out.Typmods.Items) == 0 {
out.Typmods = nil
}
return out
}
// intervalFields decodes the field mask an interval typmod starts with —
// INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH) and so on, with the field
// numbers PostgreSQL's datetime.h assigns — into the words a declaration
// spells. The full range is written as nothing.
var intervalFields = func() map[int32]string {
const (
month = 1 << 1
year = 1 << 2
day = 1 << 3
hour = 1 << 10
minute = 1 << 11
second = 1 << 12
)
return map[int32]string{
0x7FFF: "",
year: "year",
month: "month",
day: "day",
hour: "hour",
minute: "minute",
second: "second",
year | month: "year to month",
day | hour: "day to hour",
day | hour | minute: "day to minute",
day | hour | minute | second: "day to second",
hour | minute: "hour to minute",
hour | minute | second: "hour to second",
minute | second: "minute to second",
}
}()

View File

@@ -0,0 +1,9 @@
package postgresql
import (
"github.com/sqlc-dev/sqlc/internal/sql/catalog"
)
func pgTemp() *catalog.Schema {
return &catalog.Schema{Name: "pg_temp"}
}

View File

@@ -0,0 +1,187 @@
package postgresql
import (
"fmt"
"strings"
)
// hasMixedCase returns true if the string has any uppercase letters
// (identifiers with mixed case need quoting in PostgreSQL)
func hasMixedCase(s string) bool {
for _, r := range s {
if r >= 'A' && r <= 'Z' {
return true
}
}
return false
}
// QuoteIdent returns a quoted identifier if it needs quoting.
// This implements the format.Dialect interface.
func (p *Parser) QuoteIdent(s string) string {
if p.IsReservedKeyword(s) || hasMixedCase(s) {
return `"` + s + `"`
}
return s
}
// TypeName returns the SQL type name for the given namespace and name.
// This implements the format.Dialect interface.
func (p *Parser) TypeName(ns, name string) string {
if ns == "pg_catalog" {
switch name {
case "int4":
return "integer"
case "int8":
return "bigint"
case "int2":
return "smallint"
case "float4":
return "real"
case "float8":
return "double precision"
case "bool":
return "boolean"
case "bpchar":
return "character"
case "timestamptz":
return "timestamp with time zone"
case "timetz":
return "time with time zone"
default:
return name
}
}
if ns != "" {
return ns + "." + name
}
return name
}
// Param returns the parameter placeholder for the given number.
// PostgreSQL numbers every parameter: $1, $2, etc.
func (p *Parser) Param(n int, numbered bool) string {
return fmt.Sprintf("$%d", n)
}
// Cast returns a type cast expression.
// PostgreSQL uses expr::type syntax.
func (p *Parser) Cast(arg, typeName string) string {
return arg + "::" + typeName
}
// Fingerprint reduces a query to pg_query's fingerprint, which survives
// changes in whitespace, case and layout. sqlc fmt uses it to prove a
// formatted statement still parses to the same query.
func (p *Parser) Fingerprint(sql string) (string, error) {
return Fingerprint(sql)
}
// https://www.postgresql.org/docs/current/sql-keywords-appendix.html
func (p *Parser) IsReservedKeyword(s string) bool {
switch strings.ToLower(s) {
case "all":
case "analyse":
case "analyze":
case "and":
case "any":
case "array":
case "as":
case "asc":
case "asymmetric":
case "authorization":
case "binary":
case "both":
case "case":
case "cast":
case "check":
case "collate":
case "collation":
case "column":
case "concurrently":
case "constraint":
case "create":
case "cross":
case "current_catalog":
case "current_date":
case "current_role":
case "current_schema":
case "current_time":
case "current_timestamp":
case "current_user":
case "default":
case "deferrable":
case "desc":
case "distinct":
case "do":
case "else":
case "end":
case "except":
case "false":
case "fetch":
case "for":
case "foreign":
case "freeze":
case "from":
case "full":
case "grant":
case "group":
case "having":
case "ilike":
case "in":
case "initially":
case "inner":
case "intersect":
case "into":
case "is":
case "isnull":
case "join":
case "lateral":
case "leading":
case "left":
case "like":
case "limit":
case "localtime":
case "localtimestamp":
case "natural":
case "not":
case "notnull":
case "null":
case "offset":
case "on":
case "only":
case "or":
case "order":
case "outer":
case "overlaps":
case "placing":
case "primary":
case "references":
case "returning":
case "right":
case "select":
case "session_user":
case "similar":
case "some":
case "symmetric":
case "table":
case "tablesample":
case "then":
case "to":
case "trailing":
case "true":
case "union":
case "unique":
case "user":
case "using":
case "variadic":
case "verbose":
case "when":
case "where":
case "window":
case "with":
default:
return false
}
return true
}

View File

@@ -0,0 +1,45 @@
package postgresql
import (
"strings"
"testing"
"github.com/sqlc-dev/sqlc/internal/sql/ast"
"github.com/sqlc-dev/sqlc/internal/sql/astutils"
"github.com/google/go-cmp/cmp"
)
func TestApply(t *testing.T) {
p := NewParser()
input, err := p.Parse(strings.NewReader("SELECT sqlc.arg(name)"))
if err != nil {
t.Fatal(err)
}
output, err := p.Parse(strings.NewReader("SELECT $1"))
if err != nil {
t.Fatal(err)
}
expect := &output[0]
actual := astutils.Apply(&input[0], func(cr *astutils.Cursor) bool {
fun, ok := cr.Node().(*ast.FuncCall)
if !ok {
return true
}
if astutils.Join(fun.Funcname, ".") == "sqlc.arg" {
cr.Replace(&ast.ParamRef{
Dollar: true,
Number: 1,
Location: fun.Location,
})
return false
}
return true
}, nil)
if diff := cmp.Diff(expect, actual); diff != "" {
t.Errorf("rewrite mismatch:\n%s", diff)
}
}

View File

@@ -0,0 +1,45 @@
package postgresql
import (
"embed"
"sync"
"github.com/sqlc-dev/sqlc/internal/core"
"github.com/sqlc-dev/sqlc/internal/core/seed"
"github.com/sqlc-dev/sqlc/internal/sql/catalog"
)
// The dialect directory describes PostgreSQL's type system. Two things in it
// are worth knowing about: the serial types are column definition sugar for an
// integer plus a sequence, but they are what a schema declares, so the catalog
// carries them as types of their own; and the numeric, string and datetime
// categories are listed as mutually castable, which is what an unadorned
// "WHERE bigint_col = 1" depends on.
//
// functions.jsonl and relations.jsonl are pg_catalog's functions and the
// tables and views of pg_catalog and information_schema, all generated from
// a live PostgreSQL 16 server by goldeneye (internal/goldeneye), which also
// checks them against one. Both the analysis core and the catalog the legacy
// compiler builds read them. Each contrib extension sqlc knows is a directory
// under extensions/ holding the types and functions CREATE EXTENSION adds.
//
//go:embed dialect
var dialectFS embed.FS
// Dialect returns the catalog option that seeds PostgreSQL's type system.
func Dialect() core.Option {
return seed.Dialect(dialectFS, "dialect")
}
// pgCatalogFuncs is pg_catalog's functions in the form the catalog uses. The
// list runs to thousands of entries and never changes within a run, so it is
// read once.
var pgCatalogFuncs = sync.OnceValue(func() []*catalog.Function {
funcs, err := seed.Functions(dialectFS, "dialect")
if err != nil {
// The list is embedded in the binary: a failure here means sqlc was
// built from a broken tree, which no caller can do anything about.
panic(err)
}
return funcs
})

View File

@@ -0,0 +1,53 @@
package postgresql
import (
nodes "github.com/sqlc-dev/oliphant"
)
func isArray(n *nodes.TypeName) bool {
if n == nil {
return false
}
return len(n.ArrayBounds) > 0
}
func isNotNull(n *nodes.ColumnDef) bool {
if n.IsNotNull {
return true
}
for _, c := range n.Constraints {
switch inner := c.Node.(type) {
case *nodes.Node_Constraint:
if inner.Constraint.Contype == nodes.ConstrType_CONSTR_NOTNULL {
return true
}
if inner.Constraint.Contype == nodes.ConstrType_CONSTR_PRIMARY {
return true
}
}
}
return false
}
func makeByte(s string) byte {
var b byte
if s == "" {
return b
}
return []byte(s)[0]
}
func makeUint32Slice(in []uint64) []uint32 {
out := make([]uint32, len(in))
for i, v := range in {
out[i] = uint32(v)
}
return out
}
func makeString(s string) *string {
if s == "" {
return nil
}
return &s
}