1
0

func.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package catalog
  2. import (
  3. "errors"
  4. "github.com/kyleconroy/sqlc/internal/sql/ast"
  5. "github.com/kyleconroy/sqlc/internal/sql/sqlerr"
  6. )
  7. func (c *Catalog) createFunction(stmt *ast.CreateFunctionStmt) error {
  8. ns := stmt.Func.Schema
  9. if ns == "" {
  10. ns = c.DefaultSchema
  11. }
  12. s, err := c.getSchema(ns)
  13. if err != nil {
  14. return err
  15. }
  16. fn := &Function{
  17. Name: stmt.Func.Name,
  18. Args: make([]*Argument, len(stmt.Params)),
  19. ReturnType: stmt.ReturnType,
  20. }
  21. types := make([]*ast.TypeName, len(stmt.Params))
  22. for i, arg := range stmt.Params {
  23. var name string
  24. if arg.Name != nil {
  25. name = *arg.Name
  26. }
  27. fn.Args[i] = &Argument{
  28. Name: name,
  29. Type: arg.Type,
  30. Mode: arg.Mode,
  31. HasDefault: arg.DefExpr != nil,
  32. }
  33. types[i] = arg.Type
  34. }
  35. _, idx, err := s.getFunc(stmt.Func, types)
  36. if err == nil && !stmt.Replace {
  37. return sqlerr.RelationExists(stmt.Func.Name)
  38. }
  39. if idx >= 0 {
  40. s.Funcs[idx] = fn
  41. } else {
  42. s.Funcs = append(s.Funcs, fn)
  43. }
  44. return nil
  45. }
  46. func (c *Catalog) dropFunction(stmt *ast.DropFunctionStmt) error {
  47. for _, spec := range stmt.Funcs {
  48. ns := spec.Name.Schema
  49. if ns == "" {
  50. ns = c.DefaultSchema
  51. }
  52. s, err := c.getSchema(ns)
  53. if errors.Is(err, sqlerr.NotFound) && stmt.MissingOk {
  54. continue
  55. } else if err != nil {
  56. return err
  57. }
  58. var idx int
  59. if spec.HasArgs {
  60. _, idx, err = s.getFunc(spec.Name, spec.Args)
  61. } else {
  62. _, idx, err = s.getFuncByName(spec.Name)
  63. }
  64. if errors.Is(err, sqlerr.NotFound) && stmt.MissingOk {
  65. continue
  66. } else if err != nil {
  67. return err
  68. }
  69. s.Funcs = append(s.Funcs[:idx], s.Funcs[idx+1:]...)
  70. }
  71. return nil
  72. }