Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3498[/thread]

SQLite: Bug oder Feature?



<< >> 6 Einträge, 1 Seite
Strat
 2004-08-08 02:30
#32554 #32554
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hi Leute,

habe ein komisches Verhalten von SQLite entdeckt: bei INSERT INTO tabelle1 SELECT * FROM tabelle2 schreibt er zwar alle felder von tabelle2 nach tabelle1, aber wenn die felder der einzelnen tabellen nicht in derselben reihenfolge erzeugt wurden, kommen die werte nicht in den korrekten spalten an, z.B.
[sql]E:\ >sqlite medoc.db
SQLite version 2.8.13
Enter ".help" for instructions

sqlite > create table test1 (
  ... >   id INTEGER PRIMARY KEY,
  ... >   val1 VARCHAR,
  ... >   val2 VARCHAR,
  ... >   val5 VARCHAR
  ... > );
sqlite > create table test2 (
  ... >    id INTEGER PRIMARY KEY,
  ... >    val1 VARCHAR,
  ... >    val2 VARCHAR,
  ... >    val3 VARCHAR,
  ... >    val4 VARCHAR,
  ... >    val5 VARCHAR
  ... > );
sqlite > INSERT into test1 (id, val1, val2, val5) values (1, 'val1', 'val2', 'val5');
sqlite > insert into test1 (id, val1, val2, val5) values (2, 'val1', 'val2', 'val5');
sqlite > .headers on
sqlite > select * from test1;
id|val1|val2|val5
1|val1|val2|val5
2|val1|val2|val5
3|val1|val2|val5
sqlite > insert into test2 select *, '3' AS val3, '4' AS val4 from test1;
sqlite > select * from test2;
id|val1|val2|val3|val4|val5
1|val1|val2|val5|3|4
2|val1|val2|val5|3|4
3|val1|val2|val5|3|4
sqlite >
[/sql]
hier ist der wert 'val5' in der spalte val3, und '3' und '4' sind in den spalten val4 und val5...

ist das jetzt ein Bug oder ein Feature?\n\n

<!--EDIT|Strat|1091917926-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
format_c
 2004-08-08 03:10
#32555 #32555
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich würde sagen Bug. Aber ist sicher auslegungssache. Es heist ja nicht umsonst SQLite

Gruß Alex\n\n

<!--EDIT|format_c|1091920233-->
Ishka
 2004-08-08 03:38
#32556 #32556
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Kommt drauf an, ob es ausreichen dokumentiert ist, und ob man es abschalten kann ;)

Aber ich würde das mal als Bug deklarieren
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
murphy
 2004-08-08 04:16
#32557 #32557
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Also besonders logisch finde ich das auch nicht, aber abstellen kann man es, indem man die Reihenfolge der Tabellenfelder angibt:
Code: (dl )
INSERT INTO test2(id,val1,val2,val5,val3,val4) SELECT *, '3', '4' FROM test1;

Außerdem weiß ich zwar nicht wie sich andere Datenbanken da verhalten würden, aber nach dem SQL Standard haben eigentlich Tabellenfelder gleichen Namens in unterschiedlichen Tabellen nix miteinander zu tun -- insofern ist es wohl legitim, das Statement so auszuführen, wie SQLite das eben tut. Wären gleiche Spaltennamen nämlich äquivalent, dann bekämen man mit JOINs unter Umständen richtige Probleme!
When C++ is your hammer, every problem looks like your thumb.
pq
 2004-08-08 11:41
#32558 #32558
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich finde das verhalten völig logisch, ehrlich gesagt, und habe mich gewundert,
was du daran als bug siehst. wieso sollte sqlite (oder eine andre datenbank)
ahnen, dass die feldnamen der zwei tabellen etwas miteinander zu tun haben?
du kannst ja auch zwei völlig verschiedene tabellen t1 (A, B, C) und
t2 (C, D, E) haben. stell dir vor, du willst alle werte von t1 nach t2 schieben,
aber das feld mit dem namen C ist bei beiden unterschiedlich. nun müsste aber
nach deiner logik die datenbank alle tc.C in t2.C schieben. das wäre ja eher
kontraproduktiv.
um das gewünschte verhalten zu erreichen, kannst du ja, wie schon gesagt wurde,
die feldnamen angeben.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2004-08-08 15:15
#32559 #32559
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
es kommt mir inzwischen auch logisch vor und ich war nur zu bloed dafuer, weil ich die insert-reihenfolge nicht explizit angegeben habe. Bei * wird ja normalerweise die reihenfolge im create table verwendet... => Feature, dankeschoen\n\n

<!--EDIT|Strat|1091963746-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 6 Einträge, 1 Seite



View all threads created 2004-08-08 02:30.