Hi,

Indeed, this fixes the problem! Many thanks!

On 24.10.2015 23:47, Richard Hipp wrote:
> 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
>>>>>>
>>
>

Reply via email to