Re: "Data conversion resulted in overflow" with float constants

"James K. Lowden" <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <[email protected]>
On Fri, 21 Jun 2013 18:14:10 -0430
arielCo <[email protected]> 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 <[email protected]> wrote:
> > On Thu, Jun 13, 2013 at 6:06 PM, James K. Lowden
> > <[email protected]> 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
> [email protected]
> http://lists.ibiblio.org/mailman/listinfo/freetds
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.