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
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:
322
internal/engine/postgresql/analyzer/analyze.go
Normal file
322
internal/engine/postgresql/analyzer/analyze.go
Normal 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
|
||||
}
|
||||
40
internal/engine/postgresql/catalog.go
Normal file
40
internal/engine/postgresql/catalog.go
Normal 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}
|
||||
}
|
||||
170
internal/engine/postgresql/catalog_test.go
Normal file
170
internal/engine/postgresql/catalog_test.go
Normal 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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
3728
internal/engine/postgresql/convert.go
Normal file
3728
internal/engine/postgresql/convert.go
Normal file
File diff suppressed because it is too large
Load Diff
15
internal/engine/postgresql/dialect/dialect.json
Normal file
15
internal/engine/postgresql/dialect/dialect.json
Normal 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"
|
||||
}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"citext","category":"S"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"cube","category":"U"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"dblink_pkey_results","category":"C"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"earth","category":"U"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"name":"file_fdw_handler","returns":"fdw_handler"}
|
||||
{"name":"file_fdw_validator","args":[{"type":"text[]"},{"type":"oid"}],"returns":"void"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"name":"hstore","category":"U"}
|
||||
{"name":"ghstore","category":"U"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"name":"int_array_aggregate","args":[{"type":"integer"}],"returns":"integer[]"}
|
||||
{"name":"int_array_enum","args":[{"type":"integer[]"}],"returns":"integer"}
|
||||
@@ -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[]"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"name":"query_int","category":"U"}
|
||||
{"name":"intbig_gkey","category":"U"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"name":"lo_manage","returns":"trigger"}
|
||||
{"name":"lo_oid","args":[{"type":"lo"}],"returns":"oid"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"lo","category":"N"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1,4 @@
|
||||
{"name":"ltree","category":"U"}
|
||||
{"name":"lquery","category":"U"}
|
||||
{"name":"ltxtquery","category":"U"}
|
||||
{"name":"ltree_gist","category":"U"}
|
||||
@@ -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[]"}
|
||||
@@ -0,0 +1,3 @@
|
||||
{"name":"pg_buffercache_pages","returns":"record"}
|
||||
{"name":"pg_buffercache_summary","returns":"record"}
|
||||
{"name":"pg_buffercache_usage_counts","returns":"record"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"name":"pg_freespace","args":[{"name":"rel","type":"regclass"}],"returns":"record"}
|
||||
{"name":"pg_freespace","args":[{"type":"regclass"},{"type":"bigint"}],"returns":"smallint"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"gtrgm","category":"U"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"pgrowlocks","args":[{"name":"relname","type":"text"}],"returns":"record"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"seg","category":"U"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
@@ -0,0 +1,3 @@
|
||||
{"name":"tablefunc_crosstab_2","category":"C"}
|
||||
{"name":"tablefunc_crosstab_3","category":"C"}
|
||||
{"name":"tablefunc_crosstab_4","category":"C"}
|
||||
@@ -0,0 +1 @@
|
||||
{"name":"triggered_change_notification","returns":"trigger"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"name":"unaccent","args":[{"type":"regdictionary"},{"type":"text"}],"returns":"text"}
|
||||
{"name":"unaccent","args":[{"type":"text"}],"returns":"text"}
|
||||
@@ -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"}
|
||||
@@ -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"}
|
||||
21
internal/engine/postgresql/dialect/operators.jsonl
Normal file
21
internal/engine/postgresql/dialect/operators.jsonl
Normal 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"}
|
||||
48
internal/engine/postgresql/dialect/types.jsonl
Normal file
48
internal/engine/postgresql/dialect/types.jsonl
Normal 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"}
|
||||
27
internal/engine/postgresql/extension.go
Normal file
27
internal/engine/postgresql/extension.go
Normal 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}
|
||||
}
|
||||
798
internal/engine/postgresql/parse.go
Normal file
798
internal/engine/postgresql/parse.go
Normal 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",
|
||||
}
|
||||
}()
|
||||
9
internal/engine/postgresql/pg_temp.go
Normal file
9
internal/engine/postgresql/pg_temp.go
Normal 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"}
|
||||
}
|
||||
187
internal/engine/postgresql/reserved.go
Normal file
187
internal/engine/postgresql/reserved.go
Normal 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
|
||||
}
|
||||
45
internal/engine/postgresql/rewrite_test.go
Normal file
45
internal/engine/postgresql/rewrite_test.go
Normal 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)
|
||||
}
|
||||
}
|
||||
45
internal/engine/postgresql/seed.go
Normal file
45
internal/engine/postgresql/seed.go
Normal 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
|
||||
})
|
||||
53
internal/engine/postgresql/utils.go
Normal file
53
internal/engine/postgresql/utils.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user