diff --git a/pyobvector/schema/reflection.py b/pyobvector/schema/reflection.py index acf5b07..1ce38ec 100644 --- a/pyobvector/schema/reflection.py +++ b/pyobvector/schema/reflection.py @@ -60,7 +60,8 @@ def _prep_regexes(self): r"(?: +USING +(?P\S+))?" r"(?: +WITH +\((?P[^)]+)\))?" r"(?: +WITH PARSER +(?P\S+))?" - r"(?: +PARSER_PROPERTIES=\((?P[^)]+)\))?" + r"(?: +PARSER_PROPERTIES *[ =]? *\((?P[^)]+)\))?" + r"(?: +FTS_INDEX_TYPE *[ =]? *(?P\S+))?" r"(?: +(KEY_)?BLOCK_SIZE *[ =]? *(?P\S+) *(LOCAL)?)?" r"(?: +COMMENT +(?P(\x27\x27|\x27([^\x27])*?\x27)+))?" r"(?: +/\*(?P.+)\*/ *)?" diff --git a/tests/test_reflection.py b/tests/test_reflection.py index bf8b85f..bf46f83 100644 --- a/tests/test_reflection.py +++ b/tests/test_reflection.py @@ -51,3 +51,28 @@ def test_customized_fulltext_parser(self): state = dialect._tabledef_parser.parse(ddl, "utf8") assert len(state.columns) == 4 assert len(state.keys) == 3 + + def test_analyzer_fulltext_parser_properties_and_fts_index_type(self): + dialect = OceanBaseDialect() + parser_properties = 'analysis = \'{"analyzer": "standard"}\'' + fulltext_key = ( + " FULLTEXT KEY `fts_idx_question_tks` (`question_tks`)" + " WITH PARSER analyzer" + f" PARSER_PROPERTIES = ({parser_properties})" + " FTS_INDEX_TYPE = PHRASE_MATCH BLOCK_SIZE 16384" + ) + ddl = ( + "CREATE TABLE `t_fts_analyzer` (\n" + " `id` bigint NOT NULL,\n" + " `question_tks` longtext DEFAULT NULL,\n" + " PRIMARY KEY (`id`),\n" + f"{fulltext_key}\n" + ") DEFAULT CHARSET = utf8mb4\n" + ) + state = dialect._tabledef_parser.parse(ddl, "utf8") + assert len(state.columns) == 2 + assert len(state.keys) == 2 + fts_key = next(k for k in state.keys if k.get("parser") == "analyzer") + assert fts_key["name"] == "fts_idx_question_tks" + assert "standard" in fts_key["parser_properties"] + assert fts_key["fts_index_type"] == "PHRASE_MATCH"