Giter VIP home page Giter VIP logo

Comments (3)

DrewKimball avatar DrewKimball commented on September 27, 2024 1

I think this might be an oversight from when I added nested blocks support. Whenever we initialize a new recordTypeVisitor, we initialize its candidate type to types.Unknown:

func newRecordTypeVisitor(
ctx context.Context, semaCtx *tree.SemaContext, s *scope, block *ast.Block,
) *recordTypeVisitor {
return &recordTypeVisitor{ctx: ctx, semaCtx: semaCtx, s: s, typ: types.Unknown, block: block}
}

In the case of a nested block, we may have already determined the return type, and should be using that instead.

from cockroach.

mgartner avatar mgartner commented on September 27, 2024

Reduced repro:

CREATE FUNCTION f() RETURNS RECORD LANGUAGE plpgsql AS $$
BEGIN
  IF true THEN
    RETURN (1:::INT8, NULL, -1.0:::DECIMAL);
  ELSIF false THEN
    BEGIN
      RETURN (1:::INT8, 1.0:::DECIMAL, NULL);
    END;
  END IF;
END;
$$;

If the nested block in the ELSIF branch is omitted, then we get a nice error message:

CREATE FUNCTION f() RETURNS RECORD LANGUAGE plpgsql AS $$
BEGIN
  IF true THEN
    RETURN (1:::INT8, NULL, -1.0:::DECIMAL);
  ELSIF false THEN
    -- BEGIN
      RETURN (1:::INT8, 1.0:::DECIMAL, NULL);
    -- END;
  END IF;
END;
$$;
-- ERROR: unimplemented: returning different types from a RECORD-returning function is not yet supported
-- SQLSTATE: 0A000
-- HINT: You have attempted to use a feature that is not yet implemented.
-- See: https://go.crdb.dev/issue-v/115384/v24.1
-- --
-- try casting all RETURN statements to the same type

from cockroach.

mgartner avatar mgartner commented on September 27, 2024

I think the fix might be here:

func InferWhensType(whens ScalarListExpr, orElse opt.ScalarExpr) *types.T {
result := orElse.DataType()
// Sanity check.
for _, when := range whens {
if !result.Equivalent(when.DataType()) {

Should this use EquivalentOrNull instead of Equivalent?

One question to ask, is why does a similar non-PL/pgSQL expression not also result in an internal error?

defaultdb> SELECT CASE WHEN i > 0 THEN (1, NULL) ELSE (2, 20) END FROM (VALUES (1), (0)) v(i);
   case
----------
  (1,)
  (2,20)
(2 rows)

from cockroach.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.