The Carnegie Mellon Vaccination Database Talks are made possible by Autotune. Learn how to automatically optimize your MySeat Core and PostgreSQL configurations at autotune.com. And by the Steven Moy Foundation for Keeping It Real, find out how best to keep it real at stevenmoyfoundation.org. Okay, let's get started. It's another vaccination talk. Today we're here with Harold Subcheck. He is a co-founder and software engineer at Starburst, one of the main companies that's backing the Trino project. Prior to that, he worked at Teradata because he was part of the team at Adapt, the company founded by Dana Boddy that got bought by Teradata. And then he started working on Presto, which later became Trino at Teradata. So, if you have any questions for Carol as he gives his talk, please unmute yourself, say who you are and ask your question. I feel free to do this anytime so he's not talking by himself. And we have to say that Carol is in Poland right now. It's 10.30 at night. We appreciate him being here with us. And we also appreciate him getting through this while sick. And I would say he is vaccinated. Okay, so my name is Carol Subcheck. Yes, I was one of the initial employees of Starburst. And I will talk about Starburst Trino query optimizer and the engine, how it evolves over time, what are the reasons Trino exists and so on. So, first I will go over the company overview, then I will go over the Trino overview, and I will go over the evolution of the optimizer and the milestones of how optimizer was evolving in the last years. I will also talk about other key features that we have, like dynamic filtering, advanced pushdown, and importantly, I will also talk about the current initiatives that we have for the future and for the current developments. So, the history of Trino actually starts in 2013, and even slightly before. In 2013, Facebook did open source Presto, and Presto was created as a replacement for Hive at Facebook because Hive was too slow. Hive Sympax was not the SQL standard. So, there was a project initiated at Facebook, which was then open sourced. Then, in 2015, Teradata joined the party and started cooperating on Presto. And I was part of that team. Then by 2017, there was 180 plus releases already, 50 plus contributors, 5,000 commits. Then at 2017, at the end of the year, Starburst was founded by the former employees of Teradata on Facebook. And then we had a couple of series of founding. We had an A-series in 2019, and we also had a B-series in summer 2012-20. We also had C-series, so we actually became a unicorn at that time. 2021 was also a year where we renamed rebranded from Presto SQL into Trino. So, here are some key employees that were part of the founding team. There's three gentlemen at the bottom, Martin Traverso, Dain Sandstorm, and David Phillips, who are the original creators of the Presto. So, on board, we have all the major contributors, and we also have the original creators. So, it's a very good team. Okay, so why actually Trino was created, right? I said that it was slower than Hive. That's true, but there is also another reason. So, if you look at the companies today, a lot of the companies, in order to get the data, to get some insights from the data, they have to create expensive ETL pipelines. So, for example, you have to have a team of data engineers and data scientists that create pipelines for you. That takes time. You have a lot of data duplication, so it's harder to know what's the golden source of your data, the golden copy. This is complex, so you can imagine that it might take for some companies a lot of time to actually get some basic insights. So, this is not perfect, and hence their Trino was created also. So, you can treat Trino as your single point of access to data. So, instead of creating ETL pipelines, you can actually set up your data sources within Trino, and you can query data where it lives. So, Trino is a federation engine. Also importantly, you can have a lot of data sources, but Trino is also a very capable distributed system which supports high-comparance, you know, massive scale. So, we also have a very good support for the lake houses. So, you can join your, let's say, some kind of remote data or some relational data from some relational data sources with your, let's say, newest lake house data. So, we put a lot of effort within the project to have good APIs for connectors. Connector is a component that essentially represents a data source. There is a lot of APIs that connector can't implement. Some of them are obligatory. So, what happens is that on the coordinator, there is a metadata API where connector can tell the engine to the planner what are the tables, what are the column times, what are the columns. There is also, you know, you can do access control this way. So, there is also, for example, data location API where you tell the engine where the data is actually living. And then on the workers, there is stream API which actually is responsible for reading the data from the data source. So, connectors and API are the first class citizen even for the distributed connectors like the lake house connectors like Hive Tables, for example, or AWS Glue Tables. That's also a connector. And here is an example. Here are the examples of the connectors that we have. Some of them are open source. Some of them are starburst connectors with some proprietary features like improved performance or improved security. You can see that we can connect to almost anything that makes sense to connect with. Yeah. So, but because of this federation approach, it has challenges. So, within a single engine, we have to deal with relational versus non-relational data sources. So, with this comes the complexity of managing different data types. Like, you can imagine that all of the sources, they have kind of same data types, but kind of different. So, one example would be the CMAL types, for example. We have some semantics within Trino, but some databases have a different semantics. We have to adjust for that. Another complexity comes from the fact that the storage is externally managed. So, we have to carefully craft the API for connectors to tell us what the storage is, like what are the properties of the storage, like partitioning or bucketing and so on. There is no such thing like building storage within the engine, like all of it is connected. Another difficulty comes from the statistics. So, as you probably know, statistics are very important for optimal performance of the engine. Some connectors provide better statistics. Some provide worse statistics. And we have to deal with them. Even we have to be able to make some decisions, even if the statistics are not that great. There is a problem with predicate pushdown. So, when you pushdown predicate through your relational data source, for example, Oracle, it might have a different collision than Trino. So, we have to adjust for that. A similar problem comes from the predicate extraction when the database describes the table. It also could be a problem of collision and so on. Yeah, we have a separate operator pushdown, which has to be modeled in a generic way across connectors. We also have advanced dynamic filtering, which I will get to later. Important thing is that we can do kind of a join pushdown between connectors. So, this is pretty cool because you can have join between different data sources like, let's say, high meta, high tables compared to a joint with the Oracle tables, and you can do simulated pushdown of join via the dynamic filter. So, I will get to that in the later slides. So, let's now go over the... Quick question. For those joints across different disparate sources, they all have to come back up to the Trino execution engine. You can't tell, like, whatever this data source has been dated directly to this other data source and have it do to join there. Yeah, I mean, join is still being executed at the Trino, right? But with dynamic filtering, we can skip a lot of data from the source. So, we can... There will be a slide where I'll show how much gain you get by doing that. So, we don't have to fetch everything from the source connector. We just can fetch the rows that are actually joined later on, right? So, this is a huge improvement. Okay. So, let me go over the major breakthroughs over the time that happened with the engine. So, in the early stage, early stage, that are the... This is the optimizer. This is how the optimizer looked like in the early days. So, every optimization we have was based on the transformation. So, the transformation is a visitor where you visit all of the nodes. If you apply some optimization, you have to traverse the plan to the place where the optimization happens. Then you rewrite the plan and all the nodes upwards of the node that changed. So, as you can imagine, this is expensive to evaluate. And other problems are that there are some optimization paths where you have to apply the same optimization multiple times. Or even, you know, undefined number of times. And because the transformations are expensive, it's not feasible to do. This is one of the limitations. Another problem is that... Yeah, I mean, it's hard to add new operators because if you add a new plan node, then you have to rewrite all of the optimization rules. You have to add the support for the visitor in all of the optimizations. This is really painful. But, you know, transformation based model has some advantages. So, it's easy to compute properties because it's a simple recursion. So, we go down the plan. For example, if you want to compute partitioning properties, you implement a simple recursive visitor and you go down and evaluate what's the property of a given plan node. So, that's simple. So, this is an example of the case where you would like to apply the same optimization multiple times. And it's kind of not deterministic how many times you would like to apply the optimization. So, you have a simple join, for example, where between two tables, table A and table B, on table A, A.x has a predicate connector can tell you that values for A.x will be greater than 100. So, what you can do is you can apply predicate pushdown. So, you can push this predicate the other side of the join. So, now you can say B.y is greater than 100. So, that's good. And then what you can do is that you can actually push down this predicate the connector itself. Now, what can happen is that the connector that provides table B can actually tell you that the predicate is actually narrower. And this might happen, for example, when you have a partition table with a lot of partitions. What we usually do is that we avoid enumerating all of the partitions at the planning time without any predicate, because that's expensive thing to do. But once we get some predicate, we can actually enumerate the partition. So, it might happen that, you know, the predicate for B.y is actually narrower. And you might apply predicate pushdown again. And then you can push the same A.x greater than 200. You can push it down to the left side of the join again. So, there might be multiple steps like that. It's hard to define how many times the transformation should be executed. So, again, another neat thing that was really in 2016 was the equality inference. So, example of that is that, again, you have a join. You have a rather complex filter on top. A.x applied to F, applied to G. And join itself can be complex like it can be, it is a function on the left and column reference on the right. So, with a predicate pushdown, you can actually push down the filter, the original filter to the left side of the join. However, you can also push down modified filter to the right side of the join because you can derive more actualities. And you can say that B.y applied to G is actually the same as A.x applied to F applied to G. So, we generate this cloud of equalities and try to derive, let's say, transitive predicates this way. So, what happened also in that year, that was mainly driven by TRA data. We were adding support for different types. So, we added support for character types, load, decimal, for parametric types. And very importantly, we added support for collated subqueries. The goal was to have a support for full TPCDS, TPCDH query suite.  So, we really, we had support for all the query security as compared to competition. And we still progress, right? So, that we added some support for collated subqueries. At that time, we continue adding support for different more trickier say collated subqueries. There were other kind of neat things added in the recent years. So, this is still moving forward. Okay, at some point, in 2016, we switched to rule-based optimizer. So, instead of transformations, you now can define the rule where there is a pattern. The rule is applied to a plan node that matches the pattern. The pattern can be quite complex as you see here. And this has this advantage that now you can execute rule multiple times as long as they are needed, because they are quick to execute. You only change the subset of the plan. You don't have to modify the entire plan. You only apply the rule locally. And it makes it easier to add new plan nodes because the rules don't have to implement the visitor. Yeah, but those are the advantages. These advantages is that it's harder to evaluate properties. So, let's say you want to check what is the partitioning for a given plan node. With transformations, you could do the simpler recursion with the rule-based approach. You have to be more clever about this. There is a concept of trades and propagation rules. So, we still don't have the concept internally of trades within the Trino. This concept will be required once we move away from the greedy optimizer. So, that's another thing. Right now, our optimizer is a greedy one. So, once you apply the rule, that's the way you go. We don't keep the old version of the plan in memory. So, that could have an issue that we might end up with a suboptimal plan globally, even though it's optimal locally. And this is an example. So, on the left, you have a sub-join order. On the right, you have sub-join order. Okay. Globally, locally, the left-join might be better, joint order. But if there is some kind of a group by or aggregation on top, it might be better actually to do the right version of the plan because there is a different partitioning at the end of the join, on the top join, right? So, there is a partitioning of data by a.x. So, if you have an aggregation on a.x, you don't have to resuffle data again. So, this is why we will probably move to the non-grid optimizer in the future. Okay. So, then in 2017, there was a cost-based optimizer at that. Also, that was our little data office initiative. And, yeah, I mean, our join reordering algorithm can do, works on statistics and costs. And we choose, we switch between automatically, we switch automatically between repartitions versus broadcast join. We also change join sites. We also have a full join reordering support, so we can generate bushy trees. We work on statistics. So, mainly we work on number of rows, number of distinct values, nodes fraction, mid-max, average data size. From the statistics, we compute the cost of CPU, memory, and network. And we compare, we compare plans and choose the plan with lower cost with some weights applied to different, to the CPU, memory, and network. So, yeah, this is an example of how the filter estimation works. How do you pick the weights that you apply to CPU, memory, and network? It's an arbitrary one. I don't recall the, well, it's not really arbitrary, sorry. I don't recall the exact values, but we put phases on the CPU. So, if I recall correctly, I would have to check. But mainly presto query performance is mainly limited by CPUs for 3DOS, sorry. So, by putting weight on CPU, we choose plans where we have to do less computations and choose reduce wall time. So, yeah, I would have to check exactly, but I think we've the biggest weight from the CPU. Other than that, it's, what? I guess the question is like, maybe Tim's asking this, like, I guess what percentage of the queries are using the different connectors that are going at these other different databases, versus like the Trino native storage? What percentage could you, could you elaborate a bit more? So, like, so we have a connector for single store, like, and so, how often are people trying to federate queries across single store and then, you know, F3 buckets or something like that. And I guess maybe, maybe Tim's not asking this or I'm asking this, but like, single store is almost like a black box for you guys. How would you account for CPU of whatever single store is going to do? Or are these weights just put in the Trino based operations? So, so it's more about the cost of the join really. Okay. We have now support for the operator push down, but I don't think it's at the discretion of the connector to push it or not. So it's not expressed in them. Like Trino does not compare the plans with the operator push down to the, for example, relational database. We assume that by pushing things like aggregation down to relational data source, we will reduce the cost overall cost of the plan. Because you reduce the amount of data that is being transferred over the network. So what happens in practice is that while, you know, once we start extracting data from relational database, for example, Oracle or other data, for example, in a distributed way, those databases tends to put high cost. They getting the data from them is actually quite expensive. So if you can reduce the amount of data that is being produced by the connector, it's good by relational connector. It's good for the data like those connectors like high data, high tables. It's more about joint order. So there you scan the same tables. This cost does not change. The cost changed once you start reordering the joints. Right. So it's more about that. Okay. Okay. I'm going to repeat just saying, if it's connector, you don't account for CPU costs. It's just like how much data transfer coming out of it. Yeah, that's, that's, that's, yeah, that's, that's an empirical experience. I would say yes. Maybe what Jim is asking me does, okay, for the Trino operators, you have these arbitrary weights. It sounds like they're set by hand. You're not like running like dv2 runs micro benchmarks to figure out what the CPU cost is. You're not doing any of that. That was quite a long time ago, but I recall that we were on the benchmarks and we tried different weights. The weight where you put the most on CPU is the best one for, for let's say TPCDS, TPCH, TPCDS, TPCH. I didn't, but to be clear, like that. It's a, you ship Trino with that value hard coded as a, it's a, it's a knob you can tune, but it's not like it turns the system. Yeah. So it's like in dv2, you turn the system on, because the IBM people here, they can correct me. You turn dv2 on and it runs micro benchmarks on your CPU, almost like VogoMix to figure out what the weight should be for the cost model. So, so there is an idea. It's not, it's not in progress yet, but there is an, actually I will talk about this in the future, future initiatives. So you can actually improve statistics. For example, by computing the, collecting the data from the queries and comparing the statistics for the plan against the actual statistics of the query, right? So now you can actually have a better model where you can apply some techniques like, I would guess linear regression or things like that, where you can adjust this weight so that they match reality for the particular customer. The question is how much you gain from that really in practice versus the heuristics. But, but yeah, that's, that's an idea and that's actually quite interesting project to work on. It would be, so, so yeah, what we, it cannot easily like statistics are, are not, to get the actual stats, you have to run the query, right? So statistics are just an approximation of the reality. So hence, hence you will need this weights. However, you can apply this weights, you can change this weights according to the workloads of the customer, for example. But for this, you need to have the history of the queries. You need to have this, this algorithm. So this is, this is really something we've been thinking of. Yeah. Is that, does that answer your question? That's my question. Yeah. Sorry, I had your question. So if you're satisfied, that's good. I say, let's do what you're describing Carol. Also something like DBQ Leo, the learning optimizer stuff from 20 years ago. Okay. Yeah. Like a lot of the techniques here are, yeah, they come from, from past. Yes. I'm not saying like, oh, that's a bad idea. Don't do that. Like, or IBM, but you can't do it. I just think like what you're describing is pretty similar to what IBM had done. Yeah. And the difficulty here is that we are operating on a further rated environment where we miss some data. So from the connectors for the, for example, so in reality, sometimes some simpler approach works better than the more sophisticated one because, or maybe as good as the more sophisticated one.  So sometimes simple techniques work good enough. Okay. So like, let me continue. So this filter estimation, for example, what we, here is an example of if you apply a filter or item greater than zero, what you keep in the stats is, okay, there might be 61 million rows, but we know that item cannot be known. Similarly, if you have a filter item equals to 106, 106, 106, 107, then you might learn that there's only 3,000 of rows and one distinct value. Similarly, when you have in clause that could be 6,000 of rows and two distinct values. So what we do is that one of the optimizations we do is that we choose join type. On the left, you can see that both tables are reshuffled, but one table is really small. So our CBO will actually choose broadcast join type and the left table doesn't have to be reshuffled anymore. This is a typical situation for dimensional tables, for example. So yes, you save a lot this way. A lot of CBO, a lot of network. Similarly, you can choose the small table to be the right table because the right table is kept in memory. It's an index for the join. So you want the small table to be kept in memory. We do full join reordering. What usually happens is that the biggest table on the join that does not filter on the data will be on the top because if it does not filter on the data, it will increase the volume of data. So it's better to put it after all of the filtering. So here the line item table is left on the left on the top most join. So it's not in memory, not being kept in memory. If you apply a filter to line item table, then it might only produce 3,000 of rows. So then it becomes right bottom most table and then customer table on the top here. Yeah, so this is how it will work. We also support the full bushy trees. So usually, some engines, I think they only do deep, left deep or right deep join orders. We do support bashed bushy trees, if that's better in terms of cost. And CBO was a great breakthrough. We decreased increased performance by an order of magnitude. Yeah, that was the first great improvement. Yeah, but like I mentioned before, accuracy decreases with planned depth. If you have more complex plan than the more operators, you have to, for the more operators, you have to compute stats for the error increases. And that's one problem. Another is that some connectors don't provide accurate number of distinctive values, which is essential for computing filtering ratios. Sometimes we only know table sizes. So what we can do is that we apply different techniques to deal with that. We normalize statistics. If, for example, stats say that there is more number of, more distinct values than number of rows. We cut number of distinct values. We assume predicates are correlated. We assume distinct values match. Correlated predicates mostly for join. We assume that I will get to that next slide. We also can fall back to table size, statistics only for join type side selection. So yeah, so we assume distinct values match. When you write a query where you join by two columns like A dot X equals to B dot Y, we assume that the table with smaller number of distinct values that from that table, that distinct values will have a corresponding match on the other side of the join. And this is based on the fact that when user does join table, he really means to get some data. So we assume that there are matches instead of not having matches at all. This is the only reasonable thing to do. We also assume that the predicates are correlated for join. When you have a join with two equic clauses, this is example for one of the DPCS queries. What we do is that we assume they are correlated. So we choose one of the clauses as a driving clause and we compute filtering ratio for that clause. And we also have other auxiliary clauses and we apply constant filtering coefficient for those other clauses. So this gives better results in forward. This results in better plans and this is again, this is an example of this simple yet very efficient optimization that works good in practice and it's not too sophisticated. So there is plenty of such things. Another important improvement optimization is that when you don't know the statistics, detailed statistics of the table, it might be that some connector does not return table size at all but the other does actually say the other connector tells you that the table has 100 kilobytes. So in this example, there is a join with table B which has a size of 100 kilobytes. The size of the other table is unknown. What we do is that we, since the B table is really small for a typical Trino cluster, we choose that B table to be the build side of the join. It is on the right side of the join. This is a big win often because the join is replicated and also we can derive dynamic filtering, dynamic filters. So runtime predicates if there is not too many distinct values. This helps in practice. Some customers don't collect statistics. Like statistics, you don't have to assume but sometimes statistics are not updated. Some customers might not analyze frequently. There might be new partitions with new data and you might not get statistics for this. So we have to deal with these edge situations. Okay, so another big breakthrough was adding dynamic filtering. So dynamic filter is predicate that we derived from the join from the right side of the join, from the build side, from the index. That happens on the runtime. That predicate is then being pushed to the left side of the join either to the streaming source or to the file admiration of the connector. So dynamic filtering is an umbrella keyword. There is a lot of techniques behind that. There is a non-local dynamic filtering. There is a partition pruning. There is dynamic profiling and there is awaitable dynamic filters. One important thing is that the project was driven by community. There was, I think, three companies involved. So this was a great example of the community-driven work with the cooperation from the different parties. So what we added first was the support for non-local dynamic filtering. So once you have a join and join operator is running from the same node as the table scan, what you can do is once the join gets the index, so data from the right side, you can extract predicate from that build side of the join from the index and push that data, push that predicate to the table scan on the left. All happens within a single node. And this helps with stripe running in RSE parking files. So parking and RSE files have internal indexes and you can apply predicates on them to skip data within these files. So there was some improvements from this. It was not that dramatic, but there were some queries that improved. Then we added support for dynamic partition pruning. So similarly, you collect predicate at runtime from the join build side. Then the predicate is being sent to the coordinator. The coordinator then propagates the filter to the left table scan, but it gives the filter to the split enumerator. So split enumerator is an API for listing, let's say files from the table. So if you have a connector that has a partition data, it can take the predicate, it can completely skip the partition, completely skip the files from the partitions that won't be read. And this is a huge win. This was a big improvement compared to what was before. I would say that was in total comparable to maybe CBO. A lot of queries improved a lot. This is like a zone map where there's some metadata about the partition that says, I know there's nothing in here that I need. So if you have a lake house connector, for example, because dynamic partition pruning works mostly for the lake house connectors, they know the structure of the tables. They know the partitions, they know the values of the partitions. Once they get the dynamic filter, they can apply it to the partition listing. So they can skip the files completely. So you don't even start processing the files in the nodes. And one of the reasons dynamic filters were improved over time, we reduced the latency of how quickly dynamic filters are populated to the coordinator. We also added a feature for, we also added the way to wait for dynamic filters, so awaitable dynamic filters. So now a connector can actually wait for the future when the filter is ready. And this is important for relational connectors. If you have Oracle connector, for example, you only have one chance to apply the filter because the way we read data from the Oracle connector or other relational connectors is that we submit a query to the source database until we get the data, right? So we can do this only once. So connector can now wait for the filter for some predefined amount of time. And once the filter is ready, it can improve the query that is being submitted to the source database. And this is an example of how Oracle connector did improve. Yeah, I mean, that was a huge improvement for the federated case. It's like a night and day for some queries. Like some customers, it actually, it was, some customers have like, we have a support for distributed connectors, distributed relational data sources. But the thing is for some customers, I think this was the chance some queries from hours to, I guess, minutes or maybe less. So this was an enabler for the federated case. But does that sometimes make the queries that you push down just enormous, like within clauses that are hundreds of thousands of elements wide? No, no, no. We have a limit, very low limit, actually, on how many individual values you can push. So I run benchmarks on that. At some point, if you push the money values, you might get some regressions if you don't utilize dynamic filter. So when I was tuning this, I set the threshold for waiting for dynamic filter and the threshold for the size of dynamic filter so that there is no regression, to get huge gains. Usually it's quite low. But the thing is, if you pick our case, you have data partitioned by dates. So I guess that's the most common case you have. And what happens is that once we, while we build, while we detect the dynamic filter is too big, we actually simplify it. We extract the min-max range. And since the dates are incremental and they are kind of nice for that, you can still get a huge boost. And just that case is a normal scale. So you don't get a regression, but you can get huge gains. And there are some ideas how to potentially improve this for large dynamic filters. You could create a temporary table. But for now, it's enough that what we do here. Thank you. So another big improvement was the advanced predicate pushdown. Before 2019, we had separate predicate pushdown on column pruning. Now we have support for operator pushdown, projection pushdown. We've had the reference projection. I will get to that in a moment. We have a support for limit pushdown, aggregation pushdown, joint pushdown, column pushdown, and it's glowing. Aggregation pushdown is again, probably one of the more important in the pushdown for the relational connectors. Here is an example of the reference pushdown. A typical case for the lakehouse storage is that customers keep data in structure types. The structure types are stored. The structure data is stored in Parque for RSC files, typically Parque. Parque does keep the structure types. Let's say it's a row type or a map type. There are actually vectorized data with Parque for, let's say, key and values or for each row column. So with the Parque files, there's only vectorized data. So what we do now, if you write a select call.field0 from table, we will pushdown that projection into the connector. So connector can now skip loading of the entire structure, but can only lead that particular field. So this is an example. The projection that will decode only field zero from the structure type. There is a table scan that reads the entire structure column. But after projection pushdown, there is the table scan which produces field zero. So we don't read all of the structure blocks, let's say. This is an example of API of the projection pushdown. What is important is that we carefully design the API so that we don't really expose too many details about the optimizer to the connectors. So we have an abstraction called the collector expression. Right now it's either a call stand, field the reference or a variable, which is variable is essentially a column reference. But the way it's done, it makes us easier to change how the optimizer works, how we model the plan internally. So it's a good thing to do. We don't have to deal with the backward compatibility too much here when we change optimizer. Okay, so what we are working on right now and what we will be working in the future. So there is a couple of interesting projects here. So for example there is an idea for caching. We actually started working on that. So what you can do is that Trino now has a separate materialized use, have an API for that. We actually at Star Wars have implementation of materialized use. There is also an idea to have caching of the intermediate results of the plans. What you can do is that you can if you have a query, there is a query on the left here join that can also be just part of the query of the bigger plan. What you can do now is that you can compute the signature of the join here of the plan that starts with the join here and you can compare that signature against let's say cached data and if you detect that signature matches you can actually replace your entire plan section with the already pre-calculated data. So in this case let's say signature matched with the plan signature A which is a cached table A and that could be a join from table A and table B. However you can see that there is no filter here and there is a filter here on the left. So what you can do is that you replace that entire plan with table scan on A and filter on top and this can be this is a neat trick you can do caching between queries you can create materialized views like if you are a data engineer you can create materialized views from your federated data or maybe from expensive lakehouse queries where you immediately take advantage of the performance boost this way because your data is already you kind of transparent cached your data for your use cases. So another project we start. Your materialized views though they can't be automatically maintained right? Somebody has to say go regenerate because you they are maintained automatically right now. So we are thinking about you can define the schedule you can define incremental non-incremental materialized views we are thinking about having a full CDC so the change detection API even tree nodes but they are someone inserts into postgres and that's a connector and I gave a trigger set up to tell tree node this thing got modified you guys you'd have to refresh manually oh yeah I mean that's one way to do that but there is also I would say maybe a simpler solution but since you are upgrading you are keeping some state of your materialized view you know what state it is what data is inside so you can do a union between your source and your materialized view so what you only read from the source is the hottest new data until you merge that we've already cached data so this is another thing we have on the table we will see where this goes we kind of apply that work based on what customers feedback we can do that we don't do that yet there is materialized views depending on the schedule there might be some lag right now another project we started we started the project to improve fault tolerance for tree node for longer workloads, longer queries and as part of the project there is fault tolerance will be implemented as a you know you add temporary storage you don't stream the data directly between operators between stages you have a temporary storage now where you keep the data for the case if something fails so because you keep the data in the storage you can now apply multi-stage planning because you know you now know what the data shape is you know the statistics so you can for example change the join type change the flip the join sites for example so you can do this planning in a incrementary this is also a neat technique yeah and we have plans for improved statistics so there might be cases where there are some outlier values which are very frequent so you might want to treat them differently you might want to detect correlation between columns another example is that if you have partition data in connectors in lake house like if typically you think like you or Hive metastar keep statistics per partition so it's hard to compute the number of distinct values for the for the entire table so you might want to apply some extra techniques to be able to compute the number of distinct values for the entire table even though you have just a sample of partitions let's say that could be hyper log log algorithm for example and yes it's not mentioned here but question this is Rebecca Taft from Cockroach Labs I was just wondering if you could talk a little bit about how you plan to determine correlation between columns I think I remember you said earlier in the talk that you currently assume that columns are correlated so does that mean you basically take the lowest selectivity predicate of several predicates and just use that as the selectivity of the full predicate or how are you doing that today and how are you planning to change so right now we take the auxiliary clause and the driving clause and the auxiliary clauses and we try different driving clauses we take the plan that produces the least amount of rows as you said for the correlations there is the histograms are on the plate but there is also a way to you can compute the things like the Pearson correlation between columns potentially so this is still in the planning so we will see but histograms are expensive essentially right so if you want to do computations of your statistics on histograms essentially what you have now is one histogram if you add 10 histograms then histogram with 10 values you multiply your computations by 10 which might affect the planning times you mentioned driving columns and auxiliary columns can you say again what that means so for the join we have a join statistics calculator the question is what is the output row count of the join if you have more than one equicondition you pick one you compute the filtering factor for that equicondition because if you know the number of distinct values if you know the number of distinct values for the left and right side of that equicondition and then there are other equiconditions auxiliary equiconditions so for this we don't compute filtering factor anymore based on number of distinct values but we apply the constant coefficient which is 0.9 today with the assumption that if user writes the join where it has multiple equic clauses it's usually the equic clauses are correlated that's the idea thanks okay so one more thing is that we are slowly thinking how to move to the exhaustive optimizer this is this is this is tricky but at some point it will be required right now if you add exhaustive optimizer you have to have good statistics always like maybe not always but it's more important even more and you might put some more it may cost more time to choose the bigger plant choose the better plant because you evaluate much more combinations so we will think about this so thank you for listening if you have any questions let me know I will applaud everyone else so we have a few better questions if you have any questions please unmute yourself and fire away so any issues let's go for it yeah so this is Samit I had a question regarding do you use any kind of semi-join so you went to the left side and you pushed the predicate on the right side but it can be actually blue filters as well yeah so we could convert tenor filters into blue filters yes this is again in federated case it's a little bit trickier because different lake houses for example have different format for the blue filters so once while you collect this blue filters at the run time when the engine you have to choose between which passing functions you want for example so this is open door still regarding semi-joins we actually switch to we have a semi-join implementation yes but we switch to we actually convert semi-join to join now to inner join now where it's a filtering semi-join so sometimes you have to have a semi-join that doesn't really have to be a semi-join can participate in join reordering the other thing is that we can derive dynamic filters we actually derive dynamic filters for semi-join too but mainly for the for the for the for the for the for the for the for the for the for the for the reason of CBO and to join reordering we try to avoid semi-joins yeah yeah I got it I mean the advantage of blue filters at the amount of data they pass is very very small and in fact you can make that one to be symmetric it's called zigzag join that is you go from the left form the blue filter go to the right apply it form another blue filter bring it back to the left and then finish it now most of the rows that you're like retrieving will be in the output because you delete symmetry on both sides so left teaches the right and right teaches the left that's a very small amount of data yeah yeah that's that's true so this is like I like I said dynamic filter is a never-ending story dynamic filtering like you still have a lot of you can you complete something there is two more doors open and you can improve here and there like so it's not finished yet I would say yeah okay thank you anybody else so I guess Carol I maybe I missed this like the join reordering that's pretty much the only place we're doing the cost based optimization like are you doing a sounds like you're doing like a bottom up approach instead of a top down approach is that correct uh we actually do the uh yeah it's a it's a bottom up approach I think yes actually like the system the actually right so what what happens is that we know we have a list of source tables and the algorithm works like that that it splits the the set into and then applies join reordering to the subsets so it's actually I think it's a top down approach yeah it's a top down approach but with memorization so okay I got one more question if you don't mind yeah so have you done any comparison with Dremio or you know the modern redshift well I don't know about redshift but we did comparison yes comparison Hamid that's a loaded question like is it faster like what do you want them to say like I think we are faster we pushed for the performance recently in recent spotters and we had some good gains so right now I think we are faster yeah also Dremio has the problem that if I recall correct me if I'm wrong I don't think it runs all of the queries from the TPCH, TPCDS dataset so we cannot fully compare just products still so Dremio talk is November 22nd so you can come and complain to them yes I know so I have two professions you guys are uniquely positioned to that you have data about the accuracy of the statistics of all these different data sources that you have connectors for like I understand somewhere like I'm reading from S3 buckets and the data files are static but I'm thinking like you're connecting to my SQL or Oracle Postgres single store all these different data systems out there that maintain their own statistics and you're basically trying to extract them out and use them in your own query optimizer right so I guess the first question is do you control when you call Analyze on those other systems no we don't have we don't do that and then so that means that also across all different queries that are running the starburst cloud platform not the if someone's on prem you don't have access to this but on the cloud platform people are probably connecting to everything so you could then potentially keep track of over time which these different database systems are actually have you know are usually wrong about their statistics yeah I mean I think in the direction it will evolve into is that you would have you would provide set up your data sources but transparency behind the scenes what will happen is that we will actually you know as a user you would be able to tell okay I want to cache this data or maybe we cache it for you automatically so even though because the problem with the relational data sources is that they are often slow and sometimes people don't want to have the load on the source database like there are data right because they have other production workloads there so if they want to offload from from such databases they usually want to move to Trino but in such a way that they can reuse the existing queries so they want transparency and here comes the technique of materialized view or the caching of the results or what else so people are using this the federated aspect of Trino to get additional usage out of their existing databases as a on the path towards migrating off of that one typical example is that some typical example is that people want to move from the companies want to move from the some of the classical databases like no for data possibly it's not necessary but like this big analytical box like the fridges and they but they have production workloads there so they start doing that by plugging Trino first and then they move workload to Trino but as they move workload to Trino more and more they put more pressure on this on the source and they so we want to we want to enable them to move even more workload to Trino so I think they start simple by just connecting your source and then they apply different more techniques and this is mostly I guess for on-prem customers in the cloud what will happen is that we will manage this automatically for the customer to make it a comment that I think you guys have a very interesting data that and as a researcher if there's something public you can share about that again just say not for any individual customer across your entire customer base care data has the best stats or you know or has the best stats like there's one paper that shows who has the best stats for a single node you know workload but across all different customers I think that would be actually super interesting okay yeah the thing is you have to the thing is you have to we probably could do that actually but there's also always a problem of collecting this like does customer allow us to collect this information right so on-prem it's hard in the cloud it would be easier yes in the cloud yes not on-prem okay all right cool


