[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