Jim Starkey wrote:
Jay Pipes wrote:
Diego Medina wrote:
Hi,

After converting the unix_timestamp built-in function into a plugin, I
started to get a parser test failure. I looked into it and I found
that:

(looking at  drizzled/error.cc )
1) When a built-in function gets the wrong number of parameters, you
get this error
    "Incorrect parameter count in the call to native function ..."
2) When the same error occurs on a plugin (at least a udf plugin), you get
    "Incorrect parameters in the call to native function"

My question:
A) Do I just change the test, to expect the new error message?
B) Do I make both, the built-in functions and the udf's, use the same error?

I would vote to make only a single error message for right now.


Would it make sense to rethink error messages, codes, and all that? It would be really nice if:

  1. Error codes were stable across releases (and forks!)

Perhaps, though I don't view this as much of a priority...there could always be a translation piece if needed...

  2. Error codes from the server, engines, and plugins were mutually
     exclusive

+10

The current design is pretty bad in this regard. There should be some range of valid values for plugin-specific errors.

  3. A client program could decompose an error code to determine its
     source (server, engine, or plugin)

See above, agreed. Though, in Drizzle-land, an engine is always a plugin; so I would just say "kernel error" and "plugin error".

  4. Locale specific error text could be computed from error code (even
     on the client)

Our error messages are already translated/localized via gettext. We do not use the errmsg file info system from MySQL.

  5. A client program could decompose an error code to determine, where
     possible, a generic type (i.e. file open failed, memory was
     exhausted, etc.)

Sure.

On a related note, the specific error message that Diego originally wrote about could be even more descriptive. I think this would be better for the user, no?

_("Incorrect number of arguments supplied to function \"%s\". Expected between %" PRIu32 " and %" PRIu32 " arguments but received %" PRIu32 ".")

However, to pull the above off properly, we need to rework the current wobbly-looking code that validates function arguments. The check_argument_count() method of Item_func in drizzled/function/func.h is a virtual method that is currently only overridden in functions defined in the plugin directory. This method is automatically called for all created UDF objects (classes which inherit from Item_func...) during the fix_fields_and_dec() process for the Item objects.

I think with a fairly simple change, we can clean this interface up a bit. I propose adding two protected member variables to Item_func:

protected:
  uint32_t min_num_args;
  uint32_t max_num_args;

And have a new protected method hasCorrectArguments():

Item_func::hasCorrectArguments() const
{
  return (arg_count >= min_num_args && arg_count <= max_num_args);
}

And change the existing check_argument_count() method to the following:

Item_func::checkArguments()
{
  if (! hasCorrectArguments())
  {
    my_error(ER_WRONG_PARAMCOUNT_TO_FUNCTION,
             _("Incorrect number of arguments supplied to function "
               "\"%s\".  Expected between %" PRIu32 " and %" PRIu32 "
               " arguments but received %" PRIu32 "."),
             func_name(),
             min_num_args,
             max_num_args,
             arg_count);
  }
}

Thoughts?

-jay

_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help   : https://help.launchpad.net/ListHelp

Reply via email to