public final HiveParser.insertClause_return insertClause() throws RecognitionException {
		HiveParser.insertClause_return retval = new HiveParser.insertClause_return();
		retval.start = input.LT(1);

		CommonTree root_0 = null;

		Token KW_INSERT766=null;
		Token KW_OVERWRITE767=null;
		Token KW_INSERT770=null;
		Token KW_INTO771=null;
		Token KW_TABLE772=null;
		ParserRuleReturnScope destination768 =null;
		ParserRuleReturnScope ifNotExists769 =null;
		ParserRuleReturnScope tableOrPartition773 =null;

		CommonTree KW_INSERT766_tree=null;
		CommonTree KW_OVERWRITE767_tree=null;
		CommonTree KW_INSERT770_tree=null;
		CommonTree KW_INTO771_tree=null;
		CommonTree KW_TABLE772_tree=null;
		RewriteRuleTokenStream stream_KW_INTO=new RewriteRuleTokenStream(adaptor,"token KW_INTO");
		RewriteRuleTokenStream stream_KW_TABLE=new RewriteRuleTokenStream(adaptor,"token KW_TABLE");
		RewriteRuleTokenStream stream_KW_OVERWRITE=new RewriteRuleTokenStream(adaptor,"token KW_OVERWRITE");
		RewriteRuleTokenStream stream_KW_INSERT=new RewriteRuleTokenStream(adaptor,"token KW_INSERT");
		RewriteRuleSubtreeStream stream_tableOrPartition=new RewriteRuleSubtreeStream(adaptor,"rule tableOrPartition");
		RewriteRuleSubtreeStream stream_ifNotExists=new RewriteRuleSubtreeStream(adaptor,"rule ifNotExists");
		RewriteRuleSubtreeStream stream_destination=new RewriteRuleSubtreeStream(adaptor,"rule destination");

		 msgs.push("insert clause"); 
		try {
			// HiveParser.g:1907:4: ( KW_INSERT KW_OVERWRITE destination ( ifNotExists )? -> ^( TOK_DESTINATION destination ( ifNotExists )? ) | KW_INSERT KW_INTO KW_TABLE tableOrPartition -> ^( TOK_INSERT_INTO tableOrPartition ) )
			int alt231=2;
			int LA231_0 = input.LA(1);
			if ( (LA231_0==KW_INSERT) ) {
				int LA231_1 = input.LA(2);
				if ( (LA231_1==KW_OVERWRITE) ) {
					alt231=1;
				}
				else if ( (LA231_1==KW_INTO) ) {
					alt231=2;
				}

				else {
					int nvaeMark = input.mark();
					try {
						input.consume();
						NoViableAltException nvae =
							new NoViableAltException("", 231, 1, input);
						throw nvae;
					} finally {
						input.rewind(nvaeMark);
					}
				}

			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 231, 0, input);
				throw nvae;
			}

			switch (alt231) {
				case 1 :
					// HiveParser.g:1908:6: KW_INSERT KW_OVERWRITE destination ( ifNotExists )?
					{
					KW_INSERT766=(Token)match(input,KW_INSERT,FOLLOW_KW_INSERT_in_insertClause12143);  
					stream_KW_INSERT.add(KW_INSERT766);

					KW_OVERWRITE767=(Token)match(input,KW_OVERWRITE,FOLLOW_KW_OVERWRITE_in_insertClause12145);  
					stream_KW_OVERWRITE.add(KW_OVERWRITE767);

					pushFollow(FOLLOW_destination_in_insertClause12147);
					destination768=destination();
					state._fsp--;

					stream_destination.add(destination768.getTree());
					// HiveParser.g:1908:41: ( ifNotExists )?
					int alt230=2;
					int LA230_0 = input.LA(1);
					if ( (LA230_0==KW_IF) ) {
						alt230=1;
					}
					switch (alt230) {
						case 1 :
							// HiveParser.g:1908:41: ifNotExists
							{
							pushFollow(FOLLOW_ifNotExists_in_insertClause12149);
							ifNotExists769=ifNotExists();
							state._fsp--;

							stream_ifNotExists.add(ifNotExists769.getTree());
							}
							break;

					}

					// AST REWRITE
					// elements: ifNotExists, destination
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (CommonTree)adaptor.nil();
					// 1908:54: -> ^( TOK_DESTINATION destination ( ifNotExists )? )
					{
						// HiveParser.g:1908:57: ^( TOK_DESTINATION destination ( ifNotExists )? )
						{
						CommonTree root_1 = (CommonTree)adaptor.nil();
						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(TOK_DESTINATION, "TOK_DESTINATION"), root_1);
						adaptor.addChild(root_1, stream_destination.nextTree());
						// HiveParser.g:1908:87: ( ifNotExists )?
						if ( stream_ifNotExists.hasNext() ) {
							adaptor.addChild(root_1, stream_ifNotExists.nextTree());
						}
						stream_ifNotExists.reset();

						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 2 :
					// HiveParser.g:1909:6: KW_INSERT KW_INTO KW_TABLE tableOrPartition
					{
					KW_INSERT770=(Token)match(input,KW_INSERT,FOLLOW_KW_INSERT_in_insertClause12168);  
					stream_KW_INSERT.add(KW_INSERT770);

					KW_INTO771=(Token)match(input,KW_INTO,FOLLOW_KW_INTO_in_insertClause12170);  
					stream_KW_INTO.add(KW_INTO771);

					KW_TABLE772=(Token)match(input,KW_TABLE,FOLLOW_KW_TABLE_in_insertClause12172);  
					stream_KW_TABLE.add(KW_TABLE772);

					pushFollow(FOLLOW_tableOrPartition_in_insertClause12174);
					tableOrPartition773=tableOrPartition();
					state._fsp--;

					stream_tableOrPartition.add(tableOrPartition773.getTree());
					// AST REWRITE
					// elements: tableOrPartition
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (CommonTree)adaptor.nil();
					// 1910:8: -> ^( TOK_INSERT_INTO tableOrPartition )
					{
						// HiveParser.g:1910:11: ^( TOK_INSERT_INTO tableOrPartition )
						{
						CommonTree root_1 = (CommonTree)adaptor.nil();
						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(TOK_INSERT_INTO, "TOK_INSERT_INTO"), root_1);
						adaptor.addChild(root_1, stream_tableOrPartition.nextTree());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;

			}
			retval.stop = input.LT(-1);

			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

			 msgs.pop(); 
		}

		catch (RecognitionException e) {
		 reportError(e);
		  throw e;
		}

		finally {
			// do for sure before leaving
		}
		return retval;
	}