home *** CD-ROM | disk | FTP | other *** search
/ Total Network Tools 2002 / NextStepPublishing-TotalNetworkTools2002-Win95.iso / Archive / Misc Servers / Zope.exe / SQLGRAM.PY < prev    next >
Encoding:
Text File  |  1999-07-28  |  10.9 KB  |  303 lines

  1.  
  2. # sql grammar, partial, based on ODBC 2.0 programmer's ref
  3.  
  4. ## someday add subquery precedence to allow more general selects.
  5.  
  6. sqlrules = """
  7.  
  8. statement_list ::
  9.  
  10. @R stat1 :: statement_list >> statement
  11. @R statn :: statement_list >> statement ; statement_list
  12.  
  13. @R dropindexstat :: statement >> drop_index_statement
  14.  
  15. @R createindexstat :: statement >> create_index_statement
  16.  
  17. @R selstat :: statement >> select_statement
  18.  
  19. @R insstat :: statement >> insert_statement
  20.  
  21. @R createtablestat :: statement >> create_table_statement
  22.  
  23. @R droptablestat :: statement >> drop_table_statement
  24.  
  25. @R delstat :: statement >> delete_statement_searched
  26.  
  27. @R updatestat :: statement >> update_statement_searched
  28.  
  29. @R createviewstat :: statement >> create_view_statement
  30.  
  31. @R dropviewstat :: statement >> drop_view_statement
  32.  
  33. ## drop view statement
  34. @R dropview :: drop_view_statement >> DROP VIEW user_defined_name
  35.  
  36. ## create view statement
  37. @R createview :: create_view_statement >> 
  38.     CREATE VIEW user_defined_name optnamelist AS select_statement
  39. @R optnamelist0 :: optnamelist >>
  40. @R optnamelistn :: optnamelist >> ( namelist )
  41.     
  42. ## drop index statement
  43. @R dropindex :: drop_index_statement >> DROP INDEX user_defined_name
  44.  
  45. ## create index statement
  46. @R createindex :: create_index_statement >>
  47.      CREATE INDEX user_defined_name
  48.      ON user_defined_name
  49.      ( namelist )
  50.      
  51. @R createuniqueindex :: create_index_statement >>
  52.      CREATE UNIQUE INDEX user_defined_name
  53.      ON user_defined_name
  54.      ( namelist )
  55.      
  56. @R names1 :: namelist >> user_defined_name
  57. @R namesn :: namelist >> namelist , user_defined_name
  58.  
  59. ## update statement
  60. @R update :: update_statement_searched >>
  61.      UPDATE user_defined_name
  62.      SET assns
  63.      optwhere
  64.      
  65. @R assn1 :: assns >> assn
  66. @R assnn :: assns >> assns , assn
  67. @R assn :: assn >> column_identifier = expression
  68.  
  69. #####
  70.  
  71. ## delete statement
  72. @R deletefrom :: delete_statement_searched >> DELETE FROM user_defined_name optwhere
  73.  
  74. ## drop table
  75. @R droptable :: drop_table_statement >> DROP TABLE user_defined_name
  76.  
  77. ## create table statement ( restricted )
  78. @R createtable :: create_table_statement >>
  79.     CREATE TABLE user_defined_name ( colelts )
  80. @R colelts1 :: colelts >> colelt
  81. @R coleltsn :: colelts >> colelts , colelt
  82. @R coleltid :: colelt >> column_definition
  83. @R coleltconstraint :: colelt >> column_constraint_definition
  84. ## column constraints deferred
  85. @R coldef :: column_definition >> 
  86.     column_identifier data_type optdefault optcolconstraints
  87. ## optdefault deferred
  88. @R optdef0 :: optdefault >>
  89. ## optcolconstraint deferred
  90. @R optcolconstr0 :: optcolconstraints >>
  91. @R stringtype :: data_type >> character_string_type
  92. @R exnumtype :: data_type >> exact_numeric_type
  93. @R appnumtype :: data_type >> approximate_numeric_type
  94. @R integer :: exact_numeric_type >> INTEGER
  95. @R float :: approximate_numeric_type >> FLOAT
  96. @R varchar :: character_string_type >> VARCHAR
  97. @R varcharn :: character_string_type >> VARCHAR ( numeric_literal )
  98.  
  99. ## insert statement
  100.  
  101. @R insert1 :: insert_statement >>
  102.     INSERT INTO table_name optcolids insert_spec
  103. @R optcolids0 :: optcolids >>
  104. @R optcolids1 :: optcolids >> ( colids )
  105. @R colids1 :: colids >> column_identifier
  106. @R colidsn :: colids >> colids , column_identifier
  107. @R insert_values :: insert_spec >> VALUES ( litlist )
  108. @R insert_query :: insert_spec >> sub_query
  109. @R litlist1 :: litlist >> sliteral
  110. @R litlistn :: litlist >> litlist , sliteral
  111. @R sliteral0 :: sliteral >> literal
  112. @R sliteralp :: sliteral >> + literal
  113.  
  114. ## hack to permit complexes
  115.  
  116. @R sliterals :: sliteral >> sliteral + literal
  117. @R sliterald :: sliteral >> sliteral - literal
  118. @R sliteralm :: sliteral >> - literal
  119.  
  120. ## select statement
  121.  
  122. @R subselect :: sub_query >>
  123.      SELECT alldistinct select_list
  124.      FROM table_reference_list
  125.      optwhere optgroup opthaving optunion
  126.      
  127. ## @R psubselect :: sub_query >> ( sub_query ) 
  128.      
  129. @R selectx :: select_statement >>
  130.      sub_query
  131.      optorder_by
  132. @R ad0 :: alldistinct >>
  133. @R adall :: alldistinct >> ALL
  134. @R addistinct :: alldistinct >> DISTINCT
  135. @R where0 :: optwhere >>
  136. @R where1 :: optwhere >> WHERE search_condition
  137. @R group0 :: optgroup >> 
  138. @R group1 :: optgroup >> GROUP BY colnamelist
  139. @R colnames1 :: colnamelist >> column_name
  140. @R colnamesn :: colnamelist >> colnamelist , column_name
  141. @R having0 :: opthaving >>
  142. @R having1 :: opthaving >> HAVING search_condition
  143. @R union0 :: optunion >>
  144. @R union1 :: optunion >> UNION alldistinct sub_query
  145. @R except1 :: optunion >> EXCEPT sub_query
  146. @R intersect1 :: optunion >> INTERSECT sub_query
  147. @R order0 :: optorder_by >>
  148. @R order1 :: optorder_by >> ORDER BY sortspeclist
  149. ##@R orderby :: order_by_clause >> ORDER BY sortspeclist
  150. @R sortspec1 :: sortspeclist >> sort_specification
  151. @R sortspecn :: sortspeclist >> sortspeclist , sort_specification
  152. ## really, should be unsigned int
  153. @R sortint :: sort_specification >> numeric_literal opt_ord
  154. @R sortcol :: sort_specification >> column_name opt_ord
  155. @R optord0 :: opt_ord >>
  156. @R optordasc :: opt_ord >> ASC
  157. @R optorddesc :: opt_ord >> DESC
  158.  
  159. ## table reference list (nasty hack alert)
  160. @R trl1 :: table_reference_list >> user_defined_name
  161. @R trln :: table_reference_list >> user_defined_name , table_reference_list
  162. @R trl1a :: table_reference_list >> user_defined_name user_defined_name
  163. @R trlna :: table_reference_list >> user_defined_name user_defined_name , table_reference_list
  164. @R trl1as :: table_reference_list >> user_defined_name AS user_defined_name
  165. @R trlnas :: table_reference_list >> user_defined_name AS user_defined_name , table_reference_list
  166.  
  167. ## select list 
  168. @R selectstar :: select_list >> *
  169. @R selectsome :: select_list >> selectsubs
  170. @R select1 :: selectsubs >> select_sublist
  171. @R selectn :: selectsubs >> selectsubs , select_sublist
  172. @R selectit :: select_sublist >> expression
  173. @R selectname :: select_sublist >> expression AS column_alias
  174. @R colalias :: column_alias >> user_defined_name
  175.  
  176. ## search condition
  177. @R search1 :: search_condition >> boolean_term
  178. @R searchn :: search_condition >> boolean_term OR search_condition
  179. @R bool1 :: boolean_term >> boolean_factor
  180. @R booln :: boolean_term >> boolean_factor AND boolean_term
  181. @R bf1 :: boolean_factor >> boolean_primary
  182. @R notbf :: boolean_factor >> NOT boolean_primary
  183. @R bp1 :: boolean_primary >> predicate
  184. @R bps :: boolean_primary >> ( search_condition )
  185.  
  186. ## predicate (simple for now!!!)
  187. @R predicate1 :: predicate >> comparison_predicate
  188.  
  189. ## comparison predicate (simple for now!!!)
  190. @R predicateeq :: comparison_predicate >> expression = expression
  191. @R predicatelt :: comparison_predicate >> expression < expression
  192. @R predicategt :: comparison_predicate >> expression > expression
  193. @R predicatele :: comparison_predicate >> expression < = expression
  194. @R predicatege :: comparison_predicate >> expression > = expression
  195. @R predicatene :: comparison_predicate >> expression < > expression
  196. @R predbetween :: comparison_predicate >> expression BETWEEN expression AND expression
  197. @R prednotbetween :: comparison_predicate >> 
  198.      expression NOT BETWEEN expression AND expression
  199.  
  200. ## exists predicate
  201. @R predexists :: predicate >> exists_predicate
  202. @R exists :: exists_predicate >> EXISTS ( sub_query )
  203.  
  204. ## quantified predicate
  205. @R predqeq :: predicate >> expression = allany ( sub_query )
  206. @R predqne :: predicate >> expression < > allany ( sub_query )
  207. @R predqlt :: predicate >> expression < allany ( sub_query )
  208. @R predqgt :: predicate >> expression > allany ( sub_query )
  209. @R predqle :: predicate >> expression < = allany ( sub_query )
  210. @R predqge :: predicate >> expression > = allany ( sub_query )
  211. @R nnall :: allany >> ALL
  212. @R nnany :: allany >> ANY
  213.  
  214. ## in predicate
  215. @R predin :: predicate >> expression IN ( sub_query )
  216. @R prednotin :: predicate >> expression NOT IN ( sub_query )
  217. @R predinlits :: predicate >> expression IN ( litlist )
  218. @R prednotinlits :: predicate >> expression NOT IN ( litlist )
  219.  
  220. ## subquery expression
  221. @R subqexpr :: expression >> ( sub_query )
  222.  
  223. ## expression (simple for now!!!)
  224. @R exp1 :: expression >> term
  225. @R expplus :: expression >> expression + term
  226. @R expminus :: expression >> expression - term
  227. @R term1 :: term >> factor
  228. @R termtimes :: term >> term * factor
  229. @R termdiv :: term >> term / factor
  230. @R factor1 :: factor >> primary
  231. @R plusfactor :: factor >> + factor
  232. @R minusfactor :: factor >> - factor
  233. @R primary1 :: primary >> column_name
  234. @R primarylit :: primary >> literal
  235. @R primaryexp :: primary >> ( expression )
  236. @R primaryset :: primary >> set_function_reference
  237. @R stringlit :: literal >> character_string_literal
  238. @R stringstring :: literal >> literal character_string_literal
  239. @R numlit :: literal >> numeric_literal
  240.  
  241. ## set functions (nasty hack!)
  242. @R countstar :: set_function_reference >> COUNT ( * )
  243. @R distinctcount :: set_function_reference >> COUNT ( DISTINCT expression )
  244. @R allcount :: set_function_reference >> COUNT ( expression )
  245. @R distinctset :: set_function_reference >> aggregate ( DISTINCT expression )
  246. @R allset :: set_function_reference >> aggregate ( expression )
  247. @R average :: aggregate >> AVG
  248. ##@R count :: aggregate >> COUNT
  249. @R maximum :: aggregate >> MAX
  250. @R minimum :: aggregate >> MIN
  251. @R summation :: aggregate >> SUM
  252. @R median :: aggregate >> MEDIAN
  253.  
  254. ## dynamic parameter (varies quite a bit from ODBC spec)
  255. @R dynamic :: literal >> ?
  256.  
  257. ## column name
  258. @R columnname1 :: column_name >> column_identifier
  259. @R columnname2 :: column_name >> table_name . column_identifier
  260. @R tablename1 :: table_name >> user_defined_name
  261. @R columnid1 :: column_identifier >> user_defined_name
  262. """
  263.  
  264. nonterms = """
  265. sliteral
  266. exists_predicate set_function_reference aggregate
  267. sortspeclist sort_specification opt_ord
  268. drop_table_statement delete_statement_searched update_statement_searched
  269. assns assn
  270. insert_statement litlist colelt optcolconstraints optdefault
  271. optcolids insert_spec create_table_statement
  272. colids colelts column_constraint_definition
  273. column_definition data_type character_string_type
  274. exact_numeric_type approximate_numeric_type
  275. expression term factor primary literal
  276. comparison_predicate column_alias column_identifier table_name
  277. boolean_term boolean_factor boolean_primary predicate
  278. selectsubs expression alias sub_query
  279. statement_list statement select_statement alldistinct subselect
  280. select_list table_reference_list optwhere optgroup opthaving
  281. order_by_clause select_sublist
  282. optunion optorder_by search_condition colnamelist column_name
  283. table_reference table_name create_index_statement namelist
  284. drop_index_statement allany create_view_statement drop_view_statement
  285. optnamelist
  286. """
  287.  
  288. keywords = """
  289. INDEX ON ANY IN VIEW AS
  290. EXCEPT INTERSECT
  291. EXISTS AVG COUNT MAX MIN SUM MEDIAN
  292. UPDATE DROP DELETE FROM SET
  293. INSERT INTO VALUES CREATE TABLE INTEGER FLOAT VARCHAR
  294. AND OR NOT
  295. SELECT FROM WHERE HAVING GROUP BY UNION ALL DISTINCT AS ORDER
  296. ASC DESC BETWEEN UNIQUE
  297. """
  298.  
  299. puncts = """.,*;=<>{}()?+-/"""
  300.  
  301. # terminals user_defined_name, character_string_literal,
  302. #    numeric_literal
  303.