xsql_parser_tree_test.go 3.1 KB

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