xsql_parser_tree_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package xsql
  2. import (
  3. "fmt"
  4. "github.com/emqx/kuiper/common"
  5. "reflect"
  6. "strings"
  7. "testing"
  8. )
  9. func TestParser_ParseTree(t *testing.T) {
  10. var tests = []struct {
  11. s string
  12. stmt Statement
  13. err string
  14. }{
  15. {
  16. s: `CREATE STREAM demo (
  17. USERID BIGINT,
  18. ) WITH (DATASOURCE="users", FORMAT="JSON", KEY="USERID");`,
  19. stmt: &StreamStmt{
  20. Name: StreamName("demo"),
  21. StreamFields: []StreamField{
  22. {Name: "USERID", FieldType: &BasicType{Type: BIGINT}},
  23. },
  24. Options: &Options{
  25. DATASOURCE: "users",
  26. FORMAT: "JSON",
  27. KEY: "USERID",
  28. },
  29. },
  30. },
  31. {
  32. s: `CREATE TABLE demo (
  33. USERID BIGINT,
  34. ) WITH (DATASOURCE="users", FORMAT="JSON", KEY="USERID", RETAIN_SIZE="3");`,
  35. stmt: &StreamStmt{
  36. Name: StreamName("demo"),
  37. StreamFields: []StreamField{
  38. {Name: "USERID", FieldType: &BasicType{Type: BIGINT}},
  39. },
  40. Options: &Options{
  41. DATASOURCE: "users",
  42. FORMAT: "JSON",
  43. KEY: "USERID",
  44. RETAIN_SIZE: 3,
  45. },
  46. StreamType: TypeTable,
  47. },
  48. },
  49. {
  50. s: `CREATE TABLE table1 (
  51. name STRING,
  52. size BIGINT,
  53. id BIGINT
  54. ) WITH (DATASOURCE="lookup.json", FORMAT="json", CONF_KEY="test");`,
  55. stmt: &StreamStmt{
  56. Name: StreamName("table1"),
  57. StreamFields: []StreamField{
  58. {Name: "name", FieldType: &BasicType{Type: STRINGS}},
  59. {Name: "size", FieldType: &BasicType{Type: BIGINT}},
  60. {Name: "id", FieldType: &BasicType{Type: BIGINT}},
  61. },
  62. Options: &Options{
  63. DATASOURCE: "lookup.json",
  64. FORMAT: "json",
  65. CONF_KEY: "test",
  66. },
  67. StreamType: TypeTable,
  68. },
  69. },
  70. {
  71. s: `SHOW STREAMS`,
  72. stmt: &ShowStreamsStatement{},
  73. },
  74. {
  75. s: `SHOW TABLES`,
  76. stmt: &ShowTablesStatement{},
  77. },
  78. {
  79. s: `SHOW STREAMSf`,
  80. stmt: nil,
  81. err: `found "STREAMSf", expected keyword streams or tables.`,
  82. },
  83. {
  84. s: `SHOW STREAMS d`,
  85. stmt: nil,
  86. err: `found "d", expected semecolon or EOF.`,
  87. },
  88. {
  89. s: `DESCRIBE STREAM demo`,
  90. stmt: &DescribeStreamStatement{
  91. Name: "demo",
  92. },
  93. err: ``,
  94. },
  95. {
  96. s: `EXPLAIN STREAM demo1`,
  97. stmt: &ExplainStreamStatement{
  98. Name: "demo1",
  99. },
  100. err: ``,
  101. },
  102. {
  103. s: `DROP STREAM demo1`,
  104. stmt: &DropStreamStatement{
  105. Name: "demo1",
  106. },
  107. err: ``,
  108. },
  109. {
  110. s: `DESCRIBE TABLE demo`,
  111. stmt: &DescribeTableStatement{
  112. Name: "demo",
  113. },
  114. err: ``,
  115. },
  116. {
  117. s: `EXPLAIN TABLE demo1`,
  118. stmt: &ExplainTableStatement{
  119. Name: "demo1",
  120. },
  121. err: ``,
  122. },
  123. {
  124. s: `DROP TABLE demo1`,
  125. stmt: &DropTableStatement{
  126. Name: "demo1",
  127. },
  128. err: ``,
  129. },
  130. }
  131. fmt.Printf("The test bucket size is %d.\n\n", len(tests))
  132. for i, tt := range tests {
  133. p := NewParser(strings.NewReader(tt.s))
  134. stmt, err := Language.Parse(p)
  135. if !reflect.DeepEqual(tt.err, common.Errstring(err)) {
  136. t.Errorf("%d. %q: error mismatch:\n exp=%s\n got=%s\n\n", i, tt.s, tt.err, err)
  137. } else if tt.err == "" && !reflect.DeepEqual(tt.stmt, stmt) {
  138. t.Errorf("%d. %q\n\nstmt mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.s, tt.stmt, stmt)
  139. }
  140. }
  141. }