[MXS-2917] qc_sqlite leaks memory with complex CREATE TABLE query Created: 2020-03-07  Updated: 2020-03-13  Resolved: 2020-03-09

Status: Closed
Project: MariaDB MaxScale
Component/s: qc_sqlite
Affects Version/s: 2.3.17
Fix Version/s: 2.3.18, 2.4.8

Type: Bug Priority: Minor
Reporter: markus makela Assignee: Johan Wikman
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Relates
relates to MXS-2908 Memory leak in 2.3.16? Closed

 Description   

The following SQL causes the query classifier to leak memory whenever the query is parsed:

CREATE TABLE IF NOT EXISTS X ( f1 DOUBLE, f2 DOUBLE, f3 DOUBLE NOT NULL, f4 DOUBLE NOT NULL, v1 DOUBLE AS ( ( IF( f2, f1, ( ( ( IF( f1, f3, f1 ) ) ) OR ( ( f4 != ( ( IFNULL( ( RAND( f3 ) ), ( ( ( ( ROUND( f3, f2 ) ) IS NULL ) ) OR ( f1 ) ) ) ) <> ( IF( ( ( ( NULLIF( f2, f2 ) ) ) AND ( f1 ) ), ( ( ( f3 ) AND ( f3 ) ) DIV f4 ), f3 ) ) ) ) ) ) ) ) ) PERSISTENT , v2 DOUBLE AS ( ( ISNULL( ( ( f3 ) AND ( ( INTERVAL( ( SIGN( f3 ) ), ( ( f4 ) AND ( f3 ) ) ) ) ) ) ) ) ) PERSISTENT , v3 DOUBLE AS ( ( ( f4 ) AND ( ( ( f4 ) OR ( ( f4 / f1 ) ) ) ) ) ) PERSISTENT , v4 DOUBLE AS ( ( ( ( f3 - f1 ) ) AND ( ( NOT ( ( ASIN( f1 ) ) ) ) ) ) ) PERSISTENT   )  /* QUERY_NO 4 CON_ID 4152 */ ;

Valgrind reports the following:

sending command leak_check definiteleak any to pid 22100
==22100== Thread 3:
==22100== 256 (80 direct, 176 indirect) bytes in 1 blocks are definitely lost in loss record 1,091 of 1,491
==22100==    at 0x483880B: malloc (vg_replace_malloc.c:309)
==22100==    by 0x6A9BF89: sqlite3MemMalloc (sqlite3.c:18650)
==22100==    by 0x6A9C551: sqlite3Malloc (sqlite3.c:22353)
==22100==    by 0x6A9CC13: dbMallocRawFinish (sqlite3.c:22676)
==22100==    by 0x6A9CD8E: sqlite3DbMallocRawNN (sqlite3.c:22744)
==22100==    by 0x6AE0321: sqlite3ExprAlloc (sqlite3.c:87168)
==22100==    by 0x6AE075C: sqlite3ExprAnd (sqlite3.c:87314)
==22100==    by 0x6AE059D: sqlite3PExpr (sqlite3.c:87258)
==22100==    by 0x6B22747: spanBinaryExpr (sqlite3.c:128536)
==22100==    by 0x6B25D51: yy_reduce (sqlite3.c:132821)
==22100==    by 0x6B29143: sqlite3Parser (sqlite3.c:134363)
==22100==    by 0x6B2A6F9: sqlite3RunParser (sqlite3.c:135758)
==22100== 
==22100== LEAK SUMMARY:
==22100==    definitely lost: 80 bytes in 1 blocks
==22100==    indirectly lost: 176 bytes in 2 blocks
==22100==      possibly lost: 5,675,668 bytes in 6,490 blocks
==22100==    still reachable: 708,736 bytes in 7,023 blocks
==22100==         suppressed: 0 bytes in 0 blocks
==22100== Reachable blocks (those to which a pointer was found) are not shown.
==22100== To see them, add 'reachable any' args to leak_check
==22100== 



 Comments   
Comment by Johan Wikman [ 2020-03-09 ]

A few Lemon (sqlite parser generator) destructors were missing. If a destructor is missing, it may lead to a leak if a non-parsable statement is encounters.

Generated at Thu Feb 08 04:17:37 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.