Jekyll2023-09-02T02:22:30+00:00https://sqlancer.github.io/feed.xmlSQLancerSQLancer is an automated testing tool that finds bugs in database systems.GSoC 2023: Final Report of test-case reduction2023-08-30T00:00:00+00:002023-08-30T00:00:00+00:00https://sqlancer.github.io/blog/gsoc-sqlancer-final<h2 id="overview">Overview</h2>
<p>SQLancer generates a large number of statements, but not all of them are relevant to the bug. To automatically reduce the test cases, I implemented two reducers in SQLancer, the statement reducer and the AST-based reducer.</p>
<h2 id="statement-reducer">Statement Reducer</h2>
<p>The statement reducer utilizes the delta-debugging technique, which is designed for efficient test case reduction, to reduce the statements. The set of bug-inducing test cases is divided into subsets. Each subset is then individually removed. If the bug is still triggered without a specific subset, this subset is considered to be irrelevant and thus can be eliminated. Conversely, if removing any subset does not reproduce the bug, the reducer will divide test cases into more subsets and repeat the process. This iterative process continues until the set cannot be further divided into more subsets.</p>
<p>For more details, you can refer to the paper: <a href="https://www.cs.purdue.edu/homes/xyzhang/fall07/Papers/delta-debugging.pdf">Simplifying and Isolating Failure-Inducing Input</a> or <a href="https://youtu.be/lGe2-y1xibY">this video tutorial</a>.</p>
<p>Delta-debugging offers the advantage of potentially removing a significant number of statements in one turn, making it particularly efficient when the bug-inducing statements are sparsely distributed.</p>
<p>Using the statement reducer, SQLancer reduces the set of statements to a minimal subset that reproduces the bug.</p>
<h2 id="ast-based-reducer">AST-Based Reducer</h2>
<p>The AST-based reducer can shorten a statement by applying AST level transformations. They are mostly implemented using <a href="https://github.com/JSQLParser/JSqlParser">JSQLParser</a>, a RDBMS agnostic SQL statement parser that can translate SQL statements into a traversable hierarchy of Java classes. JSQLParser provides support for the SQL standard as well as major SQL dialects. The AST-based reducer works for any SQL dialects that can be parsed by this tool.</p>
<p>Currently, the AST-based transformations include:</p>
<ul>
<li>
<p>Remove union selects. e.g.,</p>
<p><code class="language-plaintext highlighter-rouge">SELECT 1 UNION SELECT 2</code> -> <code class="language-plaintext highlighter-rouge">SELECT 1</code></p>
</li>
<li>
<p>Remove irrelevant clauses. e.g.,</p>
<p><code class="language-plaintext highlighter-rouge">SELECT * FROM t OFFSET 20 LIMIT 5</code> -> <code class="language-plaintext highlighter-rouge">SELECT * FROM t</code></p>
</li>
<li>
<p>Remove list elements. e.g.,</p>
<p><code class="language-plaintext highlighter-rouge">SELECT a, b, c FROM t</code> -> <code class="language-plaintext highlighter-rouge">SELECT a FROM t</code></p>
</li>
<li>
<p>Remove rows of an insert statement. e.g.,</p>
<p><code class="language-plaintext highlighter-rouge">INSERT INTO t VALUES (1, 2), (3, 4)</code> -> <code class="language-plaintext highlighter-rouge">INSERT INTO t VALUES (1, 2)</code></p>
</li>
<li>
<p>Replace complicated expressions with their sub expressions. e.g.,</p>
<p><code class="language-plaintext highlighter-rouge">(a+b)+c</code> -> <code class="language-plaintext highlighter-rouge">c</code></p>
</li>
<li>
<p>Simplify constant values. e.g.,</p>
<p><code class="language-plaintext highlighter-rouge">3.27842156</code> -> <code class="language-plaintext highlighter-rouge">3.278</code></p>
</li>
</ul>
<p>The AST-based reducer is designed with extensibility. It walks through the list of transformations and applies them to statements until a fixed point is reached. Adding new transformations is straightforward. Simply create a new transformation and include it in the list. This flexibility allows for easy customization and expansion of the reducer’s functionality. Additionally, it is also possible to support transformations that do not depend on JSQLParser.</p>
<h2 id="framework-for-reducers-testing">Framework for reducers Testing</h2>
<p>I designed a virtual database engine to facilitate the testing of reducers. Instead of executing the statements, this engine records them for analysis. One of its notable features is the ability to customize the conditions that trigger a bug. For instance, the testing framework allows specifying an interestingness check that tests whether certain words are part of the reduced SQL test case.</p>
<p>This approach provides a testing environment and allows for thorough evaluation of the reducers’ performance. It offers convenience and flexibility in refining and polishing the functionality of the reducers without impacting real databases.</p>
<h2 id="reduction-logs">Reduction logs</h2>
<p>If test-case reduction is enabled, each time the reducer performs a reduction step successfully,it prints the reduced statements to the log file, overwriting the previous ones.</p>
<p>The log files will be stored in the following format: <code class="language-plaintext highlighter-rouge">logs/<DBMS>/reduce/<database>-reduce.log</code>. For instance, if the tested DBMS is SQLite3 and the current database is named database0, the log file will be located at <code class="language-plaintext highlighter-rouge">logs/sqlite3/reduce/database0-reduce.log</code>.</p>
<h2 id="usage">Usage</h2>
<p>Test-case reduction is disabled by default. The reducers only works for DBMSs that have implemented the <code class="language-plaintext highlighter-rouge">Reproducer</code> class.</p>
<p>The statement reducer can be enabled by passing <code class="language-plaintext highlighter-rouge">--use-reducer</code> when starting SQLancer. If you wish to further shorten each statements, you need to additionally pass the <code class="language-plaintext highlighter-rouge">--reduce-ast</code> parameter so that the AST-based reduction is applied.</p>
<p>Note: if <code class="language-plaintext highlighter-rouge">--reduce-ast</code> is set, <code class="language-plaintext highlighter-rouge">--use-reducer</code> option must be enabled first.</p>
<p>There are also options to define timeout seconds and max steps of reduction for both statement reducer and AST-based reducer.</p>
<p>For more details, you can refer to this <a href="https://github.com/sqlancer/sqlancer/blob/7804a3adec0962ad6d24687c42ec473aa49669fe/docs/testCaseReduction.md">doc</a>.</p>Yutan YangOverviewGSoC 2023: Midterm Report of test case reduction2023-07-30T00:00:00+00:002023-07-30T00:00:00+00:00https://sqlancer.github.io/blog/gsoc-sqlancer-midterm-Yutan<h1 id="overview">Overview</h1>
<p>SQLancer generates a large number of statements, but not all of them are relevant to the bug. To automatically reduce the test cases, I implemented two reducers in SQLancer, the statement reducer and the AST-based reducer.</p>
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08); zoom: 60%;" src="/assets/imgs-yutan-midterm/logs.png" alt="logs" />
<br />
<div style="
border-bottom: 1px;
display: inline-block;
padding: 2px;
margin-bottom:5px;">randomly generated statements</div>
</center>
<h1 id="statement-reducer">Statement Reducer</h1>
<p>The statement reducer utilizes the delta-debugging technique, which is designed for efficient test case reduction, to reduce the statements. The set of bug-inducing test cases is divided into subsets. Each subset is then individually removed. If the bug is still triggered without a specific subset, this subset is considered to be irrelevant and thus could be eliminated. Conversely, if removing any subset does not reproduce the bug, the reducer will divide test cases into more subsets and repeat the process. This iterative process continues until the set cannot be further divided into more subsets.</p>
<p>For more details of delta-debugging, you can refer to the paper: <a href="https://www.cs.purdue.edu/homes/xyzhang/fall07/Papers/delta-debugging.pdf">Simplifying and Isolating Failure-Inducing Input</a>. This <a href="https://youtu.be/lGe2-y1xibY">video tutorial</a> also helps.</p>
<p>Delta-debugging offers the advantage of potentially removing a significant number of statements in one turn, making it particularly efficient when the bug-inducing statements are sparsely distributed. Using the statement reducer, SQLancer could effectively reduce the set of statements to a minimal subset that reproduces the bug.</p>
<p>An earlier version of sqlite3 (version 3.28.0) are used to test the statement reducer. An illustrative example is provided below. Given a test case containing thousands of statements, the reducer was able to effectively remove irrelevant ones and retained only <b>four </b> bug inducing statements.</p>
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08); zoom: 60%;" src="/assets/imgs-yutan-midterm/sqlite3-original.png" alt="logs" />
<br />
<div style="
border-bottom: 1px;
display: inline-block;
padding: 2px;
margin-bottom:5px;">
A bug inducing test case for sqlite3 version 3.28.0</div>
</center>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- reduced queries:</span>
<span class="k">CREATE</span> <span class="n">VIRTUAL</span> <span class="k">TABLE</span> <span class="n">rt0</span> <span class="k">USING</span> <span class="n">rtree</span><span class="p">(</span><span class="n">c0</span><span class="p">,</span> <span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">);</span>
<span class="k">CREATE</span> <span class="n">VIRTUAL</span> <span class="k">TABLE</span> <span class="n">vt1</span> <span class="k">USING</span> <span class="n">fts4</span><span class="p">(</span><span class="n">c0</span><span class="p">,</span> <span class="n">compress</span><span class="o">=</span><span class="n">likely</span><span class="p">,</span> <span class="n">uncompress</span><span class="o">=</span><span class="n">likely</span><span class="p">);</span>
<span class="k">INSERT</span> <span class="k">OR</span> <span class="n">FAIL</span> <span class="k">INTO</span> <span class="n">vt1</span> <span class="k">VALUES</span> <span class="p">(</span><span class="s1">'g&'</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">16215918433687637</span><span class="p">),</span> <span class="p">(</span><span class="s1">'1帬trBWP?'</span><span class="p">);</span>
<span class="k">INSERT</span> <span class="k">OR</span> <span class="k">IGNORE</span> <span class="k">INTO</span> <span class="n">rt0</span><span class="p">(</span><span class="n">c1</span><span class="p">)</span> <span class="k">VALUES</span> <span class="p">(</span><span class="n">x</span><span class="s1">''</span><span class="p">);</span>
</code></pre></div></div>
<h1 id="ast-based-reducer">AST-Based Reducer</h1>
<p>After the statement reducing pass, the rest of the statements could still be long and complex. The AST-based reducer focuses on eliminating redundant or unnecessary parts of queries.</p>
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08); zoom: 67%;" src="/assets/imgs-yutan-midterm/unreduced.png" alt="unreduced" />
<br />
<div style="
border-bottom: 1px;
display: inline-block;
padding: 2px;
margin-bottom:5px;">
a complicated statement</div>
</center>
<p>This reducer operates by parsing the SQL string into an abstract syntax tree (AST) using <a href="https://github.com/JSQLParser/JSqlParser">JSQLParser</a>, which supports the SQL standard as well as major RDBMS, and recursively visiting each AST node to apply transformations. These transformations include removing unnecessary clauses, irrelevant elements in a list, and replacing complex expressions with simpler ones. The reduced queries are then executed, and if the bug is still triggered, the transformation is retained.</p>
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08); zoom: 67%;" src="/assets/imgs-yutan-midterm/ASTreduced.png" alt="ASTreduced" />
<br />
<div style="
border-bottom: 1px;
display: inline-block;
padding: 2px;
margin-bottom:5px;">result of AST-based reduction</div>
</center>
<p>Currently the reducer only performs generic transformations which works for any SQL dialects. However, different dialects may require special handling for unique features. Thus, expanding the capabilities of this reducer to provide support for various SQL dialects would be part of the future work.</p>
<h1 id="reducers-testing">Reducers Testing</h1>
<p>A virtual database engine is designed to test the functionality of reducers. Instead of really executing, the engine would record the input statements. The bug inducing condition can be customized to check the recorded statements, making it easy and convenient to observe if the reducers work as expected. For example, we could define that the coexistence of certain lines would result in a bug and see if the reducer isolated them.</p>
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);" src="/assets/imgs-yutan-midterm/test-statement-reducer.png" alt="test-statement-reducer" />
<br />
<div style="
border-bottom: 1px;
display: inline-block;
padding: 2px;
margin-bottom:5px;">test statement reduction via virtual engine</div>
</center>
<p>We also apply the reducers to the old version of DBMSs to observe its capabilities in the real world.</p>
<h1 id="usage">Usage</h1>
<p>The statement reducer is now available. The AST-based reducer, however, is still experimental and has not been integrated into the project.</p>
<p>This feature is disabled by default. To enable the reducer (actually only the statement reducer), you could add <code class="language-plaintext highlighter-rouge">–use-reducer</code> option when start SQLancer. Also, it supports defining limits of time and reducing steps by using <code class="language-plaintext highlighter-rouge">statement-reducer-max-steps=<limit></code> and <code class="language-plaintext highlighter-rouge">statement-reducer-max-time=<limit></code></p>
<h1 id="challenges-of-reducing">Challenges of Reducing</h1>
<ul>
<li>
<p>SQL dialects</p>
<p>The dialects vary among DBMSs. At present, the AST-based reducer only offers support for generic transformations that can be applied to any dialect. However, accommodating distinct SQL syntaxes will be included in the future development plans.</p>
</li>
<li>
<p>Enhancing extendibility for AST-based reducer</p>
<p>Rules of transformation are defined to shorten an SQL statement. Ensuring the ease of defining and integrating new rules of transformation would be highly advantageous as well as challenging.</p>
</li>
</ul>Yutan YangOverviewGoogle Summer of Code (GSoC) 20232023-06-04T00:00:00+00:002023-06-04T00:00:00+00:00https://sqlancer.github.io/blog/gsoc-sqlancer<p><img src="https://sqlancer.github.io/assets/images/2023-gsoc-contributors.jpg" alt="alt" /></p>
<p>For the first time, SQLancer is participating as a <a href="https://summerofcode.withgoogle.com/programs/2023/organizations/sqlancer">Google Summer of Code (GSoC)</a> organization. We are excited that we will be working with two contributors: <a href="https://github.com/ZhengLin-Li">Zhenglin Li</a> and <a href="https://github.com/ColinYoungTaro">Yutan Yang</a>. Find out more about them below!</p>
<h1 id="yutan-yang">Yutan Yang</h1>
<h2 id="could-you-introduce-yourself">Could you introduce yourself?</h2>
<p>Hello, I’m Yutan Yang, a first-year master’s student at Zhejiang University, Hangzhou, China.
I am interested in coding since I find it interesting to bring ideas to life through programming.
Aside from coding, I also enjoy drawing while I may not consider myself an expert.</p>
<h2 id="what-will-you-be-working-on-as-part-of-your-gsoc-project">What will you be working on as part of your GSoC project?</h2>
<p>As part of my GSoC project, I will be working on implementing test case reduction approaches.</p>
<p>SQLancer automatically generates thousands of statements and it might be complicated to identify which is relevant to the bug. The reduction process removes statements and tokens which are irrelevant to bugs so that the test case could be simple and clear. Additionally, I aim to extend these reduction approaches to support more DBMSs.</p>
<h2 id="how-did-you-hear-about-gsoc-and-sqlancer">How did you hear about GSoC and SQLancer?</h2>
<p>I first learned about GSoC through recommendations from one of my friends, and I think contributing to open-source projects is cool.</p>
<p>I came across SQLancer when exploring Program Organizations listed on the GSoC website. Recognizing that the idea is related to my graduate research topic, I decided to apply for it.</p>
<h2 id="what-will-you-do-after-the-project">What will you do after the project?</h2>
<p>I might keep on contributing to open-source projects. I hope this experience will allow me to gain engineering experience and collaboration skills.</p>
<p>I would first continue my study. After successfully completing my master’s degree, I am excited to transition into the professional world and pursue opportunities in the IT industry.</p>
<h1 id="zhenglin-li">Zhenglin Li</h1>
<h2 id="could-you-introduce-yourself-1">Could you introduce yourself?</h2>
<p>My name is Zhenglin Li. I am currently a senior year undergraduate student majoring in software engineering at SCU.
I have been accepted for graduate studies at TAMU, starting 23 fall, where I will be specializing in computer science.
I have a strong passion for open source projects. I have actively contributed to several projects, including SQLancer, Casbin, Beam, and so on.</p>
<h2 id="what-will-you-be-working-on-as-part-of-your-gsoc-project-1">What will you be working on as part of your GSoC project?</h2>
<p>As part of my GSoC project, my primary focus will be on enhancing SQLancer to support a new database system called StoneDB.
This will involve various tasks, such as integrating support for the new DBMS, testing the system, identifying, validating, and reporting bugs or issues found.</p>
<h2 id="how-did-you-hear-about-gsoc-and-sqlancer-1">How did you hear about GSoC and SQLancer?</h2>
<p>I first learned about the Google Summer of Code program approximately three years ago through a video platform called bilibili. In my opinion, GSoC will provid me with a great opportunity to delve into the world of open source and make valuable contributions under the mentorship of experienced individuals.</p>
<p>In the case of SQLancer, I discovered it while browsing through the list of organizations participating in GSoC. I found SQLancer interesting. Also, SQLancer is useful and it has uncovered numerous bugs in well-established DBMS.</p>
<h2 id="what-will-you-do-after-the-project-1">What will you do after the project?</h2>
<p>After completing my GSoC project, my plan is to continue actively contributing to SQLancer and other open source community. I believe in the power of open source software because it is transformative.</p>
<p>Looking ahead, I will be starting my graduate studies at Texas A&M University. The program I am attending is Master of Computer Science. After this, I plan to seek employment in the tech companies, building software that interests me, excites me, and impact people.</p>GSoC 2023: Midterm Report on Support of StoneDB2023-06-04T00:00:00+00:002023-06-04T00:00:00+00:00https://sqlancer.github.io/blog/gsoc-sqlancer-midterm-zhenglin<h1 id="support-of-stonedb-midterm-report">Support of StoneDB Midterm Report</h1>
<p>SQLancer is an open-source tool for testing the correctness of SQL database systems and supports close to 20 database systems. The goal of this project is to add support for StoneDB to SQLancer and test StoneDB to find potential bugs.</p>
<p>StoneDB is an open-source hybrid transaction/analytical processing (HTAP) database designed and developed by StoneAtom based on the MySQL kernel. It provides features such as high efficiency and real-time analytics, offering a one-stop solution to process online transaction processing (OLTP), online analytical processing (OLAP), and HTAP workloads.</p>
<h2 id="things-achieved">Things Achieved</h2>
<p>See the detailed description of supported syntax here: <a href="https://docs.google.com/document/d/12OpiDYs_Civor-saKZFmZPZd5ElVJAc9RDpDIwikh9Y/edit?usp=sharing">Functions Supported by SQLancer for StoneDB</a></p>
<p>See the detailed description of bugs found here: <a href="https://docs.google.com/document/d/1N-oUGVATV0l6tG87uOtPNmfLS7g_fuo7HIckFobD-Yo/edit?usp=sharing">Bugs Found in StoneDB by SQLancer</a></p>
<h2 id="encountered-challenges-and-solutions">Encountered Challenges and Solutions</h2>
<p>This section will cover challenges encountered and the way I addressed them.</p>
<h3 id="choose-which-stonedb-version-to-support">Choose which StoneDB version to support</h3>
<p>During the <strong>initial stages</strong> of our project, our plan was to support the <strong>latest version</strong> of StoneDB, which is <strong>version 8.0</strong>.</p>
<p>However, we encountered several challenges that hindered our ability to work with the 8.0 version. Firstly, there was no available Docker image to facilitate the easy execution of the 8.0 version. Additionally, building StoneDB from source code presented difficulties related to missing packages and incompatible versions within the environment.</p>
<p>Considering these obstacles, we made the decision to <strong>prioritize the support for StoneDB version 5.7 initially</strong>. And by the midterm evaluation, we have successfully implemented the basic support of 5.7 version.</p>
<p>Looking ahead, as we <strong>plan to extend our support to the 8.0 version</strong>, we have identified <strong>two potential approaches</strong>.</p>
<ol>
<li>If the <strong>differences</strong> between the 5.7 and 8.0 versions are <strong>minimal</strong>, we can enhance the existing implementation by introducing a <strong>parameter flag</strong> that handles the version-specific variations. This approach allows us to maintain a single unified implementation that can accommodate both versions.</li>
<li>If the <strong>differences</strong> between the versions are <strong>large</strong>, we need to <strong>implement separate code paths</strong> for each version, treating them as distinct entities.</li>
</ol>
<h3 id="which-generator-to-use-typed-or-untyped">Which generator to use: typed or untyped</h3>
<p>Looking at the three files:</p>
<ul>
<li><a href="https://github.com/sqlancer/sqlancer/blob/main/src/sqlancer/common/gen/ExpressionGenerator.java">sqlancer/common/gen/ExpressionGenerator.java</a></li>
<li><a href="https://github.com/sqlancer/sqlancer/blob/main/src/sqlancer/common/gen/TypedExpressionGenerator.java">sqlancer/common/gen/TypedExpressionGenerator.java</a></li>
<li><a href="https://github.com/sqlancer/sqlancer/blob/main/src/sqlancer/common/gen/UntypedExpressionGenerator.java">sqlancer/common/gen/UntypedExpressionGenerator.java</a></li>
</ul>
<p>The <code class="language-plaintext highlighter-rouge">ExpressionGenerator</code> is an interface, and <code class="language-plaintext highlighter-rouge">TypedExpressionGenerator</code> and <code class="language-plaintext highlighter-rouge">UntypedExpressionGenerator</code> are abstract classes that implement the <code class="language-plaintext highlighter-rouge">ExpressionGenerator</code> interface.</p>
<p>When implementing the concrete generator, we have to decide which generator to inherit from, the <code class="language-plaintext highlighter-rouge">TypedExpressionGenerator</code> or the <code class="language-plaintext highlighter-rouge">UntypedExpressionGenerator</code>.</p>
<p>A <strong>typed generator</strong> is a generator which is <strong>associated with a specific data type or set of data types</strong>. One characteristic is that it allows for generating values of the type that is expected in a specific context. On the other hand, an <strong>untyped generator</strong> <strong>does not</strong> have a specific data type associated with it. It can yield values of any type.</p>
<p>The choice between using a typed or untyped generator <strong>depends on the requirements of the DBMS under test</strong>. Typed generators provide the advantage of generating expected types when this is important. Untyped generators, on the other hand, offer more <strong>flexibility</strong> and can be useful in scenarios where the type of yielded values may vary or is not known in advance.</p>
<p>Ultimately, I decided to use the untyped generator because it can yield values of any type, allowing us to test the support of unexpected types of a DBMS.</p>
<h3 id="read-and-understand-the-code-of-the-implementation-of-other-dbms-in-sqlancer">Read and understand the code of the implementation of other DBMS in SQLancer</h3>
<p>During the initial phase of our project, I delved into the codebase of various DBMS implementations within SQLancer to gain a comprehensive understanding.</p>
<p>The first challenge I encountered is due to the limited comments within the code. Consequently, I had to rely on studying the source code to comprehend the design and functionality of classes, methods, and functions. The good news is though the implementation details may differ from one database to another, there are still some common rules to follow. So, I read the code of many other DBMS and identified the common parts and started my implementation.</p>
<h2 id="interaction-with-stonedb-community">Interaction With StoneDB Community</h2>
<p>This section will cover our interaction with the StoneDB community.</p>
<p>We actively engaged with the StoneDB community to seek assistance, share our findings, and collaborate on improving the system. Our interaction primarily took place through the <strong>Slack channel</strong> and <strong>GitHub platform</strong>.</p>
<p>In addition to Slack, we also utilized the issue and discussion sections on GitHub to communicate with the StoneDB community. All questions or comments got replies. For example,</p>
<ul>
<li>They answered our question here: <a href="https://github.com/orgs/stoneatom/discussions/1849#discussioncomment-6138954">stonedb-8.0-v1.0.1-beta</a></li>
<li>They fixed <a href="https://github.com/stoneatom/stonedb/issues/1923">the docker size bug</a> we found previously</li>
<li>They are trying to fix the <a href="https://github.com/stoneatom/stonedb/issues/1933">bad dpn index when deleting rows bug</a></li>
<li>They are trying to fix the <a href="https://github.com/stoneatom/stonedb/issues/1941">crash: StoneDB crash when executing the command (SELECT, HAING, GROUP BY, IS NULL)</a></li>
<li>They are trying to fix the <a href="https://github.com/stoneatom/stonedb/issues/1942">bug: query result not correct</a></li>
</ul>
<h2 id="future-work">Future Work</h2>
<p>This section will cover opportunities for potential future changes.</p>
<ol>
<li>
<p>Test StoneDB, add more expected errors, and report potential bugs.</p>
</li>
<li>
<p>Support more statement categories and syntax. For example, referring to the docs of MySQL, there are some optional arguments that we may not currently support. We can support them in the future.</p>
</li>
<li>
<p>Another example is that, we can support more functions, refer to: <a href="https://stonedb.io/docs/SQL-reference/functions/advanced-functions">https://stonedb.io/docs/SQL-reference/functions/advanced-functions</a></p>
</li>
<li>
<p>Refine the code implementation. For example, we can discuss if we can reuse some code that is common to all DBMS implementations.</p>
</li>
</ol>Zhenglin LiSupport of StoneDB Midterm Report