[freetds] "Data conversion resulted in overflow" with float constants

James K. Lowden jklowden at freetds.org
Wed Jun 26 20:17:45 EDT 2013


On Fri, 21 Jun 2013 18:14:10 -0430
arielCo <arielco at gmail.com> wrote:

> James, I substituted dbwillconvert() successfully in the 0.91 tarball,
> but in Git it now boolean-izes the result of tds_willconvert:
> 	return tds_willconvert(srctype, desttype) ? TRUE : FALSE;
> Which makes more sense given the function name, but dbwillconvert
> remains a scalar.
> 
> Since there are three mostly-redundant switch statements, and the one
> in tds_willconvert is almost complete, maybe:
> * have a single switch statement in, say, get_printable_size
> (type,size)
> * _get_printable_size(colinfo) would be a wrapper
> * tds_willconvert(srctype, desttype) calls get_printable_size(),
> perhaps mapping SYBINTN to SYBINT8 since the size doesn't matter
> * dbwillconvert stays a wrapper
> * both *willconvert() functions return a boolean

Hi Ariel, 

Thanks for working on this, first of all, on behalf of the community.  

My preference would be:

1.  put all the work in tds_willconvert()
2.  #define PRINTABLE_SIZE(x, SYBCHAR)
3.  remove _get_printable_size() and get_printable_size
4.  return int

because

1.  get_printable_size() could otherwise return a
value for an input type that tds_convert() cannot handle (or that
tds_willconvert() says cannot be handled).  This way, an invalid input
is uniformly and correctly handled.  

2.  This is C, and the rule in C is that 0 is false and anything else
is true.  Reducing the return code from "size of output" to "yes or no"
removes information to no advantage.  (I have no sympathy for the C
programmer who writes

	if (dbwillconvert(SYBINT, SYBCHAR) == TRUE)

because, well, there oughta be a law.)

3.  No self-respecting C function, except I/O, should begin with "get".
It's a *function*!  It maps input to output.  Observe:

	int len = get_printable_size(SYBINT);
	int len = printable_size(SYBINT);

The "get" is just nonce noise.  In the same way we don't say

	double x = compute_square_root(y);
or
	double x = get_sqrt(y);
but
	double x = sqrt(y);

Save typing.  Read faster.  Go home early.  ;-)

Hope you're convinced, and thanks again for putting in the time.  

--jkl



> On Fri, Jun 14, 2013 at 10:00 PM, arielCo <arielco at gmail.com> wrote:
> > On Thu, Jun 13, 2013 at 6:06 PM, James K. Lowden
> > <jklowden at freetds.org> wrote:
> >> The right thing to do -- your mission, should you choose to accept
> >> it
> >> -- is to use tdswillconvert() instead to determine the size.
> > Challenge accepted. I'll keep you posted.
> >
> >
> > Ariel Cornejo
> > +58·412·8083546
> > +58·416·6189113
> _______________________________________________
> FreeTDS mailing list
> FreeTDS at lists.ibiblio.org
> http://lists.ibiblio.org/mailman/listinfo/freetds


More information about the FreeTDS mailing list