Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update MySqlParser.g4 #3393

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

zhujiangtao1981
Copy link

The origin mathExpression has bugs when we preprocess complex expressons. for example:
if we calculate a expression "100 + 100/2", the result is (100+100)/2. so the mathOperator should have priority.
firstly, we should calculate Mul/Div/Mod;
finally, we should calculate Add/Sub;

The origin mathExpression has bugs when we preprocess  complex expressons. 
for example:
if we calculate a expression  "100 + 100/2", the result is (100+100)/2.
so the mathOperator should have priority.
firstly, we should calculate Mul/Div/Mod;
finally, we should calculate Add/Sub;
Comment on lines +2628 to +2629
| left=expressionAtom mathPriorOperator right=expressionAtom #mathPriorExpressionAtom
| left=expressionAtom mathAfterOperator right=expressionAtom #mathAfterExpressionAtom
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's better to rename them to mathMultDivOperator and mathAddSubOperator.

Suggested change
| left=expressionAtom mathPriorOperator right=expressionAtom #mathPriorExpressionAtom
| left=expressionAtom mathAfterOperator right=expressionAtom #mathAfterExpressionAtom
| left=expressionAtom mathPriorOperator right=expressionAtom #mathPriorExpressionAtom
| left=expressionAtom mathAfterOperator right=expressionAtom #mathAfterExpressionAtom

@KvanTTT KvanTTT added the mysql-PositiveTechnologies MySql grammar by Positive Technologies issues label May 9, 2023
@kaby76
Copy link
Contributor

kaby76 commented May 9, 2023

A test for the expression 100 + 100/2 and/or other examples that mix +, -, *, /, ... should be added. There's nothing like it in the examples. The test must have a .tree file of the parse.

