Creating a new thread for this topic... I'm confused by affinity.  Here is my 
munging of Pavel's examples from another thread:

--- sql.txt ---
.echo on
create table "d" (i);
create table "n" (i numeric);
create table "i" (i integer);
insert into "d" values (1);
insert into "n" values (1);
insert into "i" values (1);
select * from "d" where i=1;
select * from "n" where i=1;
select * from "i" where i=1;
select * from "d" where i='1';
select * from "n" where i='1';
select * from "i" where i='1';
.echo off

SQLite version 3.6.10
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .read sql.txt
create table "d" (i);
create table "n" (i numeric);
create table "i" (i integer);
insert into "d" values (1);
insert into "n" values (1);
insert into "i" values (1);
select * from "d" where i=1;
1
select * from "n" where i=1;
1
select * from "i" where i=1;
1
select * from "d" where i='1';
select * from "n" where i='1';
1
select * from "i" where i='1';
1
.echo off
sqlite>

Based on the documentation (http://www.sqlite.org/datatype3.html) column 
affinity does not limit the types of data that can be stored, it merely prefers 
types based on documented coercion rules.

The default affinity is NONE if left unspecified.  INTEGER affinity behaves 
like NUMERIC affinity except that it will store a REAL value as an INTEGER if 
there is no fractional component and it fits into an INTEGER container.

Therefore table "d" should have the default affinity NONE and not coerce data 
from one storage class to another, so the first insert should put an INTEGER in 
table "d".  The second insert should put an INTEGER in table "n", and the third 
insert should also put an INTEGER in table "i", both based on coercion rules.

So I don't understand why *any* of the last 3 selects should return a value at 
all.  If there is some type conversion going on in the comparisons, why did the 
fourth select return no results?

RW

PS: The documentation in section 2.1 (see url above) at first led me to believe 
that the default affinity is NUMERIC (see the 5th bullet).  Perhaps it would be 
more clear to have the first bullet be "If no datatype string is provided, then 
it is assigned affinity NONE."  Also, one might expect that specifying an 
affinity of NONE would result in an affinity of NONE, but such a table behaves 
like table "n" above, i.e. NUMERIC affinity.  So section 2.1 correctly 
describes what strings are parsed for affinity determination, though not 
without some user surprise.

SQLite version 3.6.10
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table none (i NONE);
sqlite> insert into "none" values(1);
sqlite> select * from "none" where i='1';
1
sqlite>

Ron Wilson, Engineering Project Lead
(o) 434.455.6453, (m) 434.851.1612, www.harris.com

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to