postgres-meta icon indicating copy to clipboard operation
postgres-meta copied to clipboard

v0.61.1 introduces bug in typescript generation for computed column

Open ecchochan opened this issue 2 years ago • 3 comments

Bug report

  • [x] I confirm this is a bug with Supabase, not with my own application.
  • [x] I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

The below line introduced the bug in v0.61.1 https://github.com/supabase/postgres-meta/blob/e4dc2177cded3e06d07301570b2395099d860d24/src/lib/sql/functions.sql#L44

- rt.typname as return_type,
+ pg_get_function_result(f.oid) as return_type,

The above results in computed column typehint always equal to unknown

To Reproduce

Setup Supabase with the following schema:

CREATE TABLE people (
  fname text,
  lname text
);

CREATE FUNCTION full_name(people) RETURNS text AS $$
  SELECT $1.fname || ' ' || $1.lname;
$$ LANGUAGE SQL;

Run

node \
  --no-warnings \
  dist/server/server.js \   
  gen types typescript \
  --include-schemas public

Or the following if docker-compose is setup with meta using v0.61.1:

docker-compose exec -T meta node \
  --no-warnings \
  dist/server/server.js \   
  gen types typescript \
  --include-schemas public

Expected behavior

The typescript generated should be

export interface Database {
  public: {
    Tables: {
      account: {
        Row: {
          fname: string | null;
          lname: string | null;
          full_name: string | null;
        };
      }
    }
...

Screenshots

The typescript generated is however

export interface Database {
  public: {
    Tables: {
      account: {
        Row: {
          fname: string | null;
          lname: string | null;
          full_name: unknown | null;
        };
      }
    }
...

System information

  • OS: macOS
  • Browser (if applies): N/A
  • Version of supabase-js: N/A
  • Version of Node.js: N/A

Additional context

Reverting the changes of the below resolve the issue https://github.com/supabase/postgres-meta/blob/e4dc2177cded3e06d07301570b2395099d860d24/src/lib/sql/functions.sql#L44

- rt.typname as return_type,
+ pg_get_function_result(f.oid) as return_type,

ecchochan avatar Apr 11 '23 07:04 ecchochan

In the actual version is even worse const temp: PostgrestSingleResponse<SelectQueryError<"Referencing missing column 'full_name '">[]>

The full_name property don't appear inside the table type, just on the generated types as funcion

leomeneguzzi avatar Oct 13 '23 19:10 leomeneguzzi

Actually, I found the problem in my case... still a bug, I'm trying to do some workaround on my project.

The problem is here: https://github.com/supabase/postgres-meta/blob/HEAD/src/server/templates/typescript.ts#L101 .filter((fn) => fn.argument_types === table.name)

The parameter of my function is from another schema. Then the fn.argument_types property has the value like customschema.people, while the table.name is just people

leomeneguzzi avatar Oct 13 '23 20:10 leomeneguzzi

In case someone also faces this problem, the way that I solve it was:

import { Database, Json } from "./supabase.ts";

export interface CustomDatabase extends Database {
  gestaolocador: {
    Tables: {
      rentals: {
        Row: {
          last_due_date: string | null;
          next_due_date: string | null;
        } & Database["gestaolocador"]["Tables"]["rentals"]["Row"];
      } & Database["gestaolocador"]["Tables"]["rentals"];
    };
    Functions: {
        get_rental_by_user: {
          Args: {
            _user_id: string
          }
          Returns: {
              last_due_date: string | null;
              next_due_date: string | null;
          }[]
        }
    }
  } & Database["gestaolocador"];
}

export type { CustomDatabase as Database, Json };

I created a custom Database interface that complements the missing fields. This way I can still regenerate the types without redoing my manual changes every time

leomeneguzzi avatar Oct 13 '23 23:10 leomeneguzzi