05/09-08:00:57 ~/issues/parens/other/sql/mysql/Positive-Technologies
$ trparse examples/*.sql | trxgrep ' //mathOperator/./ancestor::expression' | trtext
CSharp 0 examples/analyze.sql success 0.1286237
CSharp 0 examples/bitrix_queries_cut.sql success 54.7832683
CSharp 0 examples/case_sensitive_sql.sql success 0.3253716
CSharp 0 examples/ddl_alter.sql success 0.8960842
CSharp 0 examples/ddl_create.sql success 2.6123551
CSharp 0 examples/ddl_drop.sql success 0.1446698
CSharp 0 examples/ddl_flush.sql success 0.0501746
CSharp 0 examples/dml_delete.sql success 0.28286
CSharp 0 examples/dml_insert.sql success 0.6796907
CSharp 0 examples/dml_replace.sql success 0.170066
CSharp 0 examples/dml_select.sql success 4.5654083
CSharp 0 examples/dml_test_arithmetic_expression.sql success 0.0100945
CSharp 0 examples/dml_union.sql success 0.7478549
CSharp 0 examples/dml_update.sql success 0.3446768
CSharp 0 examples/dml_with.sql success 0.2009095
CSharp 0 examples/ext_tests.sql success 0.873523
CSharp 0 examples/grant.sql success 0.1269522
CSharp 0 examples/kill.sql success 0.0413537
CSharp 0 examples/mysql_spec_comment.sql success 0.1397344
CSharp 0 examples/optimize.sql success 0.0147603
CSharp 0 examples/smoke_tests.sql success 0.363849
examples/bitrix_queries_cut.sql:UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - 600
examples/bitrix_queries_cut.sql:FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - 600) <=  FSTAT.LAST_VISIT
examples/bitrix_queries_cut.sql: (FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - 600) <=  FSTAT.LAST_VISIT)
examples/bitrix_queries_cut.sql: 1=1  AND (FSTAT.SITE_ID = 's1') AND (FSTAT.USER_ID = 0 OR U.ACTIVE = 'Y') AND (FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - 600) <=  FSTAT.LAST_VISIT)
examples/bitrix_queries_cut.sql: UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW())
examples/bitrix_queries_cut.sql:  ifnull(SHOW_COUNTER, 0) + 1
examples/bitrix_queries_cut.sql:  ifnull(SHOW_COUNTER, 0) + 1
examples/bitrix_queries_cut.sql: UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW())
examples/bitrix_queries_cut.sql: UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW())
examples/bitrix_queries_cut.sql: UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW())
examples/bitrix_queries_cut.sql: UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW())
examples/bitrix_queries_cut.sql: COUNTER+1
examples/bitrix_queries_cut.sql: COUNTER+1
examples/bitrix_queries_cut.sql: COUNTER+1
examples/bitrix_queries_cut.sql: COUNTER+1
examples/bitrix_queries_cut.sql:
                                UNIX_TIMESTAMP(V.DATE_END) - UNIX_TIMESTAMP(V.DATE_START)
examples/case_sensitive_sql.sql:10-poWeR(3,4)
examples/case_sensitive_sql.sql: aBs(10-poWeR(3,4))
examples/case_sensitive_sql.sql:rAnD()*100
examples/case_sensitive_sql.sql: cEIL(rAnD()*100)
examples/case_sensitive_sql.sql: (sIn(0.5*3.413234) + coS(100 MoD 33)) +lOG(pI()*eXp(AcOS(10)*AtAn(10)))
examples/case_sensitive_sql.sql:sIn(0.5*3.413234) + coS(100 MoD 33)
examples/case_sensitive_sql.sql: (sIn(0.5*3.413234) + coS(100 MoD 33)) +lOG(pI()*eXp(AcOS(10)*AtAn(10)))
examples/case_sensitive_sql.sql:0.5*3.413234
examples/case_sensitive_sql.sql:sIn(0.5*3.413234) + coS(100 MoD 33)
examples/case_sensitive_sql.sql: (sIn(0.5*3.413234) + coS(100 MoD 33)) +lOG(pI()*eXp(AcOS(10)*AtAn(10)))
examples/case_sensitive_sql.sql:100 MoD 33
examples/case_sensitive_sql.sql:sIn(0.5*3.413234) + coS(100 MoD 33)
examples/case_sensitive_sql.sql: (sIn(0.5*3.413234) + coS(100 MoD 33)) +lOG(pI()*eXp(AcOS(10)*AtAn(10)))
examples/case_sensitive_sql.sql:pI()*eXp(AcOS(10)*AtAn(10))
examples/case_sensitive_sql.sql: (sIn(0.5*3.413234) + coS(100 MoD 33)) +lOG(pI()*eXp(AcOS(10)*AtAn(10)))
examples/case_sensitive_sql.sql:AcOS(10)*AtAn(10)
examples/case_sensitive_sql.sql:pI()*eXp(AcOS(10)*AtAn(10))
examples/case_sensitive_sql.sql: (sIn(0.5*3.413234) + coS(100 MoD 33)) +lOG(pI()*eXp(AcOS(10)*AtAn(10)))
examples/ddl_alter.sql:id + 6 > 10
examples/ddl_alter.sql:ID + 6 > 10
examples/ddl_alter.sql: 1c + 1
examples/ddl_create.sql:bin_len * bin_width * bin_height
examples/ddl_create.sql:bin_len * bin_width * bin_height
examples/ddl_create.sql: 1c + 1
examples/ddl_create.sql: old.col1 + 5
examples/ddl_create.sql: old.col1 + 7
examples/ddl_create.sql: i + 1
examples/ddl_create.sql: NEW.badge_student_total + 1
examples/ddl_create.sql: old.col1 + 5
examples/ddl_create.sql: old.col1 + 7
examples/ddl_create.sql: 2 + var1
examples/ddl_create.sql: LastID+1
examples/ddl_create.sql: Tx_Count + VALUES(Tx_Count)
examples/ddl_create.sql: Real_Amount + VALUES(Real_Amount)
examples/ddl_create.sql: Bonus_Amount + VALUES(Bonus_Amount)
examples/ddl_create.sql: Real_Count + VALUES(Real_Count)
examples/ddl_create.sql: Bonus_Count + VALUES(Bonus_Count)
examples/ddl_create.sql: n + 1
examples/dml_delete.sql:col2 - col3 <= (select count(*) from t2)
examples/dml_delete.sql:col2 - col3 <= (select count(*) from t2) or maincol/2 > 100.2
examples/dml_delete.sql: (col2 - col3 <= (select count(*) from t2) or maincol/2 > 100.2)
examples/dml_delete.sql: col1 = true and (col2 - col3 <= (select count(*) from t2) or maincol/2 > 100.2)
examples/dml_delete.sql: maincol/2 > 100.2
examples/dml_delete.sql:col2 - col3 <= (select count(*) from t2) or maincol/2 > 100.2
examples/dml_delete.sql: (col2 - col3 <= (select count(*) from t2) or maincol/2 > 100.2)
examples/dml_delete.sql: col1 = true and (col2 - col3 <= (select count(*) from t2) or maincol/2 > 100.2)
examples/dml_delete.sql: id*2 + somecol < 10
examples/dml_delete.sql: id*2 + somecol < 10
examples/dml_delete.sql: alias_t2.col_onecol + t3.col_for_compare <> t1.sum_col
examples/dml_delete.sql: t1.col1 <= alias_t2.col1 and alias_t2.col_onecol + t3.col_for_compare <> t1.sum_col
examples/dml_insert.sql:col2*2
examples/dml_insert.sql:col1*2
examples/dml_insert.sql:hits+15
examples/dml_insert.sql: new.a+new.b
examples/dml_replace.sql: abs(-10 * col1) + sqrt(col2/col3)
examples/dml_replace.sql:-10 * col1
examples/dml_replace.sql: abs(-10 * col1) + sqrt(col2/col3)
examples/dml_replace.sql:col2/col3
examples/dml_replace.sql: abs(-10 * col1) + sqrt(col2/col3)
examples/dml_update.sql:to_seconds(now()) mod 33
examples/dml_update.sql: (to_seconds(now()) mod 33)
examples/dml_update.sql: `t2`.`***` * 2
examples/dml_update.sql: col1 + 1
examples/dml_update.sql: col1 + 1
examples/dml_update.sql: id + 1
examples/dml_update.sql:ValWithinGroup-baseVal
examples/dml_with.sql: n + 1
examples/ext_tests.sql: 1 = 16/4 between 3 and 5
examples/ext_tests.sql: 1 = 16/4 between 5 and 6
examples/ext_tests.sql: length(str)/2
examples/smoke_tests.sql: 1 = 16/4 between 3 and 5
examples/smoke_tests.sql: 1 = 16/4 between 5 and 6
examples/smoke_tests.sql: length(str)/2

@teverett
Copy link
Member

teverett commented Oct 4, 2023

@KvanTTT @kaby76 is this PR ready to merge?

@KvanTTT
Copy link
Member

KvanTTT commented Oct 4, 2023

No, my suggestions still remain unfixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
mysql-PositiveTechnologies MySql grammar by Positive Technologies issues
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants