[freetds] The behavior of bcp, blk and insert is not corresponding.
MATSUMOTO, Tadashi
pineroot at yahoo.co.jp
Thu Mar 15 20:24:06 EDT 2007
Hi,
I've made this patch to change characters ,if which are all space, into "0".
It seems to do what I want to do.
Could someone give me some advice about my patch?
Thank you for your help.
========================================================================
--- freetds-0.64/src/tds/convert.c.ORG Wed Mar 7 14:32:33 2007
+++ freetds-0.64/src/tds/convert.c Thu Mar 15 19:02:50 2007
@@ -2879,22 +2879,24 @@
{ blank = ' ' };
const char *p;
int sign;
unsigned int num; /* we use unsigned here for best overflow check */
p = buf;
/* ignore leading spaces */
while (p != pend && *p == blank)
++p;
- if (p == pend)
- return TDS_CONVERT_SYNTAX;
+ if (p == pend) {
+ p--;
+ *p = '0';
+ }
/* check for sign */
sign = 0;
switch (*p) {
case '-':
sign = 1;
/* fall thru */
case '+':
/* skip spaces between sign and number */
++p;
@@ -2954,22 +2956,24 @@
{ blank = ' ' };
const char *p;
int sign;
TDS_UINT8 num; /* we use unsigned here for best overflow check */
p = buf;
/* ignore leading spaces */
while (p != pend && *p == blank)
++p;
- if (p == pend)
- return TDS_CONVERT_SYNTAX;
+ if (p == pend) {
+ p--;
+ *p = '0';
+ }
/* check for sign */
sign = 0;
switch (*p) {
case '-':
sign = 1;
/* fall thru */
case '+':
/* skip spaces between sign and number */
++p;
========================================================================
MATSUMOTO, Tadashi wrote:
> MATSUMOTO, Tadashi wrote:
>> Thank you! The problem is solved.
>> It succeeded as follows.
>>
>> However, another problem occurred. Details E-mail separately.
>
> The another problem is this. (only tested on 0.64)
>
> Freebcp and the blk function cannot insert space into a numeric column.
> The "insert" statement on tsql can insert space into a numeric column as 0.
>
> Sybase bcp and the blk function can insert space into a numeric column as 0.
> The "insert" statement on Sybase isql cannot insert space into a numeric column.
>
> Why have the behavior of Sybase and FreeTds reversed?
>
> thanks,
>
> tsql
> ------------------------
> drop table dbo.test_me
> create table dbo.test_me (
> i integer not null primary key,
> c char(1) not null,
> v varchar(10) null)
> insert into dbo.test_me values (3,' ','string')
> insert into dbo.test_me values (1,' ','string2')
> insert into dbo.test_me values (2,' ',null)
> insert into dbo.test_me values (4,' ',null)
> select * from dbo.test_me
> go
> i i1 i2 c1 c2 v1 v2
> 1 0 1 a a string string2
> 2 2 0 b b string string2
> 3 3 3 c string string2
> 4 4 4 d string string2
> 5 5 5 e e string2
> 6 6 6 f f string
> 7 7 7 g g string string2
> 8 8 NULL g NULL string NULL
> ----------------
>
> freebcp
> ------------------------
> % freebcp "test_me" "out" "test_me.txt" -Sxxxx -c -Uuser -Ppass
>
> Starting copy...
>
> 8 rows copied.
> % tsql .....
> truncate table test_me
> go
> select * from test_me
> go
> i i1 i2 c1 c2 v1 v2
> % vi test_me.txt
> % diff test_me.txt.orig test_me.txt
> 1,2c1,2
> < 1 0 1 a a string string2
> < 2 2 0 b b string string2
> ---
>> 1 1 a a string string2
>> 2 2 b b string string2
> % freebcp "test_me" "in" "test_me.txt" -Sxxxx -c -Uuser -Ppass
>
> Starting copy...
>
> Msg 20050, Level 4
> Attempt to convert data stopped by syntax error in source field
>
> Msg 20050, Level 4
> Attempt to convert data stopped by syntax error in source field
>
> 6 rows copied.
> % tsql .......
> select * from test_me
> go
> i i1 i2 c1 c2 v1 v2
> 3 3 3 c string string2
> 4 4 4 d string string2
> 5 5 5 e e string2
> 6 6 6 f f string
> 7 7 7 g g string string2
> 8 8 NULL g NULL string NULL
> -----------------------------
More information about the FreeTDS
mailing list