Everybody forced tier ripping 2022 Donor's optic football hobby 12 bucks full case number five random divisions Find the results on your screen anytime elite in sports cards.com. Let's get started I don't know sander that sounds like an awesome card to pull. I wasn't even thinking about it till you just said it Here we go y'all. I think I would do spoon. I think I would go spoons as well You can't eat cereal with a fork, dude You can't stab someone To 99 mark, he's brown NFC West on the red you can drink My house Aaron Donald Christian Watson The debate is you can only use one for the rest of your life and you can't use the other forks or spoons Mahomes to 299 Aqua AFC West at the Ketia. That's a good point. That's a good point about you able to drink I'm up in the air up in the air Don't think about it Xamera white rated Ricky pink velocity to 79 for the AFC West You don't need them if the you can just pick up the steak with your hands William Perry NFC North signature series refrigerator Perry. He'll he's happy I'm not saying fork all day forks are dumb, dude. Who needs forks? Just pick the steak up Yeah, half the time I go into my fridge and get something like a leftover. I'm just like it's like potatoes I'm just like At 179 McCaffrey NFC West and my own house, I guess if you're worried about getting weird looks when you're out to eat I just I just pick up a flame and y'all with my hands and eat it like like a donut. I Guess that might be something to think about but Either way, you're gonna have to accept something right you have to accept looking weird at some point in life Hollow Ben Ralthusberger, AFC North. I don't need a lot of cereal. I'm not really worried about cereal What you told me? He's a menace Pasta dishes and pasta dishes are the one that that is like the one right there That that's like the biggest argument for forks. Hello, Aaron Rodgers NFC North in my opinion. It's not anything else It's it's it's like pasta things like something like that Yeah, you can sell your shops as far as I know. I didn't seem like it. I wasn't said she Shannon Sharp Jalen Petrie Exactly Jordan. Thank you.  You just got to be careful You don't Bateman AFC North to 25 Black Pandora Silver circles Michael Pittman, Jr. to 125 AFC South sauce Gardner We've all done that we've all done that it's just like dangerous game if you get a little too careless Not gonna be having a good time. Troy Anderson NFC South rated rookie hollow Aqua rated rookie Isaiah Spiller AFC West every time my wife sees me do it. Dude. She gets mad. I get it, but It's one more thing to wash Right a rookie orange Christian Watson out of 199 NFC East Silver circles Cooper Cup NFC West to 125 lime green breeze haul nice one there 28 to 35 AFC East rated rookie nice breeze I Think I think pasta is the one that's gonna There you go your record to a 299 AFC East rookie on the Aqua there you go Mike. Yeah I don't think my wife feed me with a fork I'm sure that'll go over super well. Yeah, I am not feeding with a fork a dinner No, we're not going to Thanksgiving and me feeding you. I'll create a rookie Lewis scene Or the NFC North the 99 on the auto Yeah, if I can if I'm allowed to use chopsticks, and yeah, I just bring it You'd have to bring your own chopsticks with you to like Italian restaurant chop it up Like a baby Silver circles Kyle Hampton 125 AFC North Sam goes on Okay, so eating okay, that's that's a good thing too because you need a lot of spoons while like cooking especially Like Jordan ass. That's a good. That's a good question. Hello Montana NFC West everywhere. We're getting deep in this now We're thinking about it Eat spaghetti with tongs. Yeah Maybe I will do go spoons. Maybe I will go spoons. I don't know Can I try a week with both?  That's that's a great point too. You can do a lot with chopsticks So 65 Mike will AFC West Bailey Zappie on the Mike Williams Had to do it one time We should get something that actually shocks Sam every time one of those comes up I'm totally down. Awkward at 299 Antonio Gibson NFC East Just like a little bit just to where you feel like ah like ah dude. I hate that Hala Rederkey Alante Taylor NFC South Orange to 199 Mike white AFC East Make your own chopsticks Now we're talking about if you would use Forks or knives for the rest of your life for for eating food for consuming food, but you can't use the other so just one of the other Blue to 179 Warren moon for the AFC South. That's true. A lot of places don't even like you spoons because Like you're using your hands for certain things like that it's not a bad point Hollow Mahomes for the AFC West do when I went to an Indian wet in any new wedding one time They were all you do like their hands like the like the non stuff. I'm like, yo, but they're like so clean I'm like there's no chance like If I were to attempt that I was like I can't attempt this I need to have some work because like if I do this without kind of like, you know, that's a field thing man Yeah, Aaron Rodgers came on tip-a-doh It's it's impressive impressive dude, I don't even want to start talking about actual food now because I Could eat probably six pounds of naan right now Give me some garlic naan with some sort of chutney. I will devour just eat not alone I would just eat just eat it all Danny Gray Exactly most place settings are without a spoon Just go to our silver circles of 125 Dak NFC East That's exactly right Especially like nicer restaurants now if it's like really nice you have like Like a teaspoon like a spoon there by default But usually that gets taken away about based on what you're ordering. But yeah, exactly retro Kurt Warner point still stands Brandon cooks to 179 AFC South Dude, we got to stop talking about delicious food. We got to stop. I want to keep talking about it. I love it It's 299 Evan Ingram for the AFC South on the Aqua Now we're now we're talking about it now we're talking about it Brutal Bob Lilly NFC signature series orange to 199 Dexter Lawrence NFC East Garrett Wilson quite Walker Do not send us any Indian food from a pocket. You'd not do that. Hello, Quandre digs NFC West. Please do not Sean's you need some Bowman base cards He's gonna eat the play mat. Oh my god I'm stuffed. I just had three top loaders. Yeah, hollowed to Marcus Lawrence. He's kind of walking the third That's a good one. If you had to eat something in this room, what would it be?  That's sick. What's up eluces loose it's been a minute All right illegal go on Google Maps and Name me an Indian restaurant in a popka orange to 199 Marquise Brown NFC West Calvin Austin the third Ice again Tony Pollard NFC East this time to 15 RB one Tony Pollard electricity rated rookie AFC South Hassan Haskins to 65 Paula ran a rookie Lewis C in NFC North Sam Howell red the 99 G Kobe Myers AFC East Yeah, I can get on board with that for sure sander that that offense is gonna be really good again And Pollard's gonna be a big part of that.   I Can't be trusted with things like that because I will probably do something like that I will go for the joke over like the sentimental Tandoria road to hut five stars on yelp Where in what what road is it on? Is there like an address? You don't have to give me the whole address, but like what's the street name aqua marino to 299 The AFC East because if it's not like downtown apopka, and it's like farther throw like out to it I probably trust it, but if it's like downtown apopka don't don't you dare How far away okay, how far away for is it from the shop? That's a good question orange 199 there Kenry AFC south Jeremy ruckards 22 of 50 rated Ricky pink velocity auto AFC East Darius ruckers So it's not an apopka gotcha Silver circles Gonzalez to 125 AC West while Tandori And a roti hut sounds like it could get tore up one time Orange JC horn to 199 NFC south If it's got good reviews, and it looks like a hole in the wall. It's probably the best place I've ever eaten See how it works You walk in there's like two tables Steaks, there's always it's always an old an old lady cooking Because she knows how to make that issue. I mean Hallow Eddie Jackson See a man. You have a good one man Diamond hands DK met cap NFC West One of the Mexican places I go to an Okoe it's like I think it's the guy and his wife They're probably like their 50s or 60s, and they're always both back there to 179 Jalen Hertz NFC East You've got to really love someone to be working in the kitchen with them all the time. That's uh, yeah Red Kobe Bryant to 99 rated Ricky NFC West exactly That's a good point. I don't sleep as it is so I don't think I can have a kid Oh nice rated Ricky hollow Brock Purdy for the NFC West Very nice Purdy. That's pretty good.  I don't know if there is one here Jordan Or maybe maybe I was thinking crazy, but no I have not aqua 299 to Sean Watson a FC north favorite Indian dish That's a good question Sam would say Schmeck Gunk favorite Indian dishes that that's a tough question to answer Got a hollow David Montgomery to 299 for the NFC or aqua to 299 AFC NFC north here at Wilson There's rich I told you I told you he was gonna see it tonight guys.  I'm joining the the LSE swim team. Yeah Do something about the alright the glare is not that bad Hollow Carson Palmer AFC north how many glare jokes anything I've read in the past the past 30 hours in this stream ice The Marge Jackson light it up. That's nice. I nice ice to 15 13 to 15 on the Lamar AFC north McBride rated rookie throwing off the white balance.  That's a nice Jerome Ford rated rookie Black Pandora at 25 AFC north cool one That's that okay, this is it. This is insane. This is this is unreal This is outrageous silver circles to 125 Tom Brady for the NFC South You all are gonna get Combos in your random team rakes from now on Sam Howell the rookies auto NFC East that's out of 99 65 at 99 nice hits NFC East Drake London No, I know I know I was I was ready for I Think it's fun. I think it's fun. I feel I feel I feel cool though. I feel literally like it's cooler Sure aqua Trayvon Walker AFC South on the color match here to 199 Coins King Neptune for Halloween. There's a jazz Roquan Smith for the AFC North short print jazz Jeremy Rucker Oh, I like it. I'm telling you in like a week. I look like Dustin Padreau.  Yeah, it's very very very fresh I went down to like a two at first and I was like That's all my barber. I was like, no, let's let's keep going. Let's keep going Let's do it And then I obviously something like that you're always kind of thinking like what am I doing?  Yeah, okay It's 125 Danny Gray NFC West Silver circles I started with it to it went down to a one and then I had him like fade the sides of the sides a little bit shorter I didn't want just like a straight buzz to have it all even logos Jamar Chase legendary logos Get the beard super long thick now blue to 179 Alvin Camara for the NFC South and Hamilton Yeah, we need a big it. We know the gold vinyl. Yeah, I'm gonna have to put on sunscreen tomorrow On my head Sean's gonna actually do a mullet What I was thinking was short mohawk I'm gonna let it get to a certain length and just like do a short mohawk Like a chocolate Dell. That's what I'm gonna do Rated rookie aqua trail on Birks pretty much a Titans color match air AFC South to 299 Romeo dubs a skull it Yeah, holla reader keep trade-on walker AFC South how the house year rich how much would you pay Sean to do a skull it? People would think I'm insane. Yeah, you would have to wear a hat all the time literally all the time Reddorky orange Rashad white to 199 NFC South Alec Pierce Rocko has the best mohawk. Yeah, he does I Do I wouldn't mind doing a mohawk real quick. I Don't think Larissa would like would like a mohawk She's cool with this or like when I had my mullet a few years ago She's cool with that.  It was just like a little longer in the back I'm like the side for sure. It wasn't crazy 500 bucks. Oh man He turned it down he turned it down. No way my home's pink velocity nice card AFC West 45 of 79 Like that they added pink velocity this year to football howl rated rookie base How long would he have to have the skull it? I can't cut the lettuce like Damian Pierce Garrett Wilson I would I would do that for 500 bucks if I could physically grow a skull it like if I could do that Orange Buddha Baker to 199 NFC West Digs you got diamond hands DJ more NFC South 48 hours. That's not bad man 48 hours Two days takes two years to grow back purple warren moon Number 250 I'm single AMC South. Oh, yeah Yeah, I could do it I could just explain hey, yeah, I'm getting me This in return. They see that They don't already say that they do so even worse Yeah, hollow Bacelli AFC South All right, he's not gonna legendary logos NFC South Evans You got to do a hockey mullet though you got to do like the the T's like bangs Gets all like curly up front. Yeah silver circles to 125 JJ Watt NFC West That's right, brother. We got Shawnee. Oh, Lemieux. That's what we're gonna. Have kind of mullet. We need to see You got that right rich Kenneth Walker the third can't be looking like some crazy Raided rookie reds in 99 NFC North Kyler Gordon. I get that haircut of miles will pull out a couple teeth I do see what you're saying though shaving it would take I don't know if that's worth the 500 to grow it all back You know what I mean forever. Oh, here's a nice one Terequil and black Pantora rated rookie auto to 25 with the NFC West eight of 25 Pretty nice one. Um, that's a little scratch right there. We'll see if that comes off. I think that's a scratch though The NFC West great defender though. He was a steal in the draft He's a steal So there oh came off. Oh nice Nice hit NFC West. Oh, yeah, it came right off. That was a piece of dust actually Aqued at 299 St. Brown for the NFC North. I can do my own fade. Dang save some money mythical Jamar Chee saves you I'll let my barber though. I Go and hang out my barber for like half an hour every couple weeks Jamar Chase Plus you'll trim Jim from the beer and line it up if you know all that stuff Hollow Corey Davis AFC East halfway through Big pulls tonight rich. I'm gonna text you right now. I'll send you a photo right now Here's the big pole And there's another one That my homes is Jersey number two Rated rookie purple Kenneth Walker the third to 50 NFC West. There we go 7 to 50 So yeah, if you guys missed that we pulled a from flawless Franz Wagner rookie sponsor patch out a one-of-one There's a Disney logo patch Ready to work you hollow Tyrion Davis price for the NFC West Aqua Mike will AFC West to 299 You know why we pulled it news because Brad was in chat for the case Rated rookie blue to 179 Tyre Elam AFC East That's why we pulled it Damian Pierce Romeo Dobbs Although Tyler Boyd AFC North his values jumped up real big a little bit alike Post rookie season and then they're kind of like selling down again because of Palo diamond hands Jamar Chase Yeah, Rich. He was in chat Chat he shattered up for us for probably about 20 minutes or so. Yeah, ready to Riki Aqua epic It's a 299 for the NFC South We am off a rocket miles Garrett's short print AFC North Sam how flame emoji I Don't think I don't know if the flame emoji is in this. I haven't I don't know if it's in this one Jeremiah That's a retail thing then I'm not sure about the rarity of that as anyone know about the flame emoji Rated rookie orange to 199th Thornton for the AFC East To 99 the rookies auto Desmond Ritter Nice hit NFC South boss at a curse word. See that. Yeah, I I'm timing them out Pink velocity to 79 for net NFC South We need to spice this case up here. We've had some nice some nice cards It's been consistently solid, but we need some big ones Darius sleigh hollow Kenneth Walker the third The rookies Christian Watson So guys purcells are full tonight. We've got quite a few to do. We're also gonna finish probably half hour behind What we had purple Buddha Baker Number to 50 for the NFC West those Donner's baseballs were do those were Yeah, those were something. What's that red hot rookies Ritter sent me a photo All right, I'll check after the break Jeremiah I'll check the old IG awkward at 299 Mooney for the NFC North Taikwon Thornton Yeah, I don't know and it might be short print then I Do not know Sander seems to know more though All right y'all five boxes here But as I was gonna say there's more personal tomorrow after group breaks Kyle's live at 10 a.m. Eastern He's got Donner's baseball Beaumonticrum University basketball impeccable basketball and Donner's optic football So a lot of awesome breaks with Kyle during the daytime. They'll start seeing Kyle do more group breaks going forward now That we have four breakers Samus tomorrow evening with group breaks and personals Kyle is daytime this Sunday with personals lead series Ritter Breeze Hall Should be good. Then I'll be back Sunday evening with Sunday fun day group breaks hollow Brett Farr of NFC North Diamond hands NFC West DK. I think I think when rich said that he was reacting to the cards Yeah, seeing that Franz. Yeah, that'll do it orange red and rookie Daxon Hill AFC North strong Yeah, I do appreciate everybody. There's another flawless case tomorrow night. There's a dual case false eminence on Sunday night Monday breaks are listed. They're partially scheduled. I'll get the rest scheduled later on Yeah, good stuff ahead and then series two. I think is Wednesday top series two baseball is Wednesday Man, a lot of big rookie chases in that Devontae Smith purple to 50 NFC East. I think I would go. I think I would I think I go forks John Briggins. I think I go for Drew Brees not that like spoons are like way less important. I just envisioned my life personally be easier I use forks instead. Oh, it's 179 NFC south Come on case awkward at 299 John L way AFC West picket base Hollow rated rookie Eric is a conma AFC East Well, and I can steer the conversation any which way 65 Robert Woods AFC South Can't find one on eBay. Yeah, man. I don't know Sauce Gardner Took up four boxes. We saw the downtown coming as well Aqua Corey Davis at 299 AFC East Aqua to 299 Peyton Manning AFC South home hall home hall Desmond Ritter my forehead is almost the biggest Peyton Manning right now. I think getting there redemption Jameson Williams rated rookie RPS so on card redemption for the NFC North I believe all the RPS are to 150 or less as well. That's a nice one for sure for sure Aqua rated rookie NFC East Daniel Bellinger to 299 Stingley nice rookie King short print Malik Willis AFC South Hollow Breeze NFC South and a Bailey Zappie Walker Jermaine Johnson Sorry, it's not going so well Jeff Aqua to 299 Antonio Gibson for the NFC East. I don't control the randoms though. I'm sorry Diamond Hands AFC North Jamar Chase Blue to 179 Aaron Rodgers NFC North design a lot of it Traylon Berks I also don't control the cards Purple to 50 Eli Manning for the NFC East Hamilton Justin Herbert signature series. There we go. Nice one AFC West There we go. Herbert auto their AFC West pink velocity numbered to a 79 Jair Alexander NFC North Hello Devontae Smith NFC East Jamison Williams rated rookie Aqua to 299 Joe Mixon AFC North Kair Elam Grand Kingsbury Saul Jeremy Ruckert Hollow Dak Prescott NFC East some of your white White hot rookies Trayvon Walker Black Pandora AFC South Yeah, there you go. AFC South 17 to 25. I have not sander. I've only seen one per case Strictly so far orange to 199 miles Garrett AFC North Electricity rated rookie Drake London to 65 nice card NFC South 36 of 65 Hollow Jelani Woods AFC South rated rookie George Pickens red to 99 Jacoby Myers AFC East Jabbo London base and lime green Jailin Naylor rated rookie to 35 NFC North Okay. Well, we got three left here. I definitely want to see some grading come back I don't know if they will at this point pink velocity Crosby to 79 AFC West Drain Johnson the second hollow rated rookie Calvin Austin the third AFC North to 179 Daniel Jones NFC East blue color match Traylon Berks rated rookie Come on case rated rookie red Montreal Washington to 99 for the AFC West there Devin Lloyd flow Shaq Leonard AFC South Great Iron Kings rookie Chris Olava NFC South. That's what I was thinking. I thought he was still with the Eagles Aqua Mahomes to 299 for the AFC West Trayvon Walker orange to 199 Gabriel Davis AFC East Chris Olava Eric Izucan ma 8 of 49 on the RPA AFC East On the easy comma Evan Neil aqua Evan Ingram AFC South to 299 Brian Robinson Tom Brady Patriots black Pandora Super Bowl downtown four of 25 AFC East The goat That's why he's the MVP. That's why he's the goat Well, Houston theme right there. That's some space and UFO sander Congrats, buddy. That helps the case a lot right there. All right. We got it. We got to keep rolling with this Hollow Evan Ingram AFC South Hutchinson, you know, that's that's that's pretty big it Orange fire move to it's a 2199 AFC North. I Will say we have had some absolute freaking monster cards tonight Like truly monster cards Lighted up a lot of a Damian Pierce Silver circles Josh Allen AFC South to 125 Yeah, I think I think that's pretty much always how it's been so far gone that I've noticed so patch auto downtown Probably go probably a follow each other around It might be the easiest way for pretty to like make it like a case You know what I mean to keep it like a case something. That's actually a case. It's not just like an SSP Hollow Fred Warner NFC West Desmond Ritter NFC South rated rookie Orange to 199 NFC South Sam Darnold. Is he still in Carolina Darnold? I can see the backup there I'm at Smith. He goes somewhere else. I thought he went somewhere else Pink velocity NFC North rated Ricky Treson Ebbner to 79 so breeze Holland there Red the 99 Aaron Donald NFC West San Fran. Gotcha. I thought he went somewhere else What is he just like third string there for Darian Hathis to 50 rated Ricky pink velocity auto NFC East Well, yeah, I just see like third string there. I'm I guess He's like the back. I mean that with however San Francisco last year they needed all the quarterbacks So 299 AFC West Clyde Evans a lair aqua No idea Mason. I Do I do not talk to Adam. We're gonna keep blue to 179 Josh Pascal for the NFC North Can he pick it? Yeah, right? You would have loved the Brady Which probably a sleeve stream probably still in is probably asleep right now. Hello is Zeke NFC East White hot rookies Malik Willis AFC South sauce gardener rated rookie. No, I just I don't like I don't communicate with Adam If he's in shadow, I'd talk to him talk to everybody man. It's 125 silver circles the Sean Watson AFC North They me and Pierce Aqua rated rookie to 299 Andrew Boothe Jr. For the NFC North. I definitely wouldn't talk to Adam Schefter. I don't need him leaking all my All the details of what's going on with me. Great rookie. Hello. Lewis scene NFC North Orange rated rookie color Gordon to 199 for the NFC North and last box everybody. Good luck See another banger here Christian Watson Aqua Michael Thomas to 299 for the NFC South John Datsun on goal vinyl white hot rookies Can he pick it? AFC North can he pick a base? pink velocity AJ Terrell NFC South to 79 Shot white orange Jim Kelly to 199 AFC East Drake London 91 of 99 the rookies auto NFC South And I see South had a pretty solid break Ritter and a London auto. No, there's not really my hats right there. I just don't want to wear it all my fitted hats One like barely fits now Purple Matt Ryan number 250 AFC South. Yeah, like legitimately. I have a Patriots. You know how you buy a fitted hat. It's all the same size Nah, dude, my 73 eighths is my size The socks one fits great the magic one fits great for the Pat's on it's like loose heck man, like I'm like dang I don't know what to do with the hat now. I guess it's hang on to Something like that, yeah, hollow high Smith AFC North No, I don't play golf. I got I got a haircut is what happened The rookies Brock Hardy Crystal Lave Hollow Donald NFC South do we go to the national go to snacks, but where's my fittings? How's that Or am I from lids that usually works? Yeah, I'm always afraid because like obviously you can't find all the styles like a local lids Or something like that or like a what's the foot locker? What's the place called the locker? It's like a second version of variation of the Lugger Pollard of 299 for the NFC East Yeah, you gotta buy a line sometimes Yeah, man, I don't know they always just added blue trim. I'm part of that I'm like, yeah, no, I was thinking like that same tan with the blue would have been Fire aqua rated rookie tide Chandler for the NFC North Stop jogging appreciate it man. Red Rookie hollow V listown jr. NFC North Orange to 1.99 easy con McCuller match AFC East rated rookie Pink velocity Jamo NFC North nice card in the last pack here 66 of 79 and Pascal All right, I'll give me just a second. We'll do a recap The best case that Brady's mom is a monster, but overall not the best case. I'm sorry guys Do have one more tonight? I mean the breeze hall for the AFC East and the lime green to 35 Purple to three called. No, I don't Patrick is not as it not on the checklist There's an ice Lamar to 15 light it up rookie King short print Malik Willis London electricity did 65 a London auto to 99 the rookies vaderian mafis Eric he's economy RPA Herbert auto for the AFC West desert of the rookies Tariq woollen on the black Pandora rated rookie auto Sam howl the rookies Jeremy record pink velocity to 79 rated rookie auto Bob Lilly Louis scene refrigerator Perry Jamo rated rookie RPS redemption NFC north that should be the 150 I think on the base RPS, you know hollow Brock Purdy rated rookie ice lighted up Garrett Wilson a 15 AFC East and a black Pandora downtown Super Bowl AFC East of Tom Brady Yeah, that's so sick. Thank you very much everybody moving on to case number six


