On 3/8/17, Vermes Mátyás <ver...@comfirm.hu> wrote:
> I rewrote the program for you to C.

Thank you for the translation.

Below is the equivalent program in 34 lines of TCL.  (Compare to 101
lines of Ruby and 430 lines of C++.  Everybody: If you are unfamiliar
with the TCL programming language, you would do well to learn it, and
start using it.  It will save you a lot of work.)

-------------------------------------- cut here ----------------------------
package require sqlite3
sqlite3 db :memory:
db eval {
  CREATE TABLE proba(
    szamla VARCHAR(24) COLLATE rtrim NOT NULL,
    devnem CHAR(3) COLLATE rtrim,
    megnevezes VARCHAR(30) COLLATE rtrim,
    osszeg NUMERIC(17,2),
    tulmenflag BOOLEAN,
    konyvkelt DATE,
    megjegyzes BLOB
  );
  CREATE UNIQUE INDEX proba_primarykey ON proba(szamla, devnem);
  CREATE INDEX proba_nev ON proba(megnevezes, szamla);
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('000000000000000000000000','HUF','BLACK');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('111111111111111111111111','HUF','WHITE');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('222222222222222222222222','HUF','WHITE');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('333333333333333333333333','HUF','BLACK');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('444444444444444444444444','HUF','WHITE');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('555555555555555555555555','HUF','WHITE');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('666666666666666666666666','HUF','BLACK');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('777777777777777777777777','HUF','WHITE');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('888888888888888888888888','HUF','WHITE');
  INSERT INTO proba(szamla,devnem,megnevezes)
VALUES('999999999999999999999999','HUF','BLACK');
}
db eval BEGIN
set cnt 0
db eval {SELECT szamla, megnevezes FROM proba} {
  incr cnt
  puts "$cnt: $szamla $megnevezes"
  db eval {UPDATE proba SET megnevezes=megnevezes||'*' WHERE szamla=$szamla}
}
db eval COMMIT
-------------------------------------- End ------------------------------------

As Dan already observed, the problem results because you are modifying
an index in the middle of a scan of that index, thereby messing up the
scan.  Don't do that.  The safest approach is to run the query to
completion, then go back and start the loop over UPDATEs.

If you add "ORDER BY +rowid" to the query, that forces the query to
run to completion first and then go through the sorter, before you get
any results back, which solves the problem.



-- 
D. Richard Hipp
d...@sqlite.org
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to