+from_clause: FROM from_list { $$ = cat2_str(make_str("from"), $2); }
+/***
+#ifdef ENABLE_ORACLE_JOIN_SYNTAX
+ | FROM oracle_list { $$ = cat2_str(make_str("from"), $2); }
+#endif
+***/
+ | FROM from_expr { $$ = cat2_str(make_str("from"), $2); }
+ | /* EMPTY */ { $$ = EMPTY; }
+ ;
+
+from_list: from_list ',' table_expr { $$ = cat_str(3, $1, make_str(","), $3); }
+ | table_expr { $$ = $1; }
+ ;
+
+/***********
+ * This results in one shift/reduce conflict, presumably due to the trailing "(
+ * - Thomas 1999-09-20
+ *
+#ifdef ENABLE_ORACLE_JOIN_SYNTAX
+oracle_list: oracle_expr { $$ = $1; }
+ ;
+
+oracle_expr: ColId ',' ColId oracle_outer