Skip to Content.
Sympa Menu

freetds - Re: [freetds] The behavior of bcp, blk and insert is not corresponding.

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: "MATSUMOTO, Tadashi" <pineroot AT yahoo.co.jp>
  • To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
  • Subject: Re: [freetds] The behavior of bcp, blk and insert is not corresponding.
  • Date: Fri, 16 Mar 2007 09:24:06 +0900

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
-----------------------------





Archive powered by MHonArc 2.6.24.

Top of Page