They send me to eat in the kitchen and eat well. To the First Unitarian Society of Madison. My name is Kelly Aspreuth Jackson. I'm one of the ministers here. Today I am joined by the worship team of Linda Warren, Drew Collins, Daniel Carnes, and our special musical guest, Jennifer Yancey. This morning we are also joined by sister Maureen McDonnell, here on behalf of Worker Justice Wisconsin. The vision of FUS is growing souls, connecting with one another, and embodying our UU values in our lives, our community, and our world. If you are visiting us today, welcome.  If you would like more information about First Unitarian Society, please stop by the welcome table that's located in the Commons just through those doors. We hope you will be able to stay and join us for coffee hour immediately after the service, which is also in the Commons. For those connecting with us virtually today, we are glad that you are with us as well, and we hope that you will be able to join us for our virtual coffee hour immediately following our service. The information for joining can be found on the homepage of our website, fusmadison.org. As well as on the slide that will be seen again after the post-loop. Our announcement slides will also be shown briefly after today's service, and we encourage you to take a moment to learn about upcoming programs and activities. And on that subject, I should note that this is the last Sunday of our summer schedule, which means that next weekend, we resume worshiping three times rather than once each weekend, once on Saturday at 4.30 p.m., twice on Sunday morning, once at 9, and once at 11, and our broadcast service moves from 10 to 11 next weekend as well. Next weekend is also our annual water communion service in which everyone is invited to bring with them some water to add to our common font, either literally or metaphorically drawn from any place that you feel you belong. So we hope to see you for that next weekend, and invite you to bring water if you remember to do so. And now I invite you to join me in a moment of silence to center ourselves and bring ourselves fully into this time as we join together once again in community. We enter this meeting house of kindness and comfort. May rough-worn hands and aching backs be healed. We enter this meeting house of hope for equality. May those who labor to survive live to know justice. We enter this meeting house of love and vocation. May our bonds of solidarity be strengthened. We enter this meeting house of courage and friendship. May we proceed hand in hand toward freedom. Now friends, I invite you to rise in body and or spirit and join me in the words for the lighting of our chalice. In recognition of Labor Day, we light this flame to honor all work, including the work of our hands and our backs in gratitude for all the labors that support our world and for all those who boldly continue the work of justice, equity, and peace. Rise up, O flay. Please join us in singing together him 357, bright morning stars. It is so nice to be here with you on this Sunday morning to speak about work, workers, and the relationship of all of that to us. A big thanks to your co-ministers, Kelly, the Kelly-powered ones. I'm calling them Kelly-powered. I understand Kelly Crocker is not here today in person, but I know she's been here a long time and I've known her over the years. So I thank you for welcoming me on this Labor Day weekend to speak. I am Maureen MacDonald. I'm a Catholic Dominican sister of Cincinnati, of the Edgewood variety, I always say. That always speaks to Madison area people. I'm an alum of Edgewood College and I worked there for 21 years in campus ministry, which was the culminating experience of 30 years of working on four different campuses in campus ministry in Pennsylvania, Wyoming, and Wisconsin. My other work experience was as a middle school and high school teacher for 11 years, very early in my adult life, when I really hardly knew how to teach. But I did it and learned a lot. I come to you as a former board member and present volunteer for Worker Justice Wisconsin. We have had the practice for many years in worker justice of a practice called Labor in the Pulpit, through which we offer to speak in various faith congregations about the connection between our faith and justice for workers. So the mission of Worker Justice Wisconsin is to be a Madison based nonprofit organization that builds collective worker power, collective worker power, together with faith and labor allies. And of course we are looking to all of you and many others in the surrounding faith communities to be faith allies of workers with us. We know that we never do anything alone, do we? In our closing song today, we are going to be singing the phrase singly none over and over and I thought that is so appropriate for what we're talking about today. And I thank Reverend Kelly for all the work that obviously and thought that goes into the planning of these Sunday services. There are many references to work in today's service. So the centerpiece of Worker Justice Wisconsin is our Worker Justice Center and that is located in the labor temple on South Park Street. Many of you know where that building is I'm sure. This is where non-unionized and mostly Latinx and immigrant workers come when they face workplace injustices like wage theft, which unfortunately is a huge problem in Madison, Dane County, all over the world actually unfortunately. Wage theft, poor working conditions, loss of benefits and discrimination, often discrimination based on racism and xenophobia. This fact sheet that is available for you out in the area outside the worship space gives you a lot of information, current information about worker justice issues. So I invite you to pick one up before you leave. I'd like to share a few words about what motivates me from my faith perspective. Of course the Judeo-Christian scriptures teach us you shall not steal. And Jesus often urges us to treat others fairly and justly. Then the social teaching of the Catholic Church emphasizes what is due to all people because of the basic human dignity with which God created all of us. And of course not only the Catholic Church but many many others espouse the dignity of all humans. This includes dignified labor, good working conditions, and fair compensation. Clearly workers have priority over profit and good work is essential for the ongoing development of the world and it helps transform all of us humans into fuller, better human beings. We have a tradition in the Catholic Church of over 130 years of strong statements from church leaders promoting things like the right to form unions and to engage in collective bargaining and the benefits that go with those two things. These are far deeper than political rights. They are moral rights and human rights. As a result, I believe that if we support restaurants, manufacturers, or retailers who participate in wage theft or any injustices toward workers, we are also stealing. That's a hard thing to accept for myself but I do believe that's true. So we need to do our best to find out who fails to be just to their employees and use our purchasing power strategically to speak up about injustices that we become aware of. So our purchasing power really is a power that all of us have. We can decide consciously where we're going to spend our money. So for instance, if we put priority on buying fair trade, food, clothing, and other products, we can be fairly sure that we are supporting companies who have just business practices. I'd like to leave you with two pieces of good news that encourage all of us. First, over $111,700. $111,700 in previously old but unpaid wages have been recovered for workers in 2021 with the help of Worker Justice Wisconsin. Thank you. And we know that that money means a lot to workers and their families and that is largely due to the staff that is in the Worker Justice Wisconsin office daily to help workers who come. Often without appointments, I mean it's just walk in, state what you need, and see what kind of help can be given there. And the second is a success story that I really love. It has come about for eight courageous immigrant workers at a company in Manona, just east of Madison, of course. Evidently, the owner and boss of that company engaged in wage theft and poor working conditions like dirty bathrooms, dirty kitchen, and 90 degree heat that the workers have to work in right now. So the workers decided with great courage that they were going to create a petition to present to the boss asking for common sense improvements in their work situation. Well, he got very angry not only to the workers but to the worker justice staff when they called to ask about the situation. So he got angry and he said that he was going to put the workers on unpaid leave to retaliate for their engagement in this collective activity of a petition. The workers then came to Worker Justice Wisconsin to ask for help including they asked that we participate with them in a picket line in front of the business. And I know Reverend Kelly was a part of that picket line. As a result of that, this past Thursday an agent for the federal agency, the NLRB, the National Labor Relations Board ordered the owner to reinstate all workers and improve their working conditions as requested in the petition. Now, yeah, such a great example of what community gathering together can do to create good. Of course, hardly any of these improvements have been made yet. I mean, this really just happened a few days ago. But the workers did return to work last Friday and this has been reported in at least two newspaper articles in the Madison area. So the public now knows about this situation. And Worker Justice is continuing to work with the workers so that the owner must follow through on what the workers have said that they need. So when we ask the question, what can we do about this? I think we ordinary people sometimes feel helpless, right? But there are really many responses that we can make, including our own purchasing decisions. We have power because of our purchasing decisions. And we need to use that intentionally. A few other things that are available to us, ordinary citizens, are things like sharing the resources available from Worker Justice Wisconsin. There's a wonderful website that has a lot of resources on it and this sheet that I just mentioned to you. That can be, perhaps you want to take two or three copies of that sheet and share it with other people. A second thing that we can do is host worker trainings in faith communities. So first Unitarian could call Worker Justice Wisconsin and arrange to have worker trainings so that people know their rights, especially immigrant persons for whom English is not their first language and for whom they really need help interpreting the standards and the things that they can legitimately ask for. So worker trainings. A third thing is attending workers' actions like pickets. And a fourth thing is donating to the Worker Solidarity Fund.  Please designate it for the Worker Solidarity Fund. So it will go towards that. I learned just a few days ago that over $5,000 was donated to this fund last week, just last week, by a variety of people and organizations. And all except $900 of that has already been paid out to workers to assist them, especially with unpaid rent and with daily needs like food because they literally had no money and some have not been paid for a number of weeks, unfortunately. So all of this builds toward the common good in a reading that you will hear later in this service by Philip Levine. The common good is a common theme and it's a very important one for the human community, of course. So the bottom line is that economy must serve people, not the other way around. The economy is meant to serve the people. This is our goal in worker justice and I'm sure it's the goal of many of you also. We know that this can involve risking some comfort and it can involve pushback from people who may not agree with us. But small risks add up to collective actions and can lead to important social change. I'd like to repeat that last sentence. Small risks that people like us can take add up to collective actions that can lead to important social change. So I also wanted to mention and I told Reverend Kelly that this sheet will be out in case any of you wish to sign up on it to be in solidarity with the apparel workers, the eight persons whom I just told you about who are dealing with a difficult situation. So you can put your name and contact information on that sheet if you wish. So thank you so much for hosting me here and for listening so attentively today. And I ask for God's blessing as each of us lives as well as we can and does the best we can for ourselves and for the human community and for Earth. Thank you. I now invite you into the giving and receiving of today's offering. We give freely and generously to this offering which today goes to benefit worker justice Wisconsin and specifically their worker solidarity fund. As you just heard very well and much better than I could put it, WJW empowers workers to stand up for their rights and brings faith, labor and other community allies together to fight for a just and living wage for all, paid time off for all, workplaces free from all forms of discrimination and harassment, opportunities for collective organizing without fear of retaliation and a healthy work-life balance for all people, regardless of race, gender, national origin, immigration status or creed. You will see on the screen that you can donate directly from our website at fusmattison.org and you will find our text to give information there as well. In addition, there are baskets at the exits to the auditorium where cash and checks can be placed as well. We thank you for your generosity and your faith in this light that we create together with our partners who may be with our partners here and abroad. Thank you. We'll mention this earlier, but this week I had the honor of visiting some workers on a picket line who were protesting unfair and I would say just straight up unsafe conditions in their workplace in Manona as well as some issues with back pay. And it made me think about a story from the Hebrew Bible. The story comes from the Book of Genesis which is the first book in the Hebrew Bible. It's about Jacob. Jacob was the grandson of Abraham, the son of Isaac. He was, he's remembered as being one of the patriarchs of the people of Israel. In fact, in a later section of the story we won't get to today, Jacob's name gets changed to Israel. That's why they're called the people Israel. So, Jacob, he got into a legal dispute with his twin brother Esau about their father's inheritance after their father had passed away and he decided that he needed to leave, right? Sort of that situation where you get into a bad enough fight with your family that you have to leave town. Well, that's what happened to Jacob. So he went east for a while. I don't think about this very often but technically that makes him an immigrant in this part of the story just like those folks in Manona. And so he came to another place and he met a man named Laban and Laban hired him to work for him tending to his flocks of goats and sheep. Now, Jacob and Laban came to an agreement as to what he would be paid for his time. He said, I will work for you for seven years and in return I want to be allowed to marry your daughter Rachel. Now, we should absolutely interrogate the idea that a human being is an acceptable wage for work. No, that's not all right. But within the context of the story we have to understand that that was the agreement that they had made, that Jacob would work for Laban for seven years and at the end of those seven years he would be allowed to marry Rachel. Well, you see, Laban had another daughter, an older daughter named Leah and my heart always breaks for Leah in this story just over and over again. She has a real... I mean, a lot of people in this story have a real rough time of it but she has a real rough time of it because at the end of those seven years Laban seemed to do, as they had agreed he allowed Jacob to marry one of his daughters but secretly he swapped places so that Jacob ended up marrying Leah instead of Rachel. Now Laban, of course, was all ready to say, it's okay. We can still work this out. You just worked for me another seven years and you can marry Rachel too, again. This is not a good model of what a fair and equitable system for payment for labor is or ought to be. So Jacob agreed and whoa, whoa, whoa, whoa on to Leah who's just again and again reminded in this story that she's at best a second choice. But Jacob worked another seven years tending to those flocks, the sheep and the goats and Laban's wealth prospered enormously for all of Jacob's work so that at the end of the next seven years 14 years he's been working for this man now he has two wives, a family that he needs to take care of and he realizes he has no material possessions to show for it, right? Jacob's done a lot of work he's been paid according to the agreements that he made at least I mean there was some swapping around there but he doesn't have the means to support a family so he says I need to go make my own way in the world and Laban essentially says can we make another deal? Can we find a way for you to keep working for me? What do you want? Ask me for anything and Jacob says alright, okay so you have many flocks of sheep and of goats and they are all different colors I will take from you only those that are dark or speckled all the ones with plain white coats they will all stay with you but I'll take the darker the speckled ones it's implied that they are somehow less desirable again there's all kinds of things we could debate and explore about why the darker the speckled sheep and goats are less desirable than those with white hues but the point is he says I'll take these off of your hands basically and that will be my payment to work for you for another six years apparently a whole bunch of sheeps and goats not quite worth one human being alright okay I mean that's better I guess but anyway they make this agreement yet another agreement between them the bond has the time to go through all the sheep and all the goats and take all those with dark or speckled hues and take them wayyyyyyyyyyyyyyyyyyyyyyyyyy over there where Jacob won't be able to find them so that when he goes through the sheep and the goats they're all white nothing for him to have have. But, and here's where we get into a little bit of rudimentary science that you didn't know that was in Genesis, right? There's a whole extended story that I'm not going to trouble you with because I'm not totally sure that I get all the details and as far as I know it doesn't actually work. But Jacob sets up an elaborate plan involving where and when and in the presence of what the sheep and the goats are mating so that all of these white-hued perfectly plain white sheep and goats will end up having offspring that are speckled or dark. And as a result of that for years and years, the next six years that he's working for Leban, all of the kids, that's the name for a child goat, right? All the kids, all the all the cats, everything that is born to Leban is dark or speckled. And so all of those animals accrue to Jacob. So finally, finally, we reach the end of that six-year term, 20 years now, 20 years. Jacob has been working for Leban. He has two wives, several children. We didn't get to that part, but it happened. Several children and a whole mess of sheep and goats. And he says, I am done. I am not going to work for you anymore, Leban. And Leban realizes that all of his wealth is the result of Jacob's hard work and he doesn't want to let him go. And so when Jacob leaves in the middle of the night and Leban realizes that he's going to be out this great source of income, he chases after him. And they sort of do this little dance, right? Jacob pulls ahead, Leban follows behind.  What's going to happen? He's going to try to drag him back east under force of arms. Maybe, maybe. But Jacob says to Leban, when they finally meet face to face, he says, I worked for you for 20 years. Again and again, you changed the terms under which I was to be paid. I was burned by the heat. I was frozen by the cold. I toiled for you long hours, gaining nothing for myself. Now I am my own. I will make my own way in the world. And so Leban and Jacob set up a pillar. This is what it says in the story. So they set up a pillar of stones to mark an agreement between themselves that Leban would stay on one side to the east and Jacob would stay on the other side to the west of this pillar of stones. And there was no National Labor Relations Board in those days, but it essentially is a labor contract saying that now our debts are resolved. I no longer work for you. You no longer have claim over me. I will take what is mine. You will take what is yours. And we will part ways. I understand that the stories from a very long time ago, 3,000 years or more, may not necessarily feel like they are deeply applicable to our time and our place. And again, I cannot reiterate enough, a human being is not just payment for any amount of work. But, but, in this ancient story, I find a thread that connects even all the way to our present modern period. That people who travel from one place to another, immigrants from one land to another, are often exploited by those with material means in the place where they arrive. That it is tragically common, tragically common, for employers seeking to exploit their workers to change the terms of their service arbitrarily to benefit the employer and to the detriment of the worker. And ultimately, workers taking charge of their own lives, demanding what they are owed and choosing to sever their connection with an employer when it is necessary for them to do so. That is the means by which justice is to be attained. No other way that I know. Body or spirit to join us for him, number 128. One of the great poets, the great city of Detroit. I invite you to move into the poem with me to try to occupy the space of it. Imagine yourself into a life you have not actually lived. We stand in the rain in a long line waiting at Ford Highland Park for work. You know what work is. If you're old enough to read, you know what work is, although you may not do it. Forget you. This is about waiting, shifting from one foot to another, feeling the light rain falling like mist into your hair, blurring your vision until you think you see your own brother ahead of you maybe 10 places. You rub your glasses with your fingers and, of course, it's someone else's brother narrower across the shoulders than yours, but with the same sad slouch, the grin that does not hide the stubbornness, the sad refusal to give in to rain, to the hours of wasted waiting, to the knowledge that somewhere ahead a man is waiting who will say, no, we're not hiring today for any reason he wants. You love your brother. Now suddenly you can hardly stand the love flooding you for your brother who's not beside you or behind or ahead because he's home trying to sleep off a miserable night shift at Cadillac so he can get up before noon to study his German works eight hours a night so he can sing Wagner the opera you hate most the worst music ever invented how long has it been since you told him you loved him held his wide shoulders opened your eyes wide and said those words and maybe kissed his cheek you've never done something so simple so obvious not because you're too young or too dumb not because you're jealous or even mean or incapable of crying in the presence of another man no just because you don't know what work is a place and a time where we can share the celebrations and sorrows of our days today we light a candle at the request of one of our members expressing their joyful welcome to zan hendrick molly back and christy christie spread the three newest members of our f us staff team we also light a candle of solace for those who are in morning those who are alone and lonely and those struggling with addiction both those of others and their own we light a candle in solidarity with the people of ukraine both in their suffering and in their struggles together we yearn for peace for them and for all people and for an end to all wars of conquest anywhere and everywhere on earth and finally we light one last candle for all the joys and all the sorrows that live within the sanctuaries of our hearts may they each be held gently in gratitude in love and in hope blessed be and amen longest march we will sing this hymn two times the information sheet that sister mo talked about as well as the sign-up sheet for more information and deeper connection with worker justice wisconsin all straight out that door right in front of me just across the way near the stairway up to the ground level if you're interested in any of that and now these words of benediction from martha curby capo our time together is finished but our work is not yet done may our spirits be renewed in our purpose resolved as we meet the challenges of the week to come the chalice flame is or will be extinguished until once again ignited by the strength of our communion go now in peace amen blessed be and please be at rest for the post work together children don't you get weary walk together children don't you get weary walk together children don't you get weary there's a great camp meeting in the promised land oh walk together children don't you get to gather children don't you get weary walk together children Don't gather children, don't you get weary? Shout together, children, don't you get...