AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4 5/* Unity fixtures */6void setUp(void) {7 /* Setup code here, or leave empty */8}9void tearDown(void) {10 /* Cleanup code here, or leave empty */11}12 13/* Helper to assert sqlite3_complete() result with message of the SQL string */14static void assert_complete_is(const char *sql, int expected){15 int rc = sqlite3_complete(sql);16 TEST_ASSERT_EQUAL_INT_MESSAGE(expected, rc, sql);17}18 19/* Basic termination tests */20void test_sqlite3_complete_simple_semicolon(void){21 assert_complete_is("SELECT 1;", 1);22}23void test_sqlite3_complete_missing_semicolon(void){24 assert_complete_is("SELECT 1", 0);25}26void test_sqlite3_complete_multiple_statements_final_semicolon(void){27 assert_complete_is("SELECT 1; SELECT 2;", 1);28}29void test_sqlite3_complete_multiple_statements_missing_final_semicolon(void){30 assert_complete_is("SELECT 1; SELECT 2", 0);31}32void test_sqlite3_complete_semicolon_then_whitespace(void){33 assert_complete_is(" ; \n\t", 1);34}35 36/* Empty and whitespace-only inputs */37void test_sqlite3_complete_empty_string_returns_false(void){38 assert_complete_is("", 0);39}40void test_sqlite3_complete_whitespace_only_returns_false(void){41 assert_complete_is(" \n\t", 0);42}43 44/* Comment handling */45void test_sqlite3_complete_comment_only_cstyle_returns_false(void){46 assert_complete_is("/* just a comment */", 0);47}48void test_sqlite3_complete_comment_only_sqlstyle_returns_false(void){49 assert_complete_is("-- only comment", 0);50}51void test_sqlite3_complete_trailing_sql_comment_without_newline_after_semicolon(void){52 assert_complete_is("SELECT 1;-- trailing comment", 1);53}54void test_sqlite3_complete_trailing_sql_comment_with_newline_after_semicolon(void){55 assert_complete_is("SELECT 1;-- trailing comment\n", 1);56}57void test_sqlite3_complete_semicolon_inside_c_comment_ignored(void){58 assert_complete_is("/* ; inside comment */", 0);59}60void test_sqlite3_complete_statement_then_c_comment(void){61 assert_complete_is("SELECT 1; /* trailing comment with ; inside ; */", 1);62}63void test_sqlite3_complete_statement_then_sql_comment_ending_line(void){64 assert_complete_is("SELECT 1; -- comment to eol", 1);65}66void test_sqlite3_complete_unterminated_c_comment_returns_false(void){67 assert_complete_is("SELECT 1; /* unterminated", 0);68}69 70/* Quoted identifiers/strings and bracketed names */71void test_sqlite3_complete_semicolon_inside_single_quotes_ignored(void){72 assert_complete_is("SELECT ';';", 1);73}74void test_sqlite3_complete_unterminated_single_quote_returns_false(void){75 assert_complete_is("SELECT 'abc", 0);76}77void test_sqlite3_complete_bracket_identifier_with_semicolon_inside(void){78 assert_complete_is("SELECT [a;b];", 1);79}80void test_sqlite3_complete_unterminated_bracket_identifier_returns_false(void){81 assert_complete_is("SELECT [abc", 0);82}83void test_sqlite3_complete_backtick_identifier_with_semicolon_inside(void){84 assert_complete_is("SELECT `a;b`;", 1);85}86void test_sqlite3_complete_double_quoted_identifier_with_semicolon_inside(void){87 assert_complete_is("SELECT \"a;b\";", 1);88}89 90/* Keyword recognition and non-trigger CREATE handling */91void test_sqlite3_complete_explain_select(void){92 assert_complete_is("explain select 1;", 1);93}94void test_sqlite3_complete_create_table_is_not_trigger_special_case(void){95 assert_complete_is("CREATE TABLE t(x);", 1);96}97void test_sqlite3_complete_create_temp_table_is_not_trigger_special_case(void){98 assert_complete_is("CREATE TEMP TABLE t(x);", 1);99}100 101/* Trigger handling (only when triggers are enabled) */102#ifndef SQLITE_OMIT_TRIGGER103void test_sqlite3_complete_create_trigger_valid_sequence_end_semicolon(void){104 const char *sql = "CREATE TRIGGER t AFTER INSERT ON x BEGIN SELECT 1; END;";105 assert_complete_is(sql, 1);106}107void test_sqlite3_complete_create_trigger_missing_final_semicolon_returns_false(void){108 const char *sql = "CREATE TRIGGER t AFTER INSERT ON x BEGIN SELECT 1; END";109 assert_complete_is(sql, 0);110}111void test_sqlite3_complete_create_trigger_missing_semicolon_before_end_returns_false(void){112 const char *sql = "CREATE TRIGGER t AFTER INSERT ON x BEGIN SELECT 1 END;";113 assert_complete_is(sql, 0);114}115void test_sqlite3_complete_create_temp_trigger_valid(void){116 const char *sql =117 "CREATE TEMP TRIGGER t BEFORE UPDATE ON x BEGIN SELECT 1; END;";118 assert_complete_is(sql, 1);119}120void test_sqlite3_complete_create_temporary_trigger_valid(void){121 const char *sql =122 "CREATE TEMPORARY TRIGGER t AFTER UPDATE ON x BEGIN SELECT 1; END;";123 assert_complete_is(sql, 1);124}125void test_sqlite3_complete_explain_create_trigger_valid(void){126 const char *sql =127 "EXPLAIN CREATE TRIGGER t AFTER INSERT ON x BEGIN SELECT 1; END;";128 assert_complete_is(sql, 1);129}130#endif /* SQLITE_OMIT_TRIGGER */131 132/* API armor NULL check (only when enabled) */133#ifdef SQLITE_ENABLE_API_ARMOR134void test_sqlite3_complete_null_pointer_returns_false_under_api_armor(void){135 TEST_ASSERT_EQUAL_INT(0, sqlite3_complete(NULL));136}137#endif138 139int main(void){140 UNITY_BEGIN();141 142 RUN_TEST(test_sqlite3_complete_simple_semicolon);143 RUN_TEST(test_sqlite3_complete_missing_semicolon);144 RUN_TEST(test_sqlite3_complete_multiple_statements_final_semicolon);145 RUN_TEST(test_sqlite3_complete_multiple_statements_missing_final_semicolon);146 RUN_TEST(test_sqlite3_complete_semicolon_then_whitespace);147 148 RUN_TEST(test_sqlite3_complete_empty_string_returns_false);149 RUN_TEST(test_sqlite3_complete_whitespace_only_returns_false);150 151 RUN_TEST(test_sqlite3_complete_comment_only_cstyle_returns_false);152 RUN_TEST(test_sqlite3_complete_comment_only_sqlstyle_returns_false);153 RUN_TEST(test_sqlite3_complete_trailing_sql_comment_without_newline_after_semicolon);154 RUN_TEST(test_sqlite3_complete_trailing_sql_comment_with_newline_after_semicolon);155 RUN_TEST(test_sqlite3_complete_semicolon_inside_c_comment_ignored);156 RUN_TEST(test_sqlite3_complete_statement_then_c_comment);157 RUN_TEST(test_sqlite3_complete_statement_then_sql_comment_ending_line);158 RUN_TEST(test_sqlite3_complete_unterminated_c_comment_returns_false);159 160 RUN_TEST(test_sqlite3_complete_semicolon_inside_single_quotes_ignored);161 RUN_TEST(test_sqlite3_complete_unterminated_single_quote_returns_false);162 RUN_TEST(test_sqlite3_complete_bracket_identifier_with_semicolon_inside);163 RUN_TEST(test_sqlite3_complete_unterminated_bracket_identifier_returns_false);164 RUN_TEST(test_sqlite3_complete_backtick_identifier_with_semicolon_inside);165 RUN_TEST(test_sqlite3_complete_double_quoted_identifier_with_semicolon_inside);166 167 RUN_TEST(test_sqlite3_complete_explain_select);168 RUN_TEST(test_sqlite3_complete_create_table_is_not_trigger_special_case);169 RUN_TEST(test_sqlite3_complete_create_temp_table_is_not_trigger_special_case);170 171#ifndef SQLITE_OMIT_TRIGGER172 RUN_TEST(test_sqlite3_complete_create_trigger_valid_sequence_end_semicolon);173 RUN_TEST(test_sqlite3_complete_create_trigger_missing_final_semicolon_returns_false);174 RUN_TEST(test_sqlite3_complete_create_trigger_missing_semicolon_before_end_returns_false);175 RUN_TEST(test_sqlite3_complete_create_temp_trigger_valid);176 RUN_TEST(test_sqlite3_complete_create_temporary_trigger_valid);177 RUN_TEST(test_sqlite3_complete_explain_create_trigger_valid);178#endif179 180#ifdef SQLITE_ENABLE_API_ARMOR181 RUN_TEST(test_sqlite3_complete_null_pointer_returns_false_under_api_armor);182#endif183 184 return UNITY_END();185}