Dan checked in a fix
(https://www.sqlite.org/src/info/bfea226d0d226a04) that may fix your
problem.  It might also be that you can work around your problem by
setting:

    PRAGMA automatic_index=OFF;

Please try these and let us know whether or not they help.

On 10/24/15, Catalin Ionescu <catalin.ionescu at radioconsult.ro> wrote:
> Hi,
>
> So far I never used the command-line shell. It is clearly compiled with
> different optimization settings and that might be the cause of apparent
> correct functionality. Anyway, I decided to give it a try and attack the
> problem as a whole (I suspected, from previous experience, that the bug
> is just randomly appearing!). So I have fired up the shell, opened the
> DB file, pasted the CREATE TEMP VIEW... statements and executed "select
> sum(Quantity*PriceMed) from Stocks_View;". With 3.8.11 and newer I get a
> results around 20528.817 and with 3.8.10.2 and older I get a results
> around 11383.248. The value with the older SQLite versions is the
> correct one!
>
> Is this considered a satisfactory proof that there is a problem starting
> with version 3.8.11?
>
> We are using SQLite in other projects where we deal with simply storing
> data and we have not seen any problems with newer versions. With this
> strange test case we might have just hit a combination of factors that
> triggers the problem!
>
> Catalin
>
> On 24.10.2015 16:22, Richard Hipp wrote:
>> On 10/24/15, Catalin Ionescu <catalin.ionescu at radioconsult.ro> wrote:
>>> Hi!
>>>
>>> The attached database shows the problem. Just check Stocks_View for
>>> CompID 231. Normally it should be 0, but it gives 5. There are correctly
>>> computed 8 inputs but wrongly computed 3 outputs.
>> When I run "SELECT * FROM Stocks_View WHERE CompID=231" on the
>> attached database, I always get a single line of output:
>>
>>     231|13|Faulty|0.0|1163.872|1320.44558088179|1216.59944761022
>>
>> This is true regardless of which version of SQLite I use.
>>
>> I'm sorry you are having difficulties.  We'd like to help.  But you
>> really do need to give us a specific example of what is going wrong in
>> order for us to fix it.  Please avoid vague statements like "Just
>> check Stocks_View for CompID 231".  It is more precise to say "Run the
>> statement 'SELECT * FROM Stocks_View WHERE CompID=231;'".  Better
>> still, send us a single script that can be run using the sqlite3.exe
>> command-line shell that demonstrates the problem, and does not require
>> us to use a specific database file and to create a bunch of TEMP views
>> first.  Perhaps you can build that script by running the ".dump"
>> command on your sample database file, concatenating the CREATE TEMP
>> VIEW statements that are required, and appending the SELECT statement
>> that is causing problems for you.
>>
>>
>>> Catalin
>>>
>>> On 22.10.2015 15:19, Richard Hipp wrote:
>>>> Thanks for the report.
>>>>
>>>> Can you also provide us with a test case that demonstrates the
>>>> malfunction?
>>>>
>>>> On 10/22/15, Catalin Ionescu <catalin.ionescu at radioconsult.ro> wrote:
>>>>> I have an internal stocks management application that I rebuild from
>>>>> time to time, usually against the latest SQLite version. After moving
>>>>> to
>>>>> SQLite 3.9.1 it started reporting crazy stock values. Previously it
>>>>> was
>>>>> compiled with SQLite 3.8.8.3. Further investigation showed that the
>>>>> last
>>>>> usable SQLite version is 3.8.10.2. The application is compiled with
>>>>> Visual Studio 2013 Express.
>>>>>
>>>>> The SQL statement creating the database and the temporary views is:
>>>>>
>>>>> *****
>>>>> PRAGMA case_sensitive_like = ON;
>>>>> PRAGMA foreign_keys = ON;
>>>>> VACUUM;
>>>>>
>>>>> CREATE TABLE IF NOT EXISTS Categories(CatID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                          Name TEXT);
>>>>> CREATE TABLE IF NOT EXISTS Components(CompID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                          CatID INTEGER REFERENCES
>>>>> Categories(CatID),
>>>>>                                          Name TEXT);
>>>>> CREATE TABLE IF NOT EXISTS Suppliers(SupID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                         Name TEXT);
>>>>> CREATE TABLE IF NOT EXISTS Codes(CodeID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                     CompID INTEGER REFERENCES
>>>>> Components(CompID),
>>>>>                                     SupID INTEGER REFERENCES
>>>>> Suppliers(SupID),
>>>>>                                     Name TEXT);
>>>>> CREATE TABLE IF NOT EXISTS Inputs(InvID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                      SupID INTEGER REFERENCES
>>>>> Suppliers(SupID),
>>>>>                                      Date INTEGER,
>>>>>                                      Total REAL,
>>>>>                                      CompTotal REAL,
>>>>>                                      ExchgRate REAL,
>>>>>                                      Name TEXT);
>>>>> CREATE TABLE IF NOT EXISTS InputsComp(InCompID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                          InvID INTEGER REFERENCES
>>>>> Inputs(InvID),
>>>>>                                          CodeID INTEGER REFERENCES
>>>>> Codes(CodeID),
>>>>>                                          Total REAL,
>>>>>                                          Quantity REAL);
>>>>> CREATE TABLE IF NOT EXISTS Products(ProdID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                        Code TEXT,
>>>>>                                        Name TEXT);
>>>>> CREATE TABLE IF NOT EXISTS ProductsComp(ProdCompID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                            ProdID INTEGER REFERENCES
>>>>> Products(ProdID),
>>>>>                                            CompID INTEGER REFERENCES
>>>>> Components(CompID),
>>>>>                                            Quantity REAL);
>>>>> CREATE TABLE IF NOT EXISTS Outputs(OutID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                       Date INTEGER,
>>>>>                                       Name TEXT);
>>>>> CREATE TABLE IF NOT EXISTS OutputsProd(OutProdID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                           OutID INTEGER REFERENCES
>>>>> Outputs(OutID),
>>>>>                                           ProdID INTEGER REFERENCES
>>>>> Products(ProdID),
>>>>>                                           Quantity REAL);
>>>>> CREATE TABLE IF NOT EXISTS OutputsComp(OutCompID INTEGER PRIMARY KEY
>>>>> AUTOINCREMENT,
>>>>>                                           OutID INTEGER REFERENCES
>>>>> Outputs(OutID),
>>>>>                                           CompID INTEGER REFERENCES
>>>>> Components(CompID),
>>>>>                                           Quantity REAL);
>>>>>
>>>>> CREATE TEMP VIEW Codes_View AS
>>>>>      SELECT CodeID,CompID,SupID,Name,
>>>>>             (SELECT Name FROM Suppliers WHERE (Suppliers.SupID =
>>>>> Codes.SupID)) || ' - ' || Name AS SupplierCode,
>>>>>             (SELECT CatID FROM Components WHERE (Components.CompID =
>>>>> Codes.CompID)) AS CatID,
>>>>>             (SELECT Name FROM Components WHERE (Components.CompID =
>>>>> Codes.CompID)) AS Component
>>>>>       FROM Codes;
>>>>>
>>>>> CREATE TEMP VIEW Inputs_View AS
>>>>>      SELECT InvID,SupID,Date,Total,CompTotal,ExchgRate,Name,
>>>>>             Total/ExchgRate/CompTotal AS PriceRatio,
>>>>>             (SELECT Name FROM Suppliers WHERE (Suppliers.SupID =
>>>>> Inputs.SupID)) AS Supplier,
>>>>>             (SELECT Name FROM Suppliers WHERE (Suppliers.SupID =
>>>>> Inputs.SupID)) || ' - ' || Name AS FullName
>>>>>       FROM Inputs;
>>>>>
>>>>> CREATE TEMP VIEW InputsComp_View AS
>>>>>      SELECT InCompID,InvID,CodeID,Total,Quantity,
>>>>>             Total*(SELECT PriceRatio FROM Inputs_View WHERE
>>>>> (Inputs_View.InvID = InputsComp.InvID)) AS EffPrice,
>>>>>             Total*(SELECT PriceRatio FROM Inputs_View WHERE
>>>>> (Inputs_View.InvID = InputsComp.InvID))/Quantity AS UnitPrice,
>>>>>             (SELECT CompID FROM Codes WHERE (Codes.CodeID =
>>>>> InputsComp.CodeID)) AS CompID,
>>>>>             (SELECT SupplierCode FROM Codes_View WHERE
>>>>> (Codes_View.CodeID
>>>>> = InputsComp.CodeID)) AS SupplierCode,
>>>>>             (SELECT Component FROM Codes_View WHERE (Codes_View.CodeID
>>>>> =
>>>>> InputsComp.CodeID)) AS Component,
>>>>>             (SELECT FullName FROM Inputs_View WHERE (Inputs_View.InvID
>>>>> =
>>>>> InputsComp.InvID)) AS Invoice,
>>>>>             (SELECT Date FROM Inputs_View WHERE (Inputs_View.InvID =
>>>>> InputsComp.InvID)) AS Date
>>>>>       FROM InputsComp;
>>>>>
>>>>> CREATE TEMP VIEW ProductsComp_View AS
>>>>>      SELECT ProdCompID,ProdID,CompID,Quantity,
>>>>>             (SELECT Name FROM Components WHERE (Components.CompID =
>>>>> ProductsComp.CompID)) AS Component,
>>>>>             (SELECT MIN(UnitPrice) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = ProductsComp.CompID)) *
>>>>>               Quantity AS PriceMin,
>>>>>             (SELECT MAX(UnitPrice) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = ProductsComp.CompID)) *
>>>>>               Quantity AS PriceMax,
>>>>>             (SELECT SUM(EffPrice) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = ProductsComp.CompID)) /
>>>>>               (SELECT SUM(Quantity) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = ProductsComp.CompID)) *
>>>>>               Quantity AS PriceMed
>>>>>       FROM ProductsComp;
>>>>>
>>>>> CREATE TEMP VIEW Products_View AS
>>>>>      SELECT ProdID,Code,Name,
>>>>>        (SELECT SUM(PriceMin) FROM ProductsComp_View WHERE
>>>>> (ProductsComp_View.ProdID = Products.ProdID)) AS PriceMin,
>>>>>        (SELECT SUM(PriceMax) FROM ProductsComp_View WHERE
>>>>> (ProductsComp_View.ProdID = Products.ProdID)) AS PriceMax,
>>>>>        (SELECT SUM(PriceMed) FROM ProductsComp_View WHERE
>>>>> (ProductsComp_View.ProdID = Products.ProdID)) AS PriceMed
>>>>>       FROM Products;
>>>>>
>>>>> CREATE TEMP VIEW OutputsComp_View AS
>>>>>        SELECT ProductsComp.CompID AS CompID,OutputsProd.OutID AS
>>>>> OutID,(OutputsProd.Quantity * ProductsComp.Quantity) AS Quantity,
>>>>>               (SELECT Date FROM Outputs WHERE (Outputs.OutID =
>>>>> OutputsProd.OutID)) AS Date,
>>>>>               (SELECT Name FROM Outputs WHERE (Outputs.OutID =
>>>>> OutputsProd.OutID)) || ' - ' ||
>>>>>                 (SELECT Code FROM Products WHERE (Products.ProdID =
>>>>> OutputsProd.ProdID)) AS Output,
>>>>>               (SELECT Name FROM Components WHERE (Components.CompID =
>>>>> ProductsComp.CompID)) AS Component
>>>>>         FROM OutputsProd,ProductsComp
>>>>>         WHERE (OutputsProd.ProdID = ProductsComp.ProdID)
>>>>>      UNION
>>>>>        SELECT CompID,OutID,Quantity,
>>>>>               (SELECT Date FROM Outputs WHERE (Outputs.OutID =
>>>>> OutputsComp.OutID)) AS Date,
>>>>>               (SELECT Name FROM Outputs WHERE (Outputs.OutID =
>>>>> OutputsComp.OutID)) AS Output,
>>>>>               (SELECT Name FROM Components WHERE (Components.CompID =
>>>>> OutputsComp.CompID)) AS Component
>>>>>         FROM OutputsComp;
>>>>>
>>>>> CREATE TEMP VIEW Outputs_View AS
>>>>>      SELECT OutID,Date,Name,
>>>>>        (SELECT SUM(Quantity * (SELECT MIN(UnitPrice) FROM
>>>>> InputsComp_View
>>>>> WHERE (InputsComp_View.CompID = OutputsComp_View.CompID)))
>>>>>          FROM OutputsComp_View WHERE (OutputsComp_View.OutID =
>>>>> Outputs.OutID)) AS PriceMin,
>>>>>        (SELECT SUM(Quantity * (SELECT MAX(UnitPrice) FROM
>>>>> InputsComp_View
>>>>> WHERE (InputsComp_View.CompID = OutputsComp_View.CompID)))
>>>>>          FROM OutputsComp_View WHERE (OutputsComp_View.OutID =
>>>>> Outputs.OutID)) AS PriceMax,
>>>>>        (SELECT SUM(Quantity * (SELECT SUM(EffPrice) FROM
>>>>> InputsComp_View
>>>>> WHERE (InputsComp_View.CompID = OutputsComp_View.CompID)) /
>>>>>                    (SELECT SUM(Quantity) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = OutputsComp_View.CompID)))
>>>>>          FROM OutputsComp_View WHERE (OutputsComp_View.OutID =
>>>>> Outputs.OutID)) AS PriceMed
>>>>>       FROM Outputs;
>>>>>
>>>>> CREATE TEMP VIEW Stocks_View AS
>>>>>      SELECT CompID,CatID,Name,
>>>>>             ifnull((SELECT SUM(Quantity) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = Components.CompID)),0) -
>>>>>               ifnull((SELECT SUM(Quantity) FROM OutputsComp_View WHERE
>>>>> (OutputsComp_View.CompID = Components.CompID)),0) AS Quantity,
>>>>>             (SELECT MIN(UnitPrice) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = Components.CompID)) AS PriceMin,
>>>>>             (SELECT MAX(UnitPrice) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = Components.CompID)) AS PriceMax,
>>>>>             (SELECT SUM(EffPrice) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = Components.CompID)) /
>>>>>               (SELECT SUM(Quantity) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = Components.CompID)) AS PriceMed
>>>>>       FROM Components;
>>>>> *****
>>>>>
>>>>> The problem is with the Quantity field of the Stocks_View temporary
>>>>> view. While the Quantity field values are correct in InputsComp_View
>>>>> and
>>>>> OutputsComp_View (the results for a specific CompID are shown in
>>>>> separate grids when checking the stocks) and the result of
>>>>>
>>>>> ifnull((SELECT SUM(Quantity) FROM InputsComp_View WHERE
>>>>> (InputsComp_View.CompID = Components.CompID)),0)
>>>>>
>>>>> is correct, the result of
>>>>>
>>>>> ifnull((SELECT SUM(Quantity) FROM OutputsComp_View WHERE
>>>>> (OutputsComp_View.CompID = Components.CompID)),0)
>>>>>
>>>>> is not correctly considering all rows in OutputsComp_View.
>>>>>
>>>>> One of the offending cases is for a CompID value that produces results
>>>>> in OutputsComp_View only through the second part of the UNION (it is
>>>>> found only in OutputsComp).
>>>>> _______________________________________________
>>>>> sqlite-users mailing list
>>>>> sqlite-users at mailinglists.sqlite.org
>>>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>>>>
>>>
>>
>
>


-- 
D. Richard Hipp
drh at sqlite.org

Reply